2016-05-31 12 views
1

Ich habe Probleme mit einem meiner Projekte. Es scheint, dass ich zu einer Bibliothek verlinke, die Pthread-Symbole benötigt, aber die Bibliothek selbst ist nicht mit Pthread verbunden. Die Symptome sind, dass das Programm segregiert, wenn ich versuche, es auszuführen. Ich lief:Verknüpfung mit Pthread erzwingen mit G ++

und fand es segfaults bei der Suche nach Pthread_create. Das Programm läuft, wenn ich Vorspannung von pthread erzwingen mit diesem Befehl:

LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0 ./my_program 

Um dieses Problem zu lösen, ich dachte, ich würde nur my_program verbinden mit pthread im Build-Skript -lpthread. Das hat nicht funktioniert, also habe ich versucht - pthread. Hat auch nicht funktioniert. Ich konnte dies mit dem bloßen minimal reproduzieren:

echo "int main() { return 0; }" | g++ -x c++ - -pthread -lpthread -o my_program && ldd my_program 
linux-vdso.so.1 => (0x00007ffe4fd08000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f150ca5c000) 
/lib64/ld-linux-x86-64.so.2 (0x000055ac8c275000) 

Wie Sie aus der Ausgabe von ldd sehen können, ist my_program nicht mit pthread verknüpft. Ich vermutete, dass dies passiert, weil g ++ versteht, dass ich tatsächlich keine Symbole von pthread verwende und nicht mit ihm verlinke. Also habe ich versucht, einen Anruf Hinzufügen pthread_create:

echo -e "#include <pthread.h>\n int main() { pthread_create(0,0,0,0); return 0; }" | g++ -x c++ - -pthread -o my_program && ldd my_program 
<stdin>: In function ‘int main()’: 
<stdin>:2:37: warning: null argument where non-null required (argument 1) [-Wnonnull] 
<stdin>:2:37: warning: null argument where non-null required (argument 3) [-Wnonnull] 
linux-vdso.so.1 => (0x00007ffd977f9000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fafe1bb6000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fafe17f1000) 
/lib64/ld-linux-x86-64.so.2 (0x0000563ee0002000) 

Bitte ignorieren die Warnungen, weiß ich den Anruf pthread_create Schein ist. Der Punkt ist, dass es jetzt tatsächlich mit Pthread verknüpft ist.

Also meine Frage ist: Gibt es sowieso, um g ++ zu zwingen, mit etwas (in diesem Fall pthread) zu verknüpfen, ohne Dummy-Code mit den Symbolen hinzuzufügen?

+0

Versuchen -Wl, - no-allow-shlib-undefined -lbrokenlib -pthread. –

+0

Auch -Wl, - undefined = pthread_create. –

+0

Danke für die Hilfe, aber keine von denen arbeitete leider – bofjas

Antwort

1

Gibt es sowieso, um g ++ zu zwingen, mit etwas (in diesem Fall pthread) zu verknüpfen, ohne Dummy-Code mit den Symbolen hinzuzufügen?

Versuchen Sie folgendes:

echo "int main() { return 0; }" | 
g++ -x c++ - -o my_program -Wl,--no-as-needed -lpthread -Wl,--as-needed 
+0

Das behob das Problem. Vielen Dank! Nachdem ich die Frage gepostet habe, habe ich genau das Gleiche mit gcc anstelle von g ++ versucht und das funktionierte ohne das --no-as-need-Flag. Hast du eine Ahnung warum? – bofjas