Assembly ld不链接as生成的对象文件
我已经用C编写了一个Hello World程序。我使用命令Assembly ld不链接as生成的对象文件,assembly,gcc,x86,mingw,ld,Assembly,Gcc,X86,Mingw,Ld,我已经用C编写了一个Hello World程序。我使用命令gcc-S-o Hello.S Hello.C(代码在Hello.C中)来生成程序集,然后使用as来组装它。最后,我使用ld链接了目标代码,但它给了我以下错误: ld: a.out:hello.c:(.text+0xa): undefined reference to `__main' ld: a.out:hello.c:(.text+0x16): undefined reference to `puts' C代码如下: #includ
gcc-S-o Hello.S Hello.C
(代码在Hello.C中)来生成程序集,然后使用as
来组装它。最后,我使用ld
链接了目标代码,但它给了我以下错误:
ld: a.out:hello.c:(.text+0xa): undefined reference to `__main'
ld: a.out:hello.c:(.text+0x16): undefined reference to `puts'
C代码如下:
#include <stdio.h>
int main(void) {
printf("Hello world!\n");
}
谢谢内特·埃尔德雷奇帮我找到答案
要将
生成的文件链接为
,请使用gcc-v(文件)
,感谢Nate Eldredge帮助我获得答案
要将
生成的文件链接为
,请使用gcc-v(文件)
如果您希望main
和printf
正常工作,您还需要系统的C库,而不仅仅是libgcc
。如果使用gcc-v
链接,您将看到运行的完整goryld
命令。对于任何给定的程序,您可能不需要所有这些,但您至少需要了解它们的作用以及哪些部分是必需的。\uuuuuu main
(C name\uuuuu main
)是MinGW如何初始化其libc的,而不是使用动态链接器钩子让代码在main
之前(甚至在\u start
之前)运行,就像glibc在GNU/Linux上所做的那样。如果您想要main
和printf
工作,那么您还需要系统的C库,而不仅仅是libgcc
。如果使用gcc-v
链接,您将看到运行的完整goryld
命令。对于任何给定的程序,您可能不需要所有这些,但您至少需要了解它们的作用以及哪些部分是必需的。\uuuuuu main
(C name\uuuuu main
)是MinGW如何初始化其libc的,而不是使用动态链接器钩子让代码在main
之前(甚至在\u start
之前)运行,就像glibc在GNU/Linux上所做的那样。
.file "hello.c"
.text
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "Hello world!\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB13:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
call ___main
movl $LC0, (%esp)
call _puts
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE13:
.ident "GCC: (MinGW.org GCC Build-2) 9.2.0"
.def _puts; .scl 2; .type 32; .endef