众所周知,我们可以使用“ -ffunction-sections -fdata-sections”和“ -Wl,--gc-sections”删除未使用的代码和数据。但是如何删除未使用的bss符号?
最佳答案
当我们说全局变量在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
您将不再找到它们。
关于c - 如何删除未使用的bss符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17483687/