2012-03-07 6 views
1

Есть ли в Linux инструмент, который сопоставляет переменную в исполняемом ей соответствующем сегменте памяти.Перечислить переменные в исполняемом сегменте памяти

Например, если у меня есть инициализированная глобальная переменная int x = 10 в моем исполняемом файле, инструмент должен показать, что переменная принадлежит .data сегменту исполняемого файла в формате, подобном тому, что показано ниже.

x .data

+0

Почему вы спрашиваете об этом? Почему это важно для вас? Вы могли бы использовать 'nm' и' objdump' (возможно, написать некоторый 'awk', чтобы объединить их вывод). –

+0

@BasileStarynkevitch: Есть ли опция в 'objdump', которая показывает вывод, который я хочу, как упоминалось выше? –

+0

Не в вашем формате, но 'objdump -t -h' может быть полезным (возможно, для объединения с выводом' nm'). Но вы действительно должны объяснить, почему вы этого хотите. Включение глобального в '.bss' или в' .data' является IMHO - деталью реализации цепочки построения. –

ответ

1

Если ваш исполняемый не раздели, то nm command (см также Linux manpage for nm) будет делать то, что вы хотите - он печатает таблицу символов имен/адресов/типов. Он имеет несколько вариантов вывода; на Linux, форматирование «sysv» -типов приближается к тому, чтобы дать вам то, что вы хотите. Пример:

$ nm -f sysv /bin/perl

Symbols from /bin/perl:

Name Value Class Type Size Line Section

Bases.3 |000000000813019c| d | OBJECT|0000000000000014| |.data F0convert |00000000080c6905| t | FUNC|00000000000000c6| |.text PL_AMG_names |0000000008137c80| D | OBJECT|0000000000000108| |.data PL_No |0000000008137904| D | OBJECT|0000000000000004| |.data PL_Yes |0000000008137900| D | OBJECT|0000000000000004| |.data [ ... ] PL_curinterp |0000000008138e88| B | OBJECT|0000000000000004| |.bss PL_do_undump |0000000008137910| D | OBJECT|0000000000000001| |.data PL_dollarzero_mutex |0000000008138e58| B | OBJECT|0000000000000018| |.bss PL_fold |000000000812c020| R | OBJECT|0000000000000100| |.rodata PL_fold_locale |0000000008135c80| D | OBJECT|0000000000000100| |.data PL_force_link_funcs |0000000008137da0| D | OBJECT|00000000000006c8| |.data PL_freq |000000000812c120| R | OBJECT|0000000000000100| |.rodata PL_hexdigit |0000000008137908| D | OBJECT|0000000000000004| |.data PL_memory_wrap |000000000812bfa3| R | OBJECT|0000000000000013| |.rodata [ ... ] PerlIO_setpos |0000000008112134| T | FUNC|00000000000000a6| |.text PerlIO_sprintf |00000000081122ee| T | FUNC|000000000000002a| |.text PerlIO_stdio |0000000008138720| D | OBJECT|0000000000000070| |.data PerlIO_stdoutf |0000000008112066| T | FUNC|000000000000003b| |.text [ ... ]

Если вы создаете файл объекта из C исходный код:

int x = 10;

и запустить что через nm, это дает:

$ nm -f sysv xxxx.o 


Symbols from xxxx.o: 

Name   Value   Class  Type   Size  Line Section 

x   |0000000000000000| D | OBJECT|0000000000000004|  |.data 

Обратите внимание на Value поле сообщил им является адрес указанного символа, а не содержимого переменной.

Если вы запустите на нем strip, эта таблица будет удалена, хотя и все nm сообщает, что вы не являетесь символом.

+0

Отлично! Это то, что я хотел –