繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM