我们知道,我们可以使用“-ffunction-sections -fdata-sections”和“-Wl, - gc-sections”来删除未使用的代码和数据。但是如何删除未使用的bss符号?
答案 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
你不会再找到它们了。