Gcc 如果从节中删除空载,则从elf文件生成的二进制文件将爆炸

Gcc 如果从节中删除空载,则从elf文件生成的二进制文件将爆炸,gcc,linker,linker-scripts,objcopy,Gcc,Linker,Linker Scripts,Objcopy,我们有一个带有自定义部分的链接器脚本,它是出于某些IEC符合性测试的原因而添加的。然而,自从添加此部分后,通过objcopy-O二进制输入输出创建的二进制大小从~150kbytes激增到~512Mbytes 我已经找到了缺少(NOLOAD)属性的部分。我还可以解释为什么二进制文件是512Mbytes 我们的记忆如下: MEMORY { rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 ram (rwx) : OR

我们有一个带有自定义部分的链接器脚本,它是出于某些IEC符合性测试的原因而添加的。然而,自从添加此部分后,通过
objcopy-O二进制输入输出创建的二进制大小从~150kbytes激增到~512Mbytes

我已经找到了缺少
(NOLOAD)
属性的部分。我还可以解释为什么二进制文件是512Mbytes

我们的记忆如下:

MEMORY
{
    rom    (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000
    ram    (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00007580

    CUSTOM_SECTION (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00001000
}
最初定义的部分是:

    CUSTOM_LOCATION:
    {
        CUSTOM_BEGIN = .;
        KEEP(*(CUSTOM_LOCATION));
        CUSTOM_END = .;

    } > CUSTOM_SECTION AT > ram
如果将
自定义位置:
替换为
自定义位置(空载):
生成的二进制文件是正常的sice。如果没有
(无加载)
,二进制大小约为512Mbytes

我正在寻找这个二进制文件变大的原因。在生成二进制文件时,
(无加载)
(或无加载)对
objcopy
意味着什么

第二个问题,在本节末尾,我们说
}>CUSTOM\u section at>ram
没有这个指令我们能做什么?它能被ram替换吗?(这是否可以从
内存中删除
自定义部分


我在生成的
映射
文件

中没有看到任何区别。当objcopy创建一个二进制文件时,它基本上执行与OS-ELF加载程序相同的工作:它将可加载的ELF文件部分写入一个表示运行时内存的文件中

二进制文件将包含代码和数据的每个字节,从基址到最高字节。如果内存映像稀疏(存在“无”区域),则二进制文件也将包含大面积的无。这只能在哑二进制文件中表示为零

您的elf文件包含从地址0x00000000(ROM的底部)到0x20000fff(自定义_部分的顶部)的数据,这是一个刚刚超过500MB的范围,因此二进制文件必须有这么多字节才能保存所有数据。通过使该部分不可加载,您的意思是在运行时不需要数据,因此不需要在二进制映像中。调试信息、注释和其他非程序ELF dat通常就是这种情况a


好消息是:a)许多文件系统将只为文件的非零部分使用磁盘空间,因此它不会使用看起来那么多的磁盘(“稀疏文件”),b)二进制文件将很容易压缩。

谢谢您的回答。对我们来说,这是一个问题,因为我们的工件库将文件保存为512MB,而我们的MCU程序员也无法处理它:-)。