Может ли objdump удалить имена шаблонных функций C ++? - PullRequest
16 голосов
/ 23 февраля 2012

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

Ответы [ 2 ]

15 голосов
/ 23 февраля 2012

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

13 голосов

objdump -C

Флаг -C разрешает разделение:

printf '
template<typename T>
T add(T x, T y) {
    return x + y;
}

void h() {
    add(1, 2);
    add(1.0, 2.0);
}
' > a.cpp
g++ -g -std=c++11 a.cpp
objdump -CS a.out

Выход содержит разделенные имена:

int main() {
    add(1, 2);
 60c:   e8 28 00 00 00          callq  639 <int add<int>(int, int)>
    add(1.0, 2.0);
 62d:   e8 1b 00 00 00          callq  64d <double add<double>(double, double)>

0000000000000639 <int add<int>(int, int)>:

000000000000064d <double add<double>(double, double)>:

Без -C вместо этого он содержит искаженные имена:

0000000000000639 <_Z3addIiET_S0_S0_>:
000000000000064d <_Z3addIdET_S0_S0_>:

man objdump говорит:

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

nm также имеет параметр -C.

Протестировано в Ubuntu 18.04, g++ 7.3.0, objdump 2.30.

...