Linux中是否有工具将可执行文件中的不同变量映射到相应的内存段。将可执行文件中的变量映射到内存段
例如,如果我在我的可执行文件中有一个初始化的全局变量int x = 10
,该工具应该显示该变量属于.data
段的可执行文件,其格式类似于下面显示的格式。
x .data
Linux中是否有工具将可执行文件中的不同变量映射到相应的内存段。将可执行文件中的变量映射到内存段
例如,如果我在我的可执行文件中有一个初始化的全局变量int x = 10
,该工具应该显示该变量属于.data
段的可执行文件,其格式类似于下面显示的格式。
x .data
如果你的可执行文件是不剥离,那么nm
command(见Linux manpage for nm
)会做你想要的东西 - 它打印符号名称/地址/类型的表。它有多个输出选项;在Linux上,“sysv”风格的格式接近于给你你想要的东西。示例:
$ nm -f sysv /bin/perl如果创建了从C源代码的目标文件: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 [ ... ]
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
都告诉您“没有符号”。
完美!这是我想要的 – 2012-03-08 04:58:13
你为什么这么问?为什么这对你很重要?你可以使用'nm'和'objdump'(也许写一些'awk'来组合它们的输出)。 – 2012-03-07 06:18:32
@BasileStarynkevitch:在'objdump'中是否有一个选项显示我想要的输出? – 2012-03-07 06:27:58
不是你的格式,但'objdump -t -h'可能很有用(可能与'nm'的输出结合)。但你真的应该解释你为什么要这样做。将全局变成'.bss'或者变成'.data'是恕我直言的一个建筑链的实现细节。 – 2012-03-07 06:34:59