2016-04-15 39 views
3

我试图创建尽可能小的ELF。我创建像这样(NASM语法)的测试文件:Binutils LD创建大文件

SECTION .text 
dd 0xdeadbeef 

有了这个连接器脚本:

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

然后我查平二进制的大小和的ELFs建两种方式:

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为什么会产生这么大的文件?有没有办法让它变小?

回答

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