首页 > 解决方案 > 优化的 ELF 二进制文件中的全局变量名称

问题描述

为什么 ELF 文件保留全局变量的实际名称?而不仅仅是保留他们的地址。这是一个示例文件:

int oren; int moish;
int main(int argc, char **argv)
{
    if (argc>3)
    {
        oren=2;
        moish=5;
        return oren+moish;
    }
    return 8;
}

我编译它并用

$ gcc -O3 main.c -o main
$ objdump -D ./main | grep "moish"

我有点惊讶地发现里面的实际名称 moish(因为我不确定它的用途):

 504:   c7 05 06 0b 20 00 05    movl   $0x5,0x200b06(%rip)        # 201014 <moish>
0000000000201014 <moish>:

有理由保留吗?

标签: global-variableself

解决方案


我有点惊讶地发现里面的真实名字moish

UNIX 二进制文件传统上将符号表保存在链接二进制文件(可执行文件或 DSO)中以帮助调试。符号表不用于其他任何用途,您可以使用strip命令或使用-Wl,-s标志链接将其从二进制文件中删除。

strip拆机后是这样的:

105a:       c7 05 c8 2f 00 00 05    movl   $0x5,0x2fc8(%rip)        # 402c <__cxa_finalize@plt+0x2ffc>

推荐阅读