2016-04-15 6 views
3

Ich versuche, so kleine ELF wie möglich zu erstellen. Ich habe eine Testdatei wie diese (NASM Syntax):Binutils LD erstellt riesige Dateien

SECTION .text 
dd 0xdeadbeef 

Mit dieser Linker-Skript:

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

Dann habe ich gecheckt Größen von Flach binär und ELFs gebaut zwei Möglichkeiten:

nasm -f bin -o test test.asm 

Es ist flach binär, also 4 Bytes.

Ich würde etwas wie 500 Bytes maximal erwarten, aber die resultierende Datei ist 4396 Bytes lang! Es gibt jedoch eine Option namens --strip-all, die diese Datei verkleinern könnte.

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

4244 Bytes. Immer noch riesig.

Warum erzeugt LD so große Dateien? Gibt es eine Möglichkeit, es kleiner zu machen?

Antwort

2

Der Linker richtet Seite Ihren Textabschnitt an die nächste Seitengrenze aus, sodass demand paging verwandt werden kann.

$ 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 

Beachten Sie die „Align“ Spalte des Textabschnitts auf 4 KB gesetzt. Da das Alignment auf 4 KB eingestellt ist und das Paging für die Anforderung verwendet wird (D_PAGED), befindet sich der Abschnitt .text 4 KB in der Datei. Ihr Textabschnitt ist nur 4 Bytes lang.

Verbindung mit -n auf Demand-Paging zu deaktivieren:

$ 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