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

Linux中是否有一个工具可以将可执行文件中的不同变量映射到相应的内存段

例如,如果在我的可执行文件中有一个初始化的全局变量
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
。对于全局或静态变量显式初始化为全零的特殊罕见情况,这取决于编译器优化。完美!这就是我想要的完美!这就是我想要的