soname referencia felülírása

 ( asch | 2015. június 30., kedd - 14:24 )

Van egy a programom által hivatkozott library, aminek a soname mezője major és minor verziót is megad. Emiatt a fordított programom csak akkor működik, ha ugyanaz a minor verzió van fenn az adott gépen, mint amivel én a programot fordítottam. Viszont elvileg is, és tesztek alapján is a minor verziótól függetlenül működik a programom, ezért szeretném, ha nem kellene két külön binárist szállítanom a két oprendszer verzióra. Tehát ki kellene ütni a függőségből a minor verziót.

Konkrétan:

gcc -lfoo ...

Eredményeképpen a függőség (ldd-vel kiiratva) "libfoo.1.1" lesz. Utánaolvastam, azért lesz az, mert a libfoo.so-n belül a soname mezőben ez van megadva. Meg is lehet nézni, a A "readelf -a -W /path/to/libfoo.so.1.1" kimenete:
0x000000000000000e (SONAME) Library soname: [libfoo.so.1.1]

Amit el szeretnék érni:
* Az általam fordított bináris (shared object-et fordítok) "libfoo.1"-re hivatkozzon "libfoo.1.1" helyett
* ne kelljen az eredeti befüggött so-t módosítani a fordításhoz sem

Két lehetőséget tudok elképzelni:
* a gcc-nek meg lehetne adni kapcsolóként fordításkor - nem találtam ilyen opciót sehol eddig
* az so fájlt meg lehetne piszkálni, úgy hogy a függőség bejegyzést felülírom

Tud valaki valami megoldást a problémára?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

-- oops, tevesen ertelmeztem a kerdest --

Ezzel az általam fordított lib soname mezőjét lehet módosítani. Tehát ha újrafordítanám a libfoo-t, akkor el tudnám érni, hogy ebben a soname mező értéke "libfoo.1.1" helyett "libfoo.1" legyen. Ez megoldás lenne, de el szeretném kerülni hogy a libfoo-t újra kelljen fordítanom a saját modulom fordítása érdekében.

Igen, igen. Kozben rajottem, hogy forditott a kerdes :-)

Ezzel is futhatsz egy kort:
http://nixos.org/patchelf.html
https://github.com/NixOS/patchelf

replace-needed opcio megfelelo lesz neked.

Hat, egy Zs tervet tudok adni: szallitasz a moduloddal egy libfoo.so.1.1 -et, es LD_LIBRARY_PATH -tal elore huzod a betoltesi listaban. Ha maskepp nem tudsz belenyulni a fuggosegbe, ez egy megoldas lehet.
--
Blog | @hron84
Üzemeltető macik

LD_LIBRARY_PATH se kell, -rpath es $ORIGIN ...

Az internet ezt írja:


Instead of using "-lcurl" use "-l:libcurl.so.3" And ofcourse also use "-L _installed_path_"

Forrás,
Itt ugyanaz

Fuszenecker Róbert

Köszi! Ez ígéretes, holnap kipróbálom. Nekem nem jött össze a megfelelő keresőkulcs. Még a gcc manualt is olvastam pedig, és ott sincs erről szó.

Igen, időnként nem egyszerű jó kifejezést beírni a keresőbe, főleg, ha az ember nem is tudja pontosan, mit kellene megtalálnia.
Én ezt próbáltam: "gcc specify library version", és jó eredményeket dobott ki. De ezt csak azért tudom, mert megjegyezte a browser.

Fuszenecker Róbert

esetleg: -lcurl helyett /path/to/libcurl.so.3

.

Mindenképp a libfoo.so szerzőjét kellene megkérdezni, hogy hogy van ez.
(persze kellő udvariassággal).

Lehet például, hogy nála az '1.1' a major, és nincs minor. Vagy nem ismeri jól a libtool-t (ez most rossz példa volt, mert a libtool major.minor1.minor2 alakú verziószámokat erőltet).