2012-02-23 3 views
14

У меня есть объектный файл на C++, который содержит экземпляры некоторых функций шаблона C++. Этот объектный файл создает одну и ту же функцию для нескольких различных комбинаций параметров шаблона. Я пытаюсь отладить проблему и хотел бы посмотреть на разборку конкретного экземпляра функции шаблона (то есть, я знаю параметры шаблона для функции, которую я хочу изучить). Обычно я делаю это с помощью objdump, чтобы разобрать объектный файл, но он (по крайней мере по умолчанию) не может деактивировать имена функций C++. Есть какой-либо способ сделать это? Объектные файлы были созданы с использованием gcc 4.6.1.Может ли objdump отменять имена функций шаблона C++?

ответ

13

Проложить его через c++filt? Может потребоваться дать ему -n в зависимости от того, находят ли символы w/или без верхнего подчеркивания.

+4

Похоже, это сработает. Я также нашел опцию '-C' для' objdump', которая, по-видимому, работает для моего приложения как минимум. –

+0

@JasonR еще лучше. Исторически существовали варианты и варианты имен, таких как 'nm ++', но они были поражены и пропущены, и я привык просто контактировать со всем. – smparkes

+0

@JasonR, спасибо за публикацию этого ... '-C' был недокументирован в моей версии' objdump' (не показан с '--help'), но он все еще работал. –

8

objdump -C делает это как указано Jason R в комментарии.

man objdump говорит:

Decode (demangle) имена символов низкого уровня в имена пользовательского уровня. Помимо удаления начального подчеркивания, добавленного системой, это делает имена функций C++ доступными для чтения. У разных компиляторов разные стили оформления. Необязательный аргумент стиля demangling можно использовать для выбора подходящего стиля для вашего компилятора.

Пример вывода на operator new[] на и objdump -CSr вызова:

char *sn = new char[4]; 
10: bf 04 00 00 00   mov $0x4,%edi 
15: e8 00 00 00 00   callq 1a <main+0x1a> 
         16: R_X86_64_PC32  operator new[](unsigned long)-0x4 

Без -C было бы показать искаженное имя _Znam.

nm также есть этот опция.