سلام
من وقتی که توابع C رو extern می کنم, لینکر خطای undefined reference می ده. مثلا برنامه ی ساده ی زیر رو ببینید. این برنامه با استفاده از توابع scanf و printf دو عدد می گیره و مجموع این دو عدد رو نمایش میده.
extern scanf
extern printf
section .data
in_format: db "%d %d",0
out_format: db "%d",0
section .bss
num1: resd 1
num2: resd 1
section .text
_start:
push num2
push num1
push dword in_format
call scanf
add esp, 12
mov eax, [num1]
mov ebx, [num2]
add eax, ebx
push eax
push dword out_format
call printf
add esp, 8
mov eax, 1
mov ebx, 0
int 80h
حالا وقتی می خوام این برنامه رو کامپایل و لینک کنم, با این خطا روبهرو میشم.
saman@saman-desktop:~/BIN/ASM$ nasm -f elf c.asm
saman@saman-desktop:~/BIN/ASM$ ld -o c c.o
c.o: In function `_start':
c.asm:(.text+0x10): undefined reference to `scanf'
c.asm:(.text+0x2e): undefined reference to `printf'
باید چه پارامترهایی رو به ld اضافه کنم تا این خطاها برطرف شه؟خیلی گشتم. همه سایتا فقط گفته بودن که برای استفاده از توابع C دراسمبلی باید از extern استفاده کنید ولی هیچ کدوم نگفته بودن که دستور ld چه تغییری می کنه. در ضمن, لطفا نگین که به جای ld از gcc استفاده کن چون gcc حجم فایل رو شدیدا اضافه می کنه.