我们如何删除未使用的bss符号?

时间:2013-07-05 07:45:51

标签: c gcc ld elf

我们知道,我们可以使用“-ffunction-sections -fdata-sections”和“-Wl, - gc-sections”来删除未使用的代码和数据。但是如何删除未使用的bss符号?

1 个答案:

答案 0 :(得分:2)

当我们说在bss中用0“初始化的全局变量”时,实际上变量在二进制文件中不存在。

当您的程序开始运行时,它将在RAM中保留一个部分并用零填充此部分。程序中访问bss变量的位置将指向此部分。

bss中的变量不占用二进制图像中的空间。

bss和数据之间的区别仅在于我们知道一些值在开头是零,我们不需要将它们存储在二进制图像中,从而减小了可执行文件的大小。

在RAM(或运行程序的虚拟内存)中,使用您提到的那些标志,bss中的变量也会被删除。

您可以通过一个简单的程序来检查: 如果您使用的是linux,请转到/ tmp并编写一个hello.c

#include<stdio.h>

int var1 = 0;

int var2 = 2;

int main()
{
    printf("Hello\n");
    return 0;
}

现在,输入:

make hello

objdump --sym hello | less

您将看到var1和var2在那里。

现在输入:

rm hello && make hello CFLAGS="-fdata-sections -ffunction-sections -Wl,--gc-sections"

objdump --sym hello | less

你不会再找到它们了。