2013-04-27 8 views
5

Ich versuche mein Programm statisch mit glibc zu verknüpfen, weil die Version der glibc auf dem Zielrechner ziemlich unberechenbar ist. Ich benutzte linker Flags -static-libgcc und -static-libstdC++ und es funktionierte gut. Die ausführbare Datei ist groß, aber ich kann damit leben. Leider, wenn ich meine ausführbare Datei auf dem Zielcomputer ausgeführt wird (wird der Name ‚mytest‘ im Beispiel unten) bekomme ich folgende Fehlermeldung:Das Programm kann die korrekte Version von glibc/libstdC++ nicht finden, obwohl es statisch verlinkt war

./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by libboost_log.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_log.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_log.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_date_time.so.1.53.0) 
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_thread.so.1.53.0) 

Wenn ich ‚Strings‘ tue auf mytest, es gibt mir

$ strings mytest | grep GLIBC 
GLIBC_2.9 
GLIBC_2.7 
GLIBC_2.8 
GLIBC_2.3.2 
GLIBC_2.2.5 
GLIBCXX_3.4.15 
GLIBCXX_3.4.11 
GLIBCXX_3.4.14 
GLIBCXX_3.4.9 
GLIBCXX_3.4 

Was bedeutet, denke ich, dass die statische Verknüpfung in Ordnung war. Warum versucht der Loader nach meinen Funktionen in shared glibc und libstdC++ zu suchen? Was mache ich falsch?

Danke!

Antwort

5

I am trying to link my program statically with glibc, because version of the glibc on the target machine is pretty much unpredictable. I used linker flags -static-libgcc and -static-libstdc++ and it worked fine.

Das ist nicht die Version von glibc (libc) beeinflußte, die verschiedenen von libgcc und libstdc++ ist. Mit diesen Flags haben Sie weiterhin eine dynamisch verknüpfte ausführbare Datei erstellt, die erwartet, um nicht auf einer älteren Verteilung zu arbeiten.

Sie können Ihre ausführbare Datei mit -static Flag verknüpfen, und das sollte Ihnen eine vollständig statische ausführbare Datei geben.

Update:

Nach der erneuten Lektüre Ihrer Frage; Ihr Problem ist nicht mit glibc. Ihr Problem ist, dass Sie mit libboost_log.so verknüpfen, die wiederum von libstdc++.so.6 abhängt.

Die Antwort ist dann, mit libboost*.a statt libboost*.so zu verbinden. Sie können versuchen, es auf diese Weise zu erreichen:

g++ $(OBJS) -static-libgcc -static-libstdc++ -Wl,-Bstatic -lboost_log ... \ 
    -Wl,-Bdynamic 

(Es ist sehr wichtig, die Hinter -Wl,-Bdynamic zu haben.)

+0

Vielen Dank. Leider kann ich nicht alles statisch verknüpfen, weil dann meine Pthread-Bibliothek nicht funktioniert. Aus welchem ​​Grund auch immer, es funktioniert nur, wenn es dynamisch verbunden ist. – svetlana

+0

@svetlana 'libpthread' ist Teil von glibc.Wenn Sie es nicht statisch verknüpfen können, dann können Sie keine vollständig statische ausführbare Datei haben, und das bedeutet, dass Ihre ausführbare Datei * nie * auf einem älteren System funktioniert (das wird nicht unterstützt). Statisches Linken * funktioniert * im Allgemeinen für Multithread-Programme, also müssen Sie entweder herausfinden, warum es für Ihren speziellen Fall nicht funktioniert, oder die ganze Idee aufgeben. –

+0

@svetlana Antwort aktualisiert. –

1

Die Verknüpfung mit -static-libgcc und -static-libstdc++ funktioniert nur für diese Bibliotheken. Es sieht so aus, als ob Sie auch gegen die Boost-Bibliotheken (wahrscheinlich dynamisch) verlinken, die dann gegen libgcc und libstdC++ verlinken.

Versuchen Sie, die folgenden:

ldd mytest 

Es zeigen sollte "kein dynamisches ausführbar". Wenn es etwas anderes anzeigt, bedeutet dies, dass es dynamisch mit anderen Bibliotheken verknüpft ist. Es funktioniert nicht immer so einfach, aber versuchen Sie -static zu der Kompilierungszeile hinzuzufügen, um sich um die verbleibenden Bibliotheken zu kümmern.

+0

Alec, zeigt es ‚keine dynamische ausführbare Datei‘. Ich fühle mich seltsamer und seltsamer ... – svetlana

Verwandte Themen