2016-08-27 12 views
2

Я пытаюсь получить имя функции функции C, которая была скрыта, иначе не отображается в таблице символов изображения.Возврат имени функции C, а не экспортированного, из скомпилированного кода, указанного только указателем.

Я делаю это на OS X и используя dladdr, и когда dladdr возвращает успех, я проверяю поле dli_sname, но его NULL.

Нет ли способа вернуть имя функции C? Насколько я понимаю, функции C, которые являются невыполненными, в конечном итоге являются встроенными?

+3

Если его нет в таблице символов, он недоступен. – Barmar

+0

Можете ли вы уточнить? Я могу сделать некоторые соответствующие броски, чтобы получить ручку. Я хочу получить имя. –

+1

Таблица символов - это данные, которые содержат перевод между именами и адресами. – Barmar

ответ

3

Невозможно.

Inline или нет, если он не находится в таблице символов, нет нигде, где имена не хранятся, если они были созданы с информацией об отладке, и даже тогда, если они были оптимизированы, по-прежнему иногда сложно или невозможно выздороветь.

Вы можете сбросить таблицу символов, например. objdump, если вам интересно, все, что не существует, недоступно вам через dladdr.

+0

Darn, есть способ хотя бы получить подпись типа с указателем функции? –

+0

@ Edgar Nope. Такая же сделка. Это не хранится нигде, кроме искаженных имен (и только если их манипуляция включает в себя их подпись), которая возвращается к тому, что она находится в таблице символов. –

2

Непредвиденные функции необязательно встроены (в противном случае у вас не было бы адреса функции в первую очередь), но они не находятся в таблице символов, поэтому у них нет имени, связанного с ними.

Невозможно получить имя, если вы не экспортируете все символы (например, GCC -export-dynamic), но я думаю, вы не спросите, в первую очередь, если вы можете это сделать. Если бы у него была отладочная информация, вероятно, было бы возможно проанализировать ее, чтобы получить имя.

+0

Darn, есть ли способ, по крайней мере, получить подпись типа с указателем функции? –

+0

@ EdgarAroutiounian Nope. Эта информация недоступна даже для экспортированных символов (кроме как для демонстрации имен C++), вам необходимо предварительно протестировать ее (если, конечно, у вас нет отладочной информации). –