c - 为什么这些 "exported"变量是双重定义的?

标签 c binary reverse-engineering x86-64 elf

我正在 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/

相关文章:

c - 使用 fork 查找矩阵中的数字

java - 添加二进制数

C++ 传递一个 Int,错误说它是一个 Double

c - 对指针的修改改变了输出

c - 使用堆栈添加 2 个大数字?

MATLAB:将 uint32(4 字节)值转换为相应的 IEEE 单精度浮点形式

MySql数据库结构——外键逆向工程

maven - 使用自定义 ReverseEgineeringStrategy 进行逆向工程

cocoa - NSWindowGraphicContext?

c++ - ListView_GetItem() 宏 & LV_GETITEMTEXT 在获取另一个 APP ListView 项时返回空字符串