Инструменты, которые перечисляют прототипы в библиотеке .so - PullRequest
1 голос
/ 27 февраля 2012

Существует ли в Linux инструмент (например, команда), в котором перечислены прототипы в библиотеке .so.

Я нашел nm близко к моей потребности, но то, что я получил, это просто символы.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Простой ответ: нет, вы не можете этого сделать (для C).

Более длинный ответ: Вы можете получить «прототипы», как вы их назвали ТОЛЬКО для C ++, потому что объявления функций искажены . Манглинг действительно означает кодирование всей сигнатуры функции (или прототипа, если хотите) в одну строку символов без пробелов, например:

CCertificate::GetInfo(Utils::TCertInfo&) const

в искаженном виде:

_ZZNK12CCertificate7GetInfoERN5Utils9TCertInfoEE8

Mangling был вызван из-за перегрузки функций в C ++ (функции с одинаковыми именами, но с разным количеством параметров и / или разных типов). В C у вас нет oveloading, поэтому функции идентифицируются (в общих библиотеках) по имени (которое является NOT искаженным).

Подводя итог: все функции в разделяемых библиотеках идентифицируются по имени , но для C ++ эти имена являются искаженными именами, для C они не искажены. Mangling дает вам тот дополнительный «побочный эффект», что вы можете видеть сигнатуру функции (например, вызывая nm -C ).

Надеюсь, это поможет.

1 голос
/ 27 февраля 2012

Если библиотека является библиотекой C, она сама по себе не содержит подписи функций. Они находятся в заголовочных файлах (которые должна предоставить библиотека), если библиотека .so не была скомпилирована с отладочной информацией, включенной -g (что не является обычным для производственных библиотек).

Даже в C ++ библиотека .so (без -g) не содержит объявления участвующих классов. Искаженные имена относятся только к именам классов или типов ...

Короче, вам нужны заголовочные файлы библиотек. Большинство дистрибутивов Linux упаковывают их отдельно от самой библиотеки. Например, в Debian у вас есть как пакет libjansson4 (содержащий общую библиотеку .so, необходимый для запуска приложений, которые нравятся с библиотекой Jansson), так и пакет libjansson-dev (содержащий общие объекты и файлы заголовков, полезные для создания функции вызова приложения в библиотеке Янссона). Debian также предоставляет пакеты libjansson-dbg (для отладочной информации или варианта библиотеки) и libjansson-doc (для документации).

...