为什么这些 "exported" 变量是双重定义的?
Why these "exported" variables are double-defined?
我正在 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
二进制文件中的不同位置。
谁能解释一下为什么可以存在两个名称相同但地址不同的变量?
它们在输出中被截断了。使用 -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
我正在 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
二进制文件中的不同位置。
谁能解释一下为什么可以存在两个名称相同但地址不同的变量?
它们在输出中被截断了。使用 -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