Як перерахувати символи, що експортуються з файлу .so? Якщо можливо, я також хотів би дізнатися їх джерело (наприклад, якщо вони витягнуті зі статичної бібліотеки).
Я використовую gcc 4.0.2, якщо це має значення.
nm
, а не GNU nm
.
Як перерахувати символи, що експортуються з файлу .so? Якщо можливо, я також хотів би дізнатися їх джерело (наприклад, якщо вони витягнуті зі статичної бібліотеки).
Я використовую gcc 4.0.2, якщо це має значення.
nm
, а не GNU nm
.
Відповіді:
Стандартний інструмент для переліку символів nm
: Ви можете використовувати його просто так:
nm -gD yourLib.so
Якщо ви хочете побачити символи бібліотеки C ++, додайте параметр "-C", який демонтує символи (це набагато зручніше для читання, розчленований).
nm -gDC yourLib.so
Якщо ваш .so файл у форматі elf, у вас є два варіанти:
Або objdump
( -C
також корисно для демонтажу C ++):
$ 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
Або скористайтеся 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
будуть показані всі символи, а також nm -g
лише видимі зовні символи. Це може бути заплутаним, якщо ви вивчаєте кілька файлів символів і починаєте обмінюватися своїми командами.
objectdump -TC
би до списку. На противагу цьому readelf -Ws
, в ньому не відображаються зловмисні імена.
.so
файлів, можливо, вам потрібно буде додати --dynamic
до nm
командного рядка.
Якщо ваш .so
файл у форматі ельфів, ви можете скористатися програмою readelf для отримання інформації про символ із двійкового файлу. Ця команда дасть вам таблицю символів:
readelf -Ws /usr/lib/libexample.so
Ви повинні витягти лише ті, що визначені в цьому .so
файлі, а не в бібліотеках, на які він посилається. У сьомому стовпці повинно бути число у цьому випадку. Ви можете витягти його за допомогою простого регулярного вираження:
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'
або, як це було запропоновано Caspin ,:
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
objdump -TC /usr/lib/libexample.so
Мені було цікаво, чому -fvisibility = прихований та видимість #pragma GCC не мав ніякого впливу, оскільки всі символи завжди були видимі з nm - поки я не знайшов цю посаду, яка вказала мені на readelf та objdump , що дало мені зрозуміти, що там начебто насправді є дві символьні таблиці:
Я думаю, що перший містить символи налагодження, які можна позбавити смужкою або перемикачем -s, який ви можете надати лінкеру або команді встановити . І навіть якщо nm більше нічого не перераховує, ваші експортовані символи все одно експортуються, оскільки вони знаходяться в "динамічній таблиці символів" ELF, яка є останньою.
Для .so
файлів C ++ кінцевою nm
командою єnm --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)
джерело: https://stackoverflow.com/a/43257338
Ви можете використовувати nm -g
інструмент із ланцюжка інструментів binutils. Однак їх джерело не завжди легко доступне. і я фактично навіть не впевнений, що цю інформацію завжди можна отримати. Можливо, objcopy
розкриває подальшу інформацію.
/ EDIT: Звичайно, ім'я інструменту nm
. Прапор -g
використовується для відображення лише експортованих символів.
nm -g список зовнішньої змінної, яка не обов'язково експортується символом. Будь-яка нестатична змінна область файлу (у С) - це зовнішня змінна.
nm -D відобразить символ у динамічній таблиці, де ви можете знайти його адресу за допомогою dlsym.
нм --версія
GNU nm 2.17.50.0.6-12.el5 20061020
Якщо ви просто хочете знати , якщо є символи представляють ви можете використовувати
objdump -h /path/to/object
або перелічити інформацію про налагодження
objdump -g /path/to/object
nm
він не відповідає деяким параметрам, як-от-D
і-g
(IIRC).