【问题标题】:MEMORY command in linker script bloat the binary size链接描述文件中的 MEMORY 命令使二进制大小膨胀
【发布时间】:2015-07-21 14:50:10
【问题描述】:

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

我想要实现的总体目标

  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 时,我面临的问题是二进制的大小增加了很多倍。

如果我在我的文件上运行 readelf

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)。

你能帮帮我吗?

【问题讨论】:

    标签: gcc linker linker-scripts


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我的系统没有按需分页。使用 -n 选项我可以看到图像大小的改进。但是当我使用 objcopy 从输出文件到二进制文件时,我遇到了同样的问题。我想删除 elf 标头并创建一个原始二进制文件。所以我正在使用 objcopy 的 -O 选项。尽管在 -n 选项之后 elf 图像的大小现在变小了,但在 objcopy 二进制文件扩展到最大值之后(文本的 LMA + 文本的大小)。我也使用过 --section-alignment 0 但仍然是同样的问题。
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多