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.