Если вам не важно выяснить, где они определены, вы можете использовать objdump
для вывода таблицы символов C ++, которая разрешает typedefs.
lorien$ objdump --demangle --syms foo
foo: file format mach-o-i386
SYMBOL TABLE:
00001a24 g 1e SECT 01 0000 .text dyld_stub_binding_helper
00001a38 g 1e SECT 01 0000 .text _dyld_func_lookup
...
00001c7c g 0f SECT 01 0080 .text foo::foo(char const*)
...
Этот фрагмент из следующего определения структуры:
typedef char const* c_string;
struct foo {
typedef c_string ntcstring;
foo(ntcstring s): buf(s) {}
std::string buf;
};
Для этого требуется, чтобы вы все компилировали, и в результирующем исполняемом файле будут отображаться только символы, поэтому есть несколько ограничений. Другой вариант - сделать так, чтобы компоновщик сбросил карту символов. Для инструментов GNU добавьте -Wl,-map
и -Wl,name
, где name
- имя файла, который нужно сгенерировать (см. Примечание). Этот подход не разбирает имена, но, немного поработав, вы можете перепроектировать соглашения по искажению компилятора. Вывод предыдущего фрагмента будет содержать что-то вроде:
0x00001CBE 0x0000005E [ 2] __ZN3fooC2EPKc
0x00001D1C 0x0000001A [ 2] __ZN3fooC1EPKc
Вы можете декодировать их, используя спецификацию C ++ ABI . Когда вы освоитесь с тем, как это работает, стол для календарей , включенный в ABI, станет бесценным. Вывод в этом случае:
<mangled-name> ::= '_Z' <encoding>
<encoding> ::= <name> <bare-function-type>
<name> ::= <nested-name>
<nested-name> ::= 'N' <source-name> <ctor-dtor-name> 'E'
<source-name> ::= <number> <identifier>
<ctor-dtor-name> ::= 'C2' # base object constructor
<bare-function-type> ::= <type>+
<type> ::= 'P' <type> # pointer to
<type> ::= <cv-qualifier> <type>
<cv-qualifier> ::= 'K' # constant
<type> ::= 'c' # character
Примечание: похоже, что GNU изменяет аргументы на ld
, так что вы можете проверить локальное руководство (man ld
), чтобы убедиться, что команды генерации файла карты -map
filename
в вашей версии. В последних версиях использует -Wl,-M
и перенаправляет стандартный вывод в файл .