Binutils LD创建了大量文件

时间:2016-04-15 14:10:55

标签: ld compiler-optimization binutils

我正在努力创建尽可能小的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生成这么大的文件?有没有办法让它变小?

1 个答案:

答案 0 :(得分:2)

链接器将您的文本部分页面对齐到最近的页面边界,以便可以使用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