优化的 ELF 二进制文件中的全局变量名称

global variables names in optimized ELF binary

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

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

我编译了它并用

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

我有点惊讶地发现里面的真实名字是 moish(因为我不确定 它需要做什么):

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

有什么理由保留它吗?

I was a bit surprised to find the actual name moish inside

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

strip 后的反汇编如下所示:

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