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!
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
@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. –
@svetlana Antwort aktualisiert. –