Linux 将可执行文件中的变量映射到内存段
Linux中是否有一个工具可以将可执行文件中的不同变量映射到相应的内存段 例如,如果在我的可执行文件中有一个初始化的全局变量Linux 将可执行文件中的变量映射到内存段,linux,memory-layout,Linux,Memory Layout,Linux中是否有一个工具可以将可执行文件中的不同变量映射到相应的内存段 例如,如果在我的可执行文件中有一个初始化的全局变量int x=10,那么工具应该以如下所示的格式显示该变量属于可执行文件的.data段 x.data如果未剥离可执行文件,则(另请参见)将执行您想要的操作-它将打印符号名称/地址/类型表。它有多个输出选项;在Linux上,“sysv”样式的格式几乎可以满足您的需要。样本: $ nm -f sysv /bin/perl Symbols from /bin/perl: Nam
int x=10
,那么工具应该以如下所示的格式显示该变量属于可执行文件的.data
段
x.data
如果未剥离可执行文件,则(另请参见)将执行您想要的操作-它将打印符号名称/地址/类型表。它有多个输出选项;在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
[ ... ]
通过nm
,它给出:
$ nm -f sysv xxxx.o
Symbols from xxxx.o:
Name Value Class Type Size Line Section
x |0000000000000000| D | OBJECT|0000000000000004| |.data
$nm-f sysv xxxx.o
xxxx.o中的符号:
名称值类类型大小行部分
x | 0000000000000000 | D |对象| 000000000000000 4 | |数据
注意,它报告的值
字段是所述符号的地址,而不是变量的内容
如果您在其上运行strip
,则此表将被删除,并且所有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
[ ... ]
通过nm
,它给出:
$ nm -f sysv xxxx.o
Symbols from xxxx.o:
Name Value Class Type Size Line Section
x |0000000000000000| D | OBJECT|0000000000000004| |.data
$nm-f sysv xxxx.o
xxxx.o中的符号:
名称值类类型大小行部分
x | 0000000000000000 | D |对象| 000000000000000 4 | |数据
注意,它报告的值
字段是所述符号的地址,而不是变量的内容
如果您在其上运行
strip
,则此表将被删除,并且所有nm
都会告诉您“无符号”。您为什么这样问?为什么这对你很重要?您可以使用nm
和objdump
(也许可以编写一些awk
来组合它们的输出)。@basiletarynkevitch:objdump
中是否有一个选项可以显示我想要的输出,如上所述?不是您的格式,但是objdump-t-h
可能有用(可能与nm的输出相结合)。但你真的应该解释你为什么要这样做。将一个全局变量放入.bss
或.data
是构建链的一个实现细节。@basilestrynkevich:好的,我会告诉你这个需要。假设一个人开始研究C程序的内存布局,他想知道哪些变量指向哪个memory段。我就是这样一个人。希望你现在能理解我的需要。好奇简单地说一个全局变量或静态变量将进入.bss
,当它没有被显式初始化时(所以被清除),和.data
否则。对于全局变量或静态变量显式初始化为全零的特殊罕见情况,这取决于编译器优化。您为什么问这个问题?为什么这对您很重要?您可以使用nm
和objdump
(可能编写一些awk
来组合它们的输出)@BasileStarynkevitch:objdump
中是否有一个选项显示我想要的上述输出?不是您的格式,但是objdump-t-h
可能有用(可能与nm
的输出结合使用)。但你真的应该解释你为什么要这样做。将一个全局变量放入.bss
或.data
是构建链的一个实现细节。@basilestrynkevich:好的,我会告诉你这个需要。假设一个人开始研究C程序的内存布局,他想知道哪些变量指向哪个memory段。我就是这样一个人。希望你现在能理解我的需要。好奇简单地说一个全局变量或静态变量将进入.bss
,当它没有被显式初始化时(所以被清除),并转到.data
。对于全局或静态变量显式初始化为全零的特殊罕见情况,这取决于编译器优化。完美!这就是我想要的完美!这就是我想要的