Linux ld:警告:找不到输入符号\u start;默认为0000000000 401000
这是我在Linux Ubuntu中使用汇编语言编写代码时遇到的错误。有人能帮我解决这个错误吗 这是我使用命令Linux ld:警告:找不到输入符号\u start;默认为0000000000 401000,linux,assembly,nasm,ld,Linux,Assembly,Nasm,Ld,这是我在Linux Ubuntu中使用汇编语言编写代码时遇到的错误。有人能帮我解决这个错误吗 这是我使用命令ld-o quadratic.o 我的asm文件的代码如下: ld本身没有链接库或启动代码。它适用于使用\u start作为入口点,通过直接调用内核而不是标准的C库函数进行I/O的程序。但是您的程序使用main作为其入口点,因此它希望被C启动代码调用,并调用库函数,如printf。因此,您应该将其链接为C程序: gcc -no-pie -o quadratic quadratic.o
ld-o quadratic.o
我的asm文件的代码如下:
ld本身没有链接库或启动代码。它适用于使用\u start
作为入口点,通过直接调用内核而不是标准的C库函数进行I/O的程序。但是您的程序使用main
作为其入口点,因此它希望被C启动代码调用,并调用库函数,如printf
。因此,您应该将其链接为C程序:
gcc -no-pie -o quadratic quadratic.o
由于您的代码绝对引用静态数据,例如fld qword[b]
,因此不需要使用-无饼图
选项。默认情况下,gcc假设您想要构建一个独立于位置的可执行文件,但它不能做到这一点;您需要编写fldqword[rel b]
来生成一个rip相对有效地址。因此,-no pie
要求gcc链接一个非位置独立的可执行文件。有关详细信息,请参阅。ld本身没有库或启动代码链接。它适用于使用\u start
作为入口点,通过直接调用内核而不是标准的C库函数进行I/O的程序。但是您的程序使用main
作为其入口点,因此它希望被C启动代码调用,并调用库函数,如printf
。因此,您应该将其链接为C程序:
gcc -no-pie -o quadratic quadratic.o
由于您的代码绝对引用静态数据,例如fld qword[b]
,因此不需要使用-无饼图
选项。默认情况下,gcc假设您想要构建一个独立于位置的可执行文件,但它不能做到这一点;您需要编写fldqword[rel b]
来生成一个rip相对有效地址。因此,-no pie
要求gcc链接一个非位置独立的可执行文件。有关这方面的更多信息,请参阅。仍然有效。此错误即将发生。在创建饼图对象时,无法使用针对“bss”的R_X86_64_32S;使用-fPIE collect2重新编译:错误:ld返回了1个退出状态可能默认rel
(在任何内存访问之前)会有所帮助。@VEDANTDAWANGE:您的代码需要-无饼图
。请参见编辑。@VEDANTDAWANGE:您应该始终使用默认rel
;RIP相对访问更有效。但是,如果您没有通过PLT或GET手动间接调用任何库函数,那么您可能需要-无饼图。另外,通常没有太多理由在x86-64上使用旧式x87作为浮点;用于movsd
/addsd
等的SSE2保证可用。x87只在需要比64位双精度更高的精度时才最有用,但80位x87就足够了。@ecm:令人惊讶的是,default rel
会影响出现在它前面的内存引用,至少在我上次检查时是这样。IDK,如果这是故意的或者是NASM错误,但是你可以把它放在一个文件的末尾。看起来仍然有效。此错误即将发生。在创建饼图对象时,无法使用针对“bss”的R_X86_64_32S;使用-fPIE collect2重新编译:错误:ld返回了1个退出状态可能默认rel
(在任何内存访问之前)会有所帮助。@VEDANTDAWANGE:您的代码需要-无饼图
。请参见编辑。@VEDANTDAWANGE:您应该始终使用默认rel
;RIP相对访问更有效。但是,如果您没有通过PLT或GET手动间接调用任何库函数,那么您可能需要-无饼图。另外,通常没有太多理由在x86-64上使用旧式x87作为浮点;用于movsd
/addsd
等的SSE2保证可用。x87只在需要比64位双精度更高的精度时才最有用,但80位x87就足够了。@ecm:令人惊讶的是,default rel
会影响出现在它前面的内存引用,至少在我上次检查时是这样。IDK,如果这是故意的或者是NASM错误,但是你可以把它放在一个文件的末尾。这不是一个错误,而是一个警告。这就是为什么您可以汇编并链接一个.asm
,其中只包含一条您想在调试器中单步执行的指令。例如cat>foo.asm
/mov-rax,1234
/control-d/nasm/ld/gdb./a.out这不是错误,而是警告。这就是为什么您可以汇编并链接一个.asm
,其中只包含一条您想在调试器中单步执行的指令。如cat>foo.asm
/mov-rax,1234
/control-d/nasm/ld/gdb./a.out