Extreme Linking

20/02/2015 - 16:56 von Edzard Egberts | Report spam
Damit ein Linux-Binary auf möglichst vielen Systemen laufen kann,
versuche ich mich gerade dran, so viele Abhàngigkeiten wie möglich
statisch in ein Programm zu linken. libgcc, libstdc++, libpng, libjpeg
usw. ließen sich problemlos reinstopfen, da davon ".a"-Dateien vorhanden
sind. Ein ganzer Stapel Abhàngigkeiten bleibt aber außen vor, weil davon
nur ".so"-Dateien vorhanden sind:

linux-vdso.so.1 => (0x00007fff5efff000)
libexif.so.12 => /usr/lib64/libexif.so.12 (0x0000003607000000)
libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x00000035fd400000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000035f8400000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x00000035fa800000)
libXpm.so.4 => /usr/lib64/libXpm.so.4 (0x0000003605400000)
libz.so.1 => /lib64/libz.so.1 (0x00000035f8c00000)
libXext.so.6 => /usr/lib64/libXext.so.6 (0x00000035fc000000)
libXft.so.2 => /usr/lib64/libXft.so.2 (0x0000003606c00000)
libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00000035fc800000)
libm.so.6 => /lib64/libm.so.6 (0x00000035f7c00000)
libc.so.6 => /lib64/libc.so.6 (0x00000035f7800000)
/lib64/ld-linux-x86-64.so.2 (0x00000035f7400000)
libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00000035fb000000)
libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00000035fbc00000)
libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00000035fd000000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00000035fb800000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x00000035fac00000)

Gibt es irgend einen Trick, die auch noch in das Binary zu stopfen?
Irgend einen Wrapper?

Ich könnte das ganze Zeug natürlich in ein Verzeichnis kopieren und das
vor Programmstart mit LD_LIBRARY_PATH angeben (oder gleich in das
Verzeichnis mit dem Programm), frage mich aber, ob das nicht noch
kompakter geht...

BTW - wofür sind eigentlich die Hexzahlen in den Klammern oben im
ldd-Listing? Sieht wie Einsprung-Vektoren aus - die Position von der aus
das Programm die entsprechenden libs aufruft?
 

Lesen sie die antworten

#1 Thomas Jahns
20/02/2015 - 17:33 | Warnen spam
On 02/20/15 16:56, Edzard Egberts wrote:
Damit ein Linux-Binary auf möglichst vielen Systemen laufen kann,
versuche ich mich gerade dran, so viele Abhàngigkeiten wie möglich
statisch in ein Programm zu linken. libgcc, libstdc++, libpng, libjpeg
usw. ließen sich problemlos reinstopfen, da davon ".a"-Dateien vorhanden
sind. Ein ganzer Stapel Abhàngigkeiten bleibt aber außen vor, weil davon
nur ".so"-Dateien vorhanden sind:

linux-vdso.so.1 => (0x00007fff5efff000)
libexif.so.12 => /usr/lib64/libexif.so.12 (0x0000003607000000)
libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x00000035fd400000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000035f8400000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x00000035fa800000)
libXpm.so.4 => /usr/lib64/libXpm.so.4 (0x0000003605400000)
libz.so.1 => /lib64/libz.so.1 (0x00000035f8c00000)
libXext.so.6 => /usr/lib64/libXext.so.6 (0x00000035fc000000)
libXft.so.2 => /usr/lib64/libXft.so.2 (0x0000003606c00000)
libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00000035fc800000)
libm.so.6 => /lib64/libm.so.6 (0x00000035f7c00000)
libc.so.6 => /lib64/libc.so.6 (0x00000035f7800000)
/lib64/ld-linux-x86-64.so.2 (0x00000035f7400000)
libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00000035fb000000)
libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00000035fbc00000)
libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00000035fd000000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00000035fb800000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x00000035fac00000)

Gibt es irgend einen Trick, die auch noch in das Binary zu stopfen?
Irgend einen Wrapper?



Zu X11 gibt es vielleicht noch ein Paket mit den statischen Libraries. Empfehlen
würde ich das nicht, weil X11 von mehr als dem Library-Code abhàngt
(Konfiguration von fontconfig etc).

Damit wird Dein Binary eigentlich nicht weniger abhàngig, sondern làuft nur noch
auf Systemen, die genau zum Build-System passen. Für libc funktioniert
statisches Linken wegen der per dlopen geladenen plugins von nsswitch gar nicht
und ist unter keinen Umstànden zu empfehlen.

Für libexif, libexpat und libm sollten sich hingegen statische Libraries finden
lassen, hàngt halt vom Linux ab, in welchen Paketen die stecken.

Ich könnte das ganze Zeug natürlich in ein Verzeichnis kopieren und das
vor Programmstart mit LD_LIBRARY_PATH angeben (oder gleich in das
Verzeichnis mit dem Programm), frage mich aber, ob das nicht noch
kompakter geht...



Wenn man so etwas wie -Wl,-rpath,\$ORIGIN/../lib beim Linken angibt müssen die
libraries nicht in das gleiche Verzeichnis wie das Binary und werden trotzdem
ohne LD_LIBRARY_PATH gefunden. Ich bin ein Freund von dynamischen Libraries weil
man dann evtl. noch eine Chance hat, Teile auszutauschen und das eigentliche
Programm wieder zum Laufen zu bekommen und auch feststellen kann, woraus es
zusammengesetzt wird.

Thomas

Ähnliche fragen