【发布时间】: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 程序汇编等效指令,其余的我不知道它来自哪里。
有什么帮助吗?
谢谢。
【问题讨论】: