1

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

例如,如果我的可执行文件中有一个已初始化的全局变量,该工具应该以类似于下图所示的格式int x = 10显示该变量属于可执行文件的段。.data

x .data

4

1 回答 1

1

如果您的可执行文件没有被剥离,那么该nm命令(另请参阅Linux 手册页nm)将执行您想要的操作 - 它打印一个符号名称/地址/类型的表。它有多个输出选项;在 Linux 上,“sysv”风格的格式接近于给你想要的东西。样本:

$ nm -f sysv /bin/perl

/bin/perl 中的符号:

名称 值 类别 类型 尺寸 线段

底数.3 |000000000813019c| d | 对象|0000000000000014| |.data F0转换 |00000000080c6905| 吨 | 功能|00000000000000c6| |.text PL_AMG_names |0000000008137c80| D | 对象|0000000000000108| |.data PL_No |0000000008137904| D | 对象|0000000000000004| |.data PL_是 |0000000008137900| D | 对象|0000000000000004| |.data [ ... ] PL_curinterp |0000000008138e88| 乙| 对象|0000000000000004| |.bss PL_do_undump |0000000008137910| D | 对象|0000000000000001| |.data PL_dollarzero_mutex |0000000008138e58| 乙| 对象|0000000000000018| |.bss PL_fold |000000000812c020| 右 | 对象|0000000000000100| |.rodata PL_fold_locale |0000000008135c80| D | 对象|0000000000000100| |.data PL_force_link_funcs |0000000008137da0| D | 对象|00000000000006c8| |.data PL_频率 |000000000812c120| 右 | 对象|0000000000000100| |.rodata PL_hexdigit |0000000008137908| D | 对象|0000000000000004| |.data PL_memory_wrap |000000000812bfa3| 右 | 对象|0000000000000013| |.rodata [ ... ] PerlIO_setpos |0000000008112134| T | 功能|00000000000000a6| |.text PerlIO_sprintf |00000000081122ee| T | 功能|000000000000002a| |.text PerlIO_stdio |0000000008138720| D | 对象|0000000000000070| |.data PerlIO_stdoutf |0000000008112066| T | 功能|000000000000003b| |.text [ ... ]

如果您确实从 C 源代码创建了一个目标文件:

    int x = 10;

并运行它nm,它给出:

$ nm -f sysv xxxx.o


xxxx.o 中的符号:

名称 值 类别 类型 尺寸 线段

x |0000000000000000| D | 对象|0000000000000004| |.data

注意Value它报告的字段是所述符号的地址,而不是变量的内容。

如果你跑strip过去,这个表会被删除,所有nm告诉你的是“没有符号”。

于 2012-03-07T09:29:03.500 回答