Как перечислить символы в файле .so

Как список экспортируемых символов из .so-файла. Если это возможно, я также хотел бы узнать их источник (например, если их вытащили из статической библиотеки).

Я использую gcc 4.0.2, если это имеет значение

Стандартный инструмент для enums символов – nm , вы можете использовать его просто так:

 nm -g yourLib.so 

Если вы хотите увидеть символы библиотеки C ++, добавьте параметр «-C», который разворачивает символы (это гораздо более читаемо, как показано на рисунке).

 nm -gC yourLib.so 

Если ваш файл .so находится в формате elf, у вас есть два варианта:

Либо objdump ( -C также полезен для демонстрации C ++):

 $ objdump -TC libz.so libz.so: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: 0000000000002010 ld .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 [email protected]_2.2.5 (14) 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (14) 4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 

Если ваш .so файл находится в формате elf, вы можете использовать программу readelf для извлечения символьной информации из двоичного файла. Эта команда даст вам таблицу символов:

 readelf -Ws /usr/lib/libexample.so 

Вам нужно извлечь только те, которые определены в этом .so файле, а не в библиотеках, на которые он ссылается. Седьмой столбец должен содержать номер в этом случае. Вы можете извлечь его с помощью простого регулярного выражения:

 readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+' 

или, как было предложено Каспином,:

 readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}'; 
 objdump -TC /usr/lib/libexample.so 

Для разделяемых библиотек libNAME.so -D-переключатель должен был видеть символы в моем Linux

 nm -D libNAME.so 

и для статической библиотеки, как сообщают другие

 nm -g libNAME.a 

Я продолжал задаваться вопросом, почему -fvisibility = hidden и видимость #pragma GCC , похоже, не имеют никакого влияния, поскольку все символы всегда были видны с помощью nm – пока я не нашел это сообщение, которое указывало мне на readelf и objdump , что заставило меня понять, что там по-видимому, представляют собой две таблицы символов:

  • Тот, который вы можете перечислить с помощью nm
  • Тот, который вы можете перечислить с помощью readelf и objdump

Я думаю, что первая содержит отладочные символы, которые можно разделить на полосу или ключ -s, который вы можете предоставить компоновщику или команде установки . И даже если nm больше ничего не перечисляет, ваши экспортированные символы все еще экспортируются, потому что они находятся в таблице динамических символов ELF, которая является последней.

Попробуйте добавить -l к флагам nm, чтобы получить источник каждого символа. Если библиотека скомпилирована с информацией об отладке (gcc -g), это должен быть исходный файл и номер строки. Как сказал Конрад, объектный файл / статическая библиотека, вероятно, неизвестно в этот момент.

Вы можете использовать инструмент nm -g из toolchain binutils. Однако их источник не всегда легко доступен. и я даже не уверен, что эта информация всегда может быть восстановлена. Возможно, objcopy раскрывает дополнительную информацию.

/ EDIT: имя инструмента, конечно, nm . Флаг -g используется для отображения только экспортированных символов.

Для файлов Android .so , набор инструментов NDK поставляется с необходимыми инструментами, упомянутыми в других ответах: readelf , objdump и nm .

nm -g введите переменную extern, которая не является необходимым экспортированным символом. Любая переменная области нестатического размера файла (в C) является переменной extern.

nm -D будет отображать символ в динамической таблице, который вы можете найти по адресу dlsym.

nm –версия

GNU nm 2.17.50.0.6-12.el5 20061020

Для файлов C ++ .so конечная команда nmnm --demangle --dynamic --defined-only --extern-only

 # 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

  • Как повысить предупреждение, если возвращаемое значение не учитывается?
  • Псевдонимы, вызываемые разыменованием, нарушат правила строгого сглаживания
  • Опция GCC -fPIC
  • Почему неуправляемый доступ к памяти mmap'а иногда может возникнуть на AMD64?
  • Как я могу сказать gcc не встраивать функцию?
  • Экспериментальная :: ошибка компоновщика файловой системы
  • Отключить все опции оптимизации в GCC
  • & operator необязательно в назначении указателя функции
  • Полезные флаги GCC для C
  • Как скомпилировать для Windows на Linux с gcc / g ++?
  • Объявление размера массива с непостоянной переменной
  • Давайте будем гением компьютера.