链接描述文件中的 MEMORY 命令使二进制大小膨胀

MEMORY command in linker script bloat the binary size

我想要一个在 2 个不同内存位置加载的图像,并且所有地址链接都在 compile/link 时间完成。

总体objective我要达到

  1. 为文本和数据定义不同的加载区域
  2. 根据加载地址解决所有符号依赖关系
  3. 将文本和数据区域背靠背放在图像中(我的加载程序会在 运行 时将文本部分放到不同的地址)

所以我创建了以下脚本

MEMORY
{
    mem1 : ORIGIN = 0xfff00000, LENGTH = 100K
    mem2 : ORIGIN = 0xfff80000, LENGTH = 100K
}

SECTIONS
{
    . = 0xfff00000;

    _image_base_origin = . - 0;


    ////////////////////////////////
    // TEXT
    ////////////////////////////////
    .text : {
         _text_origin = .;
         . = ALIGN(4); _text_offset = . - _image_base_origin;  *(.vectors)      *(.text) *(.eh_frame)
     } > mem2
     _text_size = . - _text_origin;

    ////////////////////////////////
    // DATA
    ////////////////////////////////
    .data : {
            _data_origin = .;
            . = ALIGN(8); _data_offset = . - _image_base_origin;  *(.data) *(.comment) *(.rodata*) *(.bss*)
     } > mem1
     _data_size = . - _data_origin;

}

我面临的问题是,当我将图像的文本部分放入 mem2 时,二进制文件的大小增加了许多倍。

如果我 运行 阅读我的文件

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 5] .text             PROGBITS        fff80000 020000 0017a8 00  AX  0   0 32
  [ 6] .data             PROGBITS        fff00398 010398 0004f8 00  WA  0   0  8

因此图像大小变为 80000 + 17a8 。它在图像中添加 mem2 的偏移量并创建二进制文件。它用零填充所有额外的内存。

如果我只将文本部分放在 mem1 中,那么我的图像尺寸非常小(它不会向我的图像添加偏移量 80000)。

你能帮我一下吗?

较大的文件大小无疑是为了满足 vma % pagesize == file_offset % pagesize 的需求分页要求。如果您的系统不是按需分页的,那么您可以 link 使用 -n。如果您的系统是按需分页的,那么 ld 默认页面大小可能不必要地大。 -z max-page-size 选项可以解决这个问题。