Сопоставить переменные в исполняемом файле с сегментами памяти - PullRequest
2 голосов
/ 07 марта 2012

Существует ли в Linux инструмент, который отображает различные переменные в исполняемом файле на соответствующие сегменты памяти.

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

x .data

1 Ответ

2 голосов
/ 07 марта 2012

Если ваш исполняемый файл имеет значение , а не , то команда nm (см. Также Страница Linux для nm) будет делать то, что вы хотите - он печатает таблицу имен символов / адресов / типов. У него есть несколько вариантов вывода; в Linux форматирование в стиле "sysv" приближается к тому, чтобы дать вам то, что вы хотите. Образец:

$ nm -f sysv /bin/perl</p>

<p>Symbols from /bin/perl:</p>

<p>Name                            Value Class      Type            Size Line Section</p>

<p>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 сообщит вам, это «без символов».

...