2016-04-15 42 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