众所周知,我们可以使用“ -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/

10-11 23:12