gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:47:20 25 4
gpt4 key购买 nike

众所周知,我们可以使用“-ffunction-sections -fdata-sections”和“-Wl, --gc-sections”来删除未使用的代码和数据。但如何删除未使用的 bss 符号呢?

最佳答案

当我们说用0初始化的全局变量"is"在bss中时,实际上该变量在二进制文件中并不存在。

当你的程序开始运行时,它将在 RAM 中保留一个部分,并用零填充该部分。程序中访问 bss 中变量的位置将指向此部分。

bss 中的变量不占用二进制镜像中的空间。

bss 和 data 之间的区别在于,我们知道某些值在开始时为零,因此我们不需要将它们存储在二进制镜像中,从而减少了可执行文件的大小。

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com