2015-03-11 1 views
2

У меня есть файл .SO (обратите внимание, а не .a, а не .dylib и не .o), и мне нужно получить от него информацию о символе на OSX.Как распечатать список символов для .so-файла в OSX?

Я попытался

nm -gU lib.so 

Однако, ничего не печатается.

Я не могу использовать otool, потому что это не объектный файл, а readelf не существует на OSX. Как получить информацию о символе?

Обратите внимание, что я использую этот файл .so в другом проекте, и есть информация о символе. Я могу загрузить библиотеку и ссылаться на нее. Тем не менее, мне еще предстоит найти инструмент на OSX, чтобы я мог напечатать информацию о символе.

Как спросил,

file lib.so 

ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, stripped 
+1

Каков фактический тип файла (а не расширение его файла, которое не является определяющим)? Что выводит 'файл lib.so'? Кстати, существуют различные пакеты, связанные с ELF, поддерживаемые MacPorts. Например, похоже, что пакет 'elftoolchain' включает в себя инструмент' readelf'. 'i386-elf-binutils' или' x86_64-elf-binutils' может также иметь что-то полезное. Я уверен, что другие системы пакетов имеют похожие пакеты. –

+0

Это двоичный код ARM. Будут ли инструменты x86/x64 иметь возможность понять это? – tadman

+0

Поскольку OSX использует двоичный формат Mach-O, а не ELF. Таким образом, утилиты, такие как 'nm' и т. Д., Не имеют отношения к форматам ELF. Также они не будут использовать один и тот же синтаксис командной строки.Я описываю, как создавать и устанавливать ['binutils'] (http://stackoverflow.com/questions/8712352/linux-mach-o-disassembler/8714142#8714142) в Linux для файлов Mach-O. Вы можете захотеть скомпилировать 'binutils' для запуска (размещения) на OSX/Darwin, но' --target' должен быть 'arm-elf' или какой-то вариант. Я не могу вспомнить конкретные архитектуры ARM, но может быть вариант сборки, который обрабатывает все от старых версий ARM до AArch64. –

ответ

0

Попробуйте использовать c++filt по трубопроводу из nm:

nm lib.so | c++filt -p -i 

C++ ФИЛТР - Demangle C++ и Java символы.

-p --no-Params При декодировании имя функции, не отображаются типы параметров функции.

-i --no-многословным Не включать детали реализации (если таковые имеются) в декодированный выходе.

EDIT: На основе нового (ARM) Информация, представленной в этом вопросе, попробуйте использовать вместо symbols:

symbols lib.so -arch arm | awk '{print $4}' 

Я использовал awk для упрощения вывода; удалить, чтобы вывести все.

Manual page : Symbols

+2

Спасибо, к сожалению, ничего не выводит для меня. – stevebot

+0

Если это библиотека, отличная от OS X, инструменты OS X могут не знать, как ее прочитать. Не могли бы вы развернуть Linux VM, чтобы справиться с этим? [Vagrant] (https://www.vagrantup.com/) делает это очень простым. Если вы имеете дело с двоичным кодом ARM, вам могут понадобиться инструменты компиляции, относящиеся к этой архитектуре. – tadman

+0

Ваша первая команда с 'C++ filt' не выдала мне никакого результата. Вторая команда с символами просто печатает: ** файл, do ** –

0

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/nm.1.html Nm отображает список имен (таблица символов) каждого объектного файла в списке аргументов. Если аргументом является архив, будет создан список для каждого объектного файла в архиве. Файл может иметь форму libx.a (x.o), и в этом случае перечислены только символы из этого члена объектного файла. (Параграф- тезисов необходимо процитировать, чтобы получить оболочку.) Если файл не указан, перечислены символы в a.out.

Смежные вопросы