为什么这些“导出”变量是双重定义的?

时间:2015-05-22 18:46:55

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

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

我使用gcc编译apache服务器及其默认配置(我估计优化级别为O2)。

我使用httpd命令剥离了strip二进制文件,并使用此命令检查exported ELF二进制文件中的httpd变量。例如,对于变量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二进制文件中的不同位置。

有人能给我一些解释,说明为什么可能存在两个具有相同名称但地址不同的变量?

1 个答案:

答案 0 :(得分:4)

它们在输出中被截断。使用-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