为什么这些 "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