linux程序集“collect2:ld返回1退出状态”

时间:2015-10-29 17:20:09

标签: linux gcc assembly

我在网上编码的网站上输入了源代码。

但我在源代码下面收到错误。

我想我省略了“主要”。

由于我学习了Intel assmbly,我不知道如何修复它。

你能帮帮我吗?

感谢您提前帮助我。

SECTION .DATA
    hello:     db 'Hello world!',10
    helloLen:  equ $-hello

SECTION .TEXT
    GLOBAL _START

_START:


; Write 'Hello world!' to the screen
mov eax,4            ; 'write' system call
mov ebx,1            ; file descriptor 1 = screen
mov ecx,hello        ; string to write
mov edx,helloLen     ; length of string to write
int 80h              ; call the kernel

; Terminate program
mov eax,1            ; 'exit' system call
mov ebx,0            ; exit with error code 0
int 80h              ; call the kernel

/usr/lib/gcc/i686-linux-gnu/4.6 /../../../ i386-linux-gnu / crt1.o:在函数_start': (.text+0x18): undefined reference to main'中 collect2:ld返回1退出状态

1 个答案:

答案 0 :(得分:2)

如果您只是将 GCC 用作链接器并且不关心 C 运行时,则可以通过传递{{{Jester指出)将其排除在外({ 1}}到 gcc 。然后,您需要提供-nostdlib符号,以便代码如下所示:

_start

你会像这样组装和链接它:

SECTION .DATA
    hello:     db 'Hello world!',10
    helloLen:  equ $-hello

SECTION .TEXT
    GLOBAL _start

_start:
; Write 'Hello world!' to the screen
    mov eax,4            ; 'write' system call
    mov ebx,1            ; file descriptor 1 = screen
    mov ecx,hello        ; string to write
    mov edx,helloLen     ; length of string to write
    int 80h              ; call the kernel

    ; Terminate program
    mov eax,1            ; 'exit' system call
    mov ebx,0            ; exit with error code 0
    int 80h              ; call the kernel

或者,您可以直接与nasm -f elf file.asm gcc -m32 -nostdlib -o file file.o 关联,这样您也可以这样做:

ld

这将生成一个名为nasm -f elf file.asm ld -melf_i386 -o file file.o

的32位Linux可执行文件

使用C库/运行时

虽然我不认为以下是您的意图,但有人可能会发现以下信息有用:

您可以使用 GCC ,并通过将file重命名为_START,使 C 库可用于汇编代码。 C 运行时包含一个名为main的入口点,它处理初始化,然后调用名为_start的函数。您可以利用 C 库,但main必须正确设置堆栈帧并正确清理并在完成后返回,因为main将被视为 C 功能。代码看起来像这样:

main

此示例使用EXTERN printf ; Tell the assembler printf is provided outside our file SECTION .DATA hello: db 'Hello world!',10,0 ; Null terminate for printf helloLen: equ $-hello-1 ; Exclude null by reducing len by 1 SECTION .TEXT GLOBAL main ; main is now a C function main: push ebp ; Setup stack frame mov ebp, esp push ebx ; We need to preserve EBX (C Calling convention) ; Write 'Hello world!' to the screen mov eax,4 ; 'write' system call mov ebx,1 ; file descriptor 1 = screen mov ecx,hello ; string to write mov edx,helloLen ; length of string to write int 80h ; call the kernel ; Write 'Hello World!' with C printf push hello ; push the address of string to print call printf ; call printf in C library add esp, 4 ; Restore stack pointer ; push hello pushed 4 bytes on stack mov eax, 0x0 ; Return value of 0 pop ebx ; Restore EBX leave ret ; Return to C runtime which will cleanup and exit 系统调用来编写标准输出,并使用 C int 0x80执行相同操作。您可以使用:

组合并链接到名为printf的可执行文件
file