我正在 x86/Linux 上测试一些 64 位 ELF 二进制文件。
我使用 gcc 编译了 apache
服务器,其默认配置(我猜优化级别为 O2)。
我使用 strip
命令剥离了 httpd
二进制文件,并使用此命令检查 httpd< 内的
ELF 二进制文件。例如,对于变量 导出
变量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
二进制文件中的不同位置。
谁能给我一些解释,为什么可以存在两个具有相同名称但不同地址的变量?
最佳答案
它们在输出中被截断。使用-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
关于c - 为什么这些 "exported"变量是双重定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403848/