GCC gibt Fehler "undefined Referenz auf" printf "aus, wenn eine NASM externe Anweisung zum Zugriff auf printf verwendet
Frage
Ich lerne Nasm und binde, diesen Code zu kompilieren (den ich gefunden habe hier). Es montiert mit diesem NASM -Befehl:
nasm -f coff -l printf.lst printf1.asm
zu printf.o
Aber dieser Befehl GCC Verknüpfung:
gcc -o printf1 printf1.o
fällt mit dem Fehler fehl:
printf1.o:printf1.asm:(.text+0x1a): undefined reference to `printf'
collect2: ld returned 1 exit status
Was mache ich falsch? Danke im Voraus. (BEARBEITEN: Ich bin unter 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
Lösung
Ich glaube, Sie müssen das machen _printf
um der C -Calling Convention zu entsprechen (genau wie Sie verwendet haben _main
Anstatt von main
).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow