【问题标题】:GCC outputs error "undefined reference to `printf'" when using an NASM extern statement to access printf使用 NASM extern 语句访问 printf 时,GCC 输出错误“undefined reference to `printf'”
【发布时间】:2010-12-28 21:35:27
【问题描述】:

我正在学习 NASM 并准备编译这段代码(我找到了 here)。它使用这个 NASM 命令组装:

nasm -f coff -l printf.lst  printf1.asm

printf.o 但是这个 gcc 链接命令:

gcc -o printf1  printf1.o

因错误而失败:

printf1.o:printf1.asm:(.text+0x1a): undefined reference to `printf'
collect2: ld returned 1 exit status

我做错了什么?提前致谢。 (编辑:我使用的是 Windows 7);

; printf1.asm   print an integer from storage and from a register
; Assemble: nasm -f coff -l printf.lst  printf1.asm
; Link:     gcc -o printf1  printf1.o
; Run:      printf1
; Output:   a=5, eax=7

; Equivalent C code
; /* printf1.c  print an int and an expression */
; #include 
; int main()
; {
;   int a=5;
;   printf("a=%d, eax=%d\n", a, a+2);
;   return 0;
; }

; Declare some external functions
;
        extern  printf      ; the C function, to be called

section .data           ; Data section, initialized variables

        a: dd   5           ; int a=5;
        fmt: db "a=%d, eax=%d", 10, 0 ; The printf format, "\n",'0'


section .text               ; Code section.

        global _main        ; the standard gcc entry point
_main:              ; the program label for the entry point
        push    ebp     ; set up stack frame
        mov     ebp,esp

    mov eax, [a]    ; put a from store into register
    add eax, 2      ; a+2
    push    eax     ; value of a+2
        push    dword [a]   ; value of variable a
        push    dword fmt   ; address of ctrl string
        call    printf      ; Call C function
        add     esp, 12     ; pop stack 3 push times 4 bytes

        mov     esp, ebp    ; takedown stack frame
        pop     ebp     ; same as "leave" op

    mov eax,0       ;  normal, no error, return value
    ret         ; return

【问题讨论】:

    标签: c gcc mingw nasm


    【解决方案1】:

    我相信您需要使 _printf 匹配 C 调用约定(就像您使用 _main 而不是 main)。

    【讨论】:

    • 现在可以编译,但是当我打开“printf1.exe”时它崩溃了。有没有办法在运行时调试 NASM 制作的程序?
    • 只需在 WinDBG 或类似软件中打开即可。
    • 我所有的 gcc 链接的 NASM 程序都失败了 :( 我想知道为什么?
    • 对我来说也是如此,nasm 和 yasm 无法创建 ld 或 gcc 将构建的目标文件。并且用_printf 替换所有printfs 在Windows 中没有帮助。
    猜你喜欢
    • 2019-08-30
    • 2019-07-06
    • 2019-11-13
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多