2009-05-01 5 views
36

Ich muss eine Binärdatei verteilen, die auf so vielen x86-Linux-Distributionen wie möglich ausgeführt wird. Das bedeutet, dass ich einige Bibliotheken wie glibc statisch verknüpfen muss, da der Benutzer möglicherweise nicht die Version verwendet, die ich verwende. Andere Bibliotheken müssen wie fontconfig dynamisch verknüpft werden, da sie auf einem Cachedateiformat und fest codierten Speicherorten basieren, die sich auf jedem System unterscheiden können.Verwenden Sie sowohl statische als auch dynamisch verknüpfte Bibliotheken in gcc

Was sind die Befehlszeilenoptionen, um dies zu tun? Wenn ich -static spezifiziere, wird gcc es ablehnen, irgendwelche Bibliotheken dynamisch zu verknüpfen.

Antwort

68

Statische Verknüpfung mit jeder Systembibliothek, und speziell gegen libc, auf modernen UNIX oder Linux-Systemen macht die binäre weniger Portable. Tu es einfach nicht.

Verwenden Sie stattdessen die Abwärtskompatibilität (Binärdateien, die auf einem älteren System verknüpft sind, auf allen neueren) zu Ihrem Vorteil, entweder durch Verknüpfen Ihrer Binärdatei auf einem alten System (ich verwende RedHat 6.2 und ich habe kein Linux gesehen System, in dem meine Binärdatei in den letzten 8 Jahren nicht ausgeführt wird) oder mit etwas wie autopackage.

Ihre ursprüngliche Frage zu beantworten:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic 

verursacht Linker Archivversion von libfoo zu verwenden. [Es ist wichtig, die genau zu haben, damit Sie statische libc nicht erzwingen.]

+6

Zum ersten Mal habe ich eine Erklärung für diese nachlaufende Dynamik gesehen, Prost –

2

Versuchen Sie, die Pfade zu den Bibliotheksdateien, auf die Sie verlinken, in der Linker-Befehlszeile (seien es .a oder .so-Bibliotheken) und drop -static zu übergeben. Das sollte den Trick machen.

+0

Wenn es kein '-static' gibt, gibt es auch' -l: 'Option von ld, die verwendet werden kann, um eine Bibliothek mit vollem Namen zu verknüpfen, ohne ld auf' lib + name + .so': 'zu erweitern -l: libsome_library.a' (https://sourceware.org/binutils/docs-2.18/ld/Options.html - '-lnamespec' Wenn namespec die Form: Dateiname hat, durchsucht ld den Bibliothekspfad nach einem Datei heißt Dateiname, sonst wird es den Bibliothekspfad nach einer Datei namens libnamespec.a durchsuchen. ") – osgx

3

Es sollte beachtet werden, dass Sie unter Linux eine Bibliothek nur statisch (sicher) verknüpfen können, wenn keine der dynamischen Bibliotheken davon abhängt darauf. Dies bedeutet, dass Sie, wenn Sie überhaupt dynamische Bibliotheken verwenden, vergessen können, libc statisch zu verbinden. Benutze einfach eine ziemlich alte Version, um gegen den Fall von libc zu agieren. Die libc hat über die Jahre hinweg eine starke ABI-Rückwärtskompatibilität beibehalten.