【问题标题】:Map the variables in executable to memory segments将可执行文件中的变量映射到内存段
【发布时间】:2012-03-24 16:35:56
【问题描述】:

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

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

x .data

【问题讨论】:

  • 你为什么这么问?为什么它对你很重要?您可以使用nmobjdump(也许写一些awk 来组合它们的输出)。
  • @BasileStarynkevitch:objdump 中有一个选项可以显示我想要的输出吗?
  • 不是您的格式,但objdump -t -h 可能有用(可能与nm 的输出相结合)。但是你真的应该解释你为什么想要那个。将全局放入 .bss.data 是恕我直言,这是构建链的实现细节。
  • @BasileStarynkevitch:好的,我会告诉你这个的必要性。假设一个人开始研究 C 程序的内存布局,他想知道哪些变量进入了哪个内存段。我就是这样的人。希望现在您了解需求。用简单的语言表达好奇心
  • 全局或静态变量在未显式初始化时将进入.bss,否则将进入.data。对于全局或静态变量显式初始化为全零的特殊罕见情况,这取决于编译器优化。

标签: linux memory-layout


【解决方案1】:

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

$ nm -f sysv /bin/perl

来自 /bin/perl 的符号:

名称值类类型大小线段

Bases.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告诉你的是“没有符号”。

【讨论】:

  • 完美!这就是我想要的
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2020-12-06
  • 2012-04-27
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多