Bir .so dosyasından dışa aktarılan sembolleri nasıl listeleyebilirim? Mümkünse, kaynaklarını da bilmek isterim (örneğin statik bir kütüphaneden içeri alınırlarsa).
Bir fark yaratırsa gcc 4.0.2 kullanıyorum.
nm
, GNU değil nm
.
Bir .so dosyasından dışa aktarılan sembolleri nasıl listeleyebilirim? Mümkünse, kaynaklarını da bilmek isterim (örneğin statik bir kütüphaneden içeri alınırlarsa).
Bir fark yaratırsa gcc 4.0.2 kullanıyorum.
nm
, GNU değil nm
.
Yanıtlar:
Sembolleri listelemek için standart araç nm
, basitçe şu şekilde kullanabilirsiniz:
nm -gD yourLib.so
Bir C ++ kütüphanesinin sembollerini görmek istiyorsanız, sembolleri sökmek için "-C" seçeneğini ekleyin (çok daha okunabilir demontaj).
nm -gDC yourLib.so
.So dosyanız elf biçimindeyse, iki seçeneğiniz vardır:
Her ikisi de objdump
( -C
C ++ demontajı için de yararlıdır):
$ objdump -TC libz.so
libz.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000002010 l d .init 0000000000000000 .init
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __errno_location
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
Veya şunu kullanın readelf
:
$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000002010 0 SECTION LOCAL DEFAULT 10
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND free@GLIBC_2.2.5 (14)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __errno_location@GLIBC_2.2.5 (14)
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable
readelf -Ws
size gösterecektir bütün sembolleri ve nm -g
sadece harici olarak görünür sembolleri gösterileri. Birden çok sembol dosyasını inceliyor ve komutlarınızı değiştirmeye başlıyorsanız bu durum kafa karıştırıcı olabilir.
objectdump -TC
listeye eklerdim. Aksine readelf -Ws
, karışık isimleri göstermez.
.so
Dosyalar --dynamic
için nm
komut satırına eklemeniz gerekebilir .
Senin Eğer .so
dosya elf formatta, sen ikili özü sembol bilgilere readelf programını kullanabilirsiniz. Bu komut size sembol tablosunu verecektir:
readelf -Ws /usr/lib/libexample.so
Yalnızca bu .so
dosyada tanımlananları, başvurduğu kitaplıklarda değil ayıklamanız gerekir. Yedinci sütun bu durumda bir sayı içermelidir. Basit bir normal ifade kullanarak ayıklayabilirsiniz:
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'
veya Caspin tarafından önerildiği gibi:
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
objdump -TC /usr/lib/libexample.so
Merak ettim neden -fvisibility = gizli ve # Pragma GCC görünürlüğü tüm semboller her zaman görülebilen olduğu gibi, herhangi bir etkiye sahip değildi nm - Beni işaret Bu yayını bulana kadar readelf ve objdump bana fark ettirdi, orada aslında iki sembol tablosu gibi görünüyor :
Eski şerit veya -s anahtarı ile bağlayıcı veya install komutuna verilebilir hata ayıklama sembolleri içerdiğini düşünüyorum . Ve nm artık bir şey listelemese bile, dışa aktarılan sembolleriniz hala dışa aktarılır, çünkü bunlar ikincisi olan ELF "dinamik sembol tablosunda "dır.
C ++ .so
dosyaları için nihai nm
komutnm --demangle --dynamic --defined-only --extern-only <my.so>
# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)
Android için .so
dosyalar, NDK araç zinciri diğer yanıtlar sözü gerekli araçları ile birlikte gelir: readelf
, objdump
ve nm
.
Sen kullanabilirsiniz nm -g
araç zinciri binutils gelen aracı. Ancak, kaynakları her zaman mevcut değildir. ve aslında bu bilgilerin her zaman alınabileceğinden bile emin değilim. Belki objcopy
daha fazla bilgi ortaya koymaktadır.
/ EDIT: Aracın adı elbette nm
. Bayrak -g
, yalnızca dışa aktarılan sembolleri göstermek için kullanılır.
nm -g dışa aktarılan sembol gerekli olmayan extern değişkenini listeler. Statik olmayan dosya kapsam değişkenlerinin (C cinsinden) tümü extern değişkendir.
nm -D, dinamik tablodaki sembolün adresini dlsym ile bulabileceğiniz bir liste oluşturur.
nm - sürüm
GNU nm 2.17.50.0.6-12.el5 20061020
Eğer sadece mevcut semboller olup olmadığını bilmek istiyorsanız
objdump -h /path/to/object
veya hata ayıklama bilgilerini listelemek için
objdump -g /path/to/object
nm
gibi bazı seçeneklere yanıt vermez .-D
-g