Binutils LD 创建超大文件
Binutils LD creates huge files
我正在尝试创建尽可能小的 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会生成这么大的文件?有没有办法让它变小?
链接器正在将您的文本部分与最近的页面边界对齐,以便可以使用 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
注意文本部分的 "Align" 列设置为 4KB。由于对齐设置为 4Kb 并且正在使用请求分页 (D_PAGED),因此 .text 部分位于文件中的 4Kb 处。您的文本部分只有 4 个字节长。
Link 与 -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
我正在尝试创建尽可能小的 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会生成这么大的文件?有没有办法让它变小?
链接器正在将您的文本部分与最近的页面边界对齐,以便可以使用 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
注意文本部分的 "Align" 列设置为 4KB。由于对齐设置为 4Kb 并且正在使用请求分页 (D_PAGED),因此 .text 部分位于文件中的 4Kb 处。您的文本部分只有 4 个字节长。
Link 与 -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