我正在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
二进制文件中的不同位置。
有人能给我一些解释,说明为什么可能存在两个具有相同名称但地址不同的变量?
答案 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