static library anschauen
-
Hallo,
ich habe eine static library gebaut, die eine Funktion
int abc();
enthält. Bei Verwendung bekomme ich den Fehler
/usr/bin/perl: symbol lookup error: /home/ingo/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/EmissionFreqs/EmissionFreqs.so: undefined symbol: abc
Es sei hier erwähnt, dass "EmissionFreqs.so" die static library einbindet.
Nun würde ich mir gerne die static library anschauen, um zu sehen, ob die Funktion "abc" überhaupt drin ist. Wie macht man das am besten?
-
Hallo,
sieh dir mal das Programm "nm" an.
-
Wenn Du beim Binden einer Shared Library andere, statische Libraries dazuholst, geht der Linker erstmal davon aus, dass Du mit den statischen Libraries die Symbole befriedigen willst, die die Objekte der Shared Library selbst brauchen. Symbole, die von keinem Objekt benutzt werden, kommen auch nicht in die Shared Library.
Schau Dir mal die Linkerparameter --whole-archive und --no-whole-archive (oder gcc'ish -Wl,--(no-)whole-archive) an.
-
LordJaxom schrieb:
Wenn Du beim Binden einer Shared Library andere, statische Libraries dazuholst, geht der Linker erstmal davon aus, dass Du mit den statischen Libraries die Symbole befriedigen willst,...
LordJaxom hat zwar recht, ich glaube aber nicht, dass das hier das problem ist. das liegt vor allem daran, dass deine shared library die funktion abc() ja braucht. würde sie das nicht tun, würde die fehlermeldung nicht kommen.
wie lautet der aufruf zum linken der datei "EmissionFreqs.so"? es scheint, dass die funktion abc nicht erfolgreich gelinkt wurde. whole-archive sollte nur verwendet werden, wenn der linker selbst nicht erkennen kann, dass ein symbol aus einer statische bibliothek verwendet werden wird, zb weil es per dlsym oder so geladen wird.
zusätzlich zu nm (das hier eh die einzig passende anwendung ist) kannst du mit ar t die objekte, die in einer statische bibliothek zusammengefasst sind, auflisten lassen.