2016-03-22 19 views
0

Bu nasıl mümkündür:Paylaşılan kütüphanenin bir işlevi tanımlaması ancak bununla bağlantı kuramaması nasıl mümkün olabilir?

>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

Muhtemelen yazdırılır Çünkü foobar yereldir (000000000003c7c0 _t_ foobar) ' – Tibrogargan

+0

@ PeterL. öyle değil, ben böyle bir paylaşılan lib ile "bağlantı" yapabilirsiniz. Tüm bunlar, çalışma zamanında programın kütüphaneyi yükleyeceği anlamına gelir. Kendi küçük kütüphanemle doğrulandım. –

+0

@Tibrogargan "yerel" nin anlamı nedir? Her neyse, foobar, "global" bir işlevdir. –

cevap

1

Sen bağlayamazsınız yalnızca genel semboller ihraç edilmektedir foobar.so "metin" alanında yerel bir sembolü olarak "foobar" tanımlar ve çünkü "filanca" için

nm'nin çıkışının 2. sütunu, sembol tipini verir. küçük harf yerel, büyük harf anlamına gelir. Sadece global semboller ihraç edilmektedir. Mükemmel @Tibrogargan cevap üzerine man nm(1)

0

Bkz, bunu yerel semboller vs biraz daha net wrt geneldir, readelf yardımcı programını kullanarak bağlama kontrol çalışabilir - aslında KÜRESEL veya YEREL

> readelf --symbols foobar.so 
İlgili konular