【问题标题】:Why these "exported" variables are double-defined?为什么这些“导出”的变量是双重定义的?
【发布时间】:2015-08-04 21:33:53
【问题描述】:

我正在 x86/Linux 上测试一些 64 位 ELF 二进制文件。

我使用 gcc 编译了apache 服务器,使用它的默认配置(我猜是优化级别 O2)。

我使用strip 命令剥离了httpd 二进制文件,并使用此命令检查httpd ELF 二进制文件中的exported 变量。例如,对于变量ap_hack_ap_hook_get_open_

readelf -s httpd | grep ap_hack_ap_hook_get_open_

令我惊讶的是,我发现了变量ap_hack_ap_hook_get_open_ 的两个定义。如下图:

1732: 000000000068ff88     8 OBJECT  GLOBAL DEFAULT   24 ap_hack_ap_hook_get_open_
2263: 000000000068ff10     8 OBJECT  GLOBAL DEFAULT   24 ap_hack_ap_hook_get_open_

请注意,它们具有不同的内存地址,这意味着它们位于 ELF 二进制文件中的不同位置。

谁能解释一下为什么可以存在两个同名但地址不同的变量?

【问题讨论】:

  • 他们可能有不同的范围。
  • @WeatherVane,你好,你能解释一下“不同的范围”吗?它们都具有“全局”属性。
  • 这只是猜测,因为您没有提供任何声明或上下文。

标签: c binary reverse-engineering x86-64 elf


【解决方案1】:

它们在输出中被截断。使用-W

[root@osboxes osboxes]# readelf -sW /usr/sbin/httpd | grep get_open
   540: 000000000027bfc8     8 OBJECT  GLOBAL DEFAULT   24 ap_hack_ap_hook_get_open_htaccess
  1039: 000000000027c040     8 OBJECT  GLOBAL DEFAULT   24 ap_hack_ap_hook_get_open_logs
  1072: 000000000003ffb0     8 FUNC    GLOBAL DEFAULT   13 ap_hook_get_open_logs
  1451: 00000000000404d0     8 FUNC    GLOBAL DEFAULT   13 ap_hook_get_open_htaccess

【讨论】:

  • 这是真的!!我在一秒钟前找到了它,然后回去更新我的答案!然后我看到了你的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多