【问题标题】:ld 链接器在输出到二进制文件时添加了额外的汇编指令
【发布时间】:2022-01-23 05:47:44
【问题描述】:

我有一个 C 源文件,它只包含一个函数,它什么都不做,只向函数返回一个值,我通过使用 gcc -ffreestanding 选项从它生成了一个目标文件,以输出一个没有标准库和入口点的目标文件但是当我尝试使用 gnu 链接器输出二进制文件时,它会向它添加额外的汇编指令,下面是源文件

int test_function() {
    return 0x4141;
}

我使用这个 gcc 命令生成了一个目标文件 gcc -ffreestanding -c source.c -o source.o

我将此命令用于 ld 链接器 ld -o source.bin -Ttext 0x0 --oformat binary source.o

使用链接器后得到的结果是

使用 ndisasm -b 32 source.bin

转储
00000000  F30F1EFA          rep hint_nop55 edx
00000004  55                push ebp
00000005  48                dec eax
00000006  89E5              mov ebp,esp
00000008  B8BABA0000        mov eax,0xbaba
0000000D  5D                pop ebp
0000000E  C3                ret
0000000F  0000              add [eax],al
00000011  0000              add [eax],al
00000013  0000              add [eax],al
00000015  0000              add [eax],al
00000017  0000              add [eax],al
00000019  0000              add [eax],al
0000001B  0000              add [eax],al
0000001D  0000              add [eax],al
0000001F  0000              add [eax],al
00000021  0000              add [eax],al
00000023  0000              add [eax],al
00000025  0000              add [eax],al
00000027  0000              add [eax],al
00000029  0000              add [eax],al
0000002B  0000              add [eax],al
0000002D  0000              add [eax],al
0000002F  0000              add [eax],al
00000031  0000              add [eax],al
00000033  0000              add [eax],al
00000035  0000              add [eax],al
00000037  0000              add [eax],al
00000039  0000              add [eax],al
0000003B  0000              add [eax],al
0000003D  0000              add [eax],al
0000003F  0000              add [eax],al
00000041  0000              add [eax],al
00000043  0000              add [eax],al
00000045  0000              add [eax],al
00000047  0000              add [eax],al
00000049  0000              add [eax],al

add [eax], al asm 指令是由链接器添加的,我只是不想这样,我只想要 .text 段(前 7 条指令)是 C 程序汇编等效指令,其余的我不知道它来自哪里。

有什么帮助吗?

谢谢。

【问题讨论】:

    标签: c gcc linker nasm ld


    【解决方案1】:

    这些说明是对齐所必需的。注意字节值都是0。

    【讨论】:

    • 哦,是的,我明白了,所以它不会影响内存?
    • 我的意思是空间方面?
    • 填充是执行的。它一直持续到 0x1000 [和更远一点]。这是十进制的 4096,即一页的大小。可能对齐以在页面边界上启动 .data 部分。尝试添加一些全局数据。如果你这样做,你会看到填充到初始化数据开始的 0x3000。
    • 嗯,我明白了,非常感谢。
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2016-09-13
    • 1970-01-01
    • 2013-03-02
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多