2016-03-22 8 views
0

Wie ist das möglich:Wie ist es möglich, dass eine gemeinsam genutzte Bibliothek eine Funktion definiert, aber nicht mit ihr verknüpft werden kann?

>nm --defined-only foobar.so | grep foobar 
000000000003c7c0 t foobar 
>gcc foobar.c foobar.so 
foobar.c:(.text+0x19): undefined reference to `foobar' 
collect2: ld returned 1 exit status 
+0

Wahrscheinlich weil foobar ist local '(000000000003c7c0 _t_ foobar)' – Tibrogargan

+0

@PeterL. Nicht so, ich kann so mit einer gemeinsamen Lib "verlinken". All dies bedeutet, dass zur Laufzeit das Programm die Bibliothek dann lädt. Ich verifizierte mit meiner eigenen kleinen Bibliothek. –

+0

@Tribargargan was bedeutet "lokal"? Wie auch immer, 'Foobar' ist eine" globale "Funktion. –

Antwort

1

Sie können nicht zu „foobar“ verlinken weil foobar.so definiert „foobar“ als lokales Symbol in dem „Text“ Bereich und nur globale Symbole exportiert werden

Die zweite Spalte der Ausgabe von nm gibt den Symboltyp an. Kleinschreibung bedeutet lokal, Großschreibung bedeutet global. Nur globale Symbole werden exportiert. Siehe man nm(1)

0

Oben ausgezeichnete @Tibrogargan Antwort, können Sie versuchen readelf Dienstprogramm zu überprüfen Bindung verwenden, ist es ein bisschen mehr klar WRT global vs lokale Symbole ist - es wird tatsächlich drucken globale oder lokale

> readelf --symbols foobar.so 
Verwandte Themen