ld - Binutils LD 创建超大文件

标签 ld compiler-optimization binutils

我正在尝试创建尽可能小的 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

请注意文本部分的“对齐”列设置为 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

关于ld - Binutils LD 创建超大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36649501/

相关文章:

linux - LD_PRELOAD 在动态库加载器中导致段错误

c - 链接器如何计算 .bss 部分的大小?

c++ - 什么在 cpu 成本方面更好?在运行时移位或将所有可能的值存储在数组中?

c - 强制 ld 在 ld 时间解析弱引用

gcc - 在 Solaris 10 上使用 Binutils 构建失败

c++ - 使用 boost 序列化时的链接器错误

linux - 在linux中预加载动态加载的库

Android 中的 Java 代码编译器优化

c - 如何使用 SIMD 向量化和/或并行化让编译器为字符串搜索循环输出更快的代码?

java - Java 符号的指令地址