2016-04-15 29 views
3

できるだけ小さなELFを作成しようとしています。このリンカスクリプトでBinutils LDは巨大なファイルを作成します

SECTION .text 
dd 0xdeadbeef 

:私はこのようなテストファイル(NASMの文法)を作成し

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

は、その後、私は2つの方法で構築されたフラットなバイナリと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 
関連する問題