【问题标题】:Binutils LD creates huge filesBinutils LD 创建大文件
【发布时间】:2016-08-07 13:34:23
【问题描述】:

我正在尝试创建尽可能小的 ELF。我创建了一个这样的测试文件(NASM 语法):

SECTION .text
dd 0xdeadbeef

使用此链接器脚本:

SECTIONS {
    .text : {
        *(.text)
    }
}

然后我检查了平面二进制文件的大小,并以两种方式构建了 ELF:

nasm -f bin -o test test.asm

它是平面二进制,所以 4 个字节。

nasm -f elf -o test.o test.asm
i686-elf-ld -Tlinker.ld test.o -o test

我希望最大为 500 字节,但生成的文件长度为 4396 字节!但是,有一个名为 --strip-all 的选项可以使这个文件更小。

i686-elf-ld -Tlinker.ld test.o -o test --strip-all

4244 字节。仍然很大。

为什么 LD 会生成这么大的文件?有没有办法让它变小?

【问题讨论】:

    标签: ld compiler-optimization binutils


    【解决方案1】:

    链接器将您的文本部分与最近的页面边界对齐,以便可以使用demand paging

    $ objdump --headers -f test
    
    test:     file format elf32-i386
    architecture: i386, flags 0x00000102:
    EXEC_P, D_PAGED
    start address 0x00000000
    
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         00000004  00000000  00000000  00001000  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
    

    请注意,文本部分的“对齐”列设置为 4KB。由于对齐设置为 4Kb 并且正在使用请求分页 (D_PAGED),.text 部分位于文件中的 4Kb。您的文本部分只有 4 个字节长。

    -n 链接以禁用请求分页:

    $ ld -Tlinker.ld test.o -o test --strip-all -n
    $ objdump --headers -f test
    
    test:     file format elf32-i386
    architecture: i386, flags 0x00000002:
    EXEC_P
    start address 0x00000000
    
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         00000004  00000000  00000000  00000060  2**4
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
    $ ls -l test
    -rwxrwxr-x 1 mikel mikel 240 Apr 15 12:31 test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 2020-05-23
      • 2011-08-05
      • 2021-12-04
      • 2011-06-15
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多