[英]How can we remove unused bss symbol?
我们知道,我们可以使用“-ffunction-sections -fdata-sections”和“-Wl, - gc-sections”来删除未使用的代码和数据。 但是如何删除未使用的bss符号?
当我们说全局变量在bss中用0“are”初始化时,实际上变量在二进制文件中不存在。
当程序开始运行时,它将在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
你不会再找到他们了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.