انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: Saman.S در 07 تیر 1388، 04:09 بظ
-
سلام
من وقتی که توابع 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 حجم فایل رو شدیدا اضافه می کنه.
-
ببین باید تو برنامه ای که با سی هم نوشتی کامپایل کنی و فایل آبجکتت رو با این برنامه اسمبلی پیوند بزنی
مثل این:
gcc -c test.c -o test.o
nasm -f aout testasm.asm -o testasm.o
ld test.o testasm.o
-
ببین باید تو برنامه ای که با سی هم نوشتی کامپایل کنی و فایل آبجکتت رو با این برنامه اسمبلی پیوند بزنی
مثل این:
gcc -c test.c -o test.o
nasm -f aout testasm.asm -o testasm.o
ld test.o testasm.o
مرسی از این که پاسخ دادید. اما من نمی خوام خودم تابع بنویسم و بعد لینک کنم. بلکه می خوام از توابع استاندارد زبان c استفاده کنم(مثل printf,scanf,malloc و ...)
-
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)
saman@saman-desktop:~/BIN/ASM/test$ ls
c.asm
saman@saman-desktop:~/BIN/ASM/test$ nasm -f elf c.asm
saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
saman@saman-desktop:~/BIN/ASM/test$ ls
c c.asm c.o
saman@saman-desktop:~/BIN/ASM/test$ ./c
bash: ./c: No such file or directory
-
شرمنده دیر جواب دادم من خیلی فرصت نمی کنم به اینجا سر بزنم سر فرصت کامل برات توضیح میدم برای رفع مشکلت چیکار کنی...
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)
ببین
saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
اینجا تو داری هم با سویچ l اسم فایل لیستت رو c می زاری هم با سویچ o اسم خروجی برنامت رو c می زاری یکیشون رو تغییر بده...
-
شرمنده دیر جواب دادم من خیلی فرصت نمی کنم به اینجا سر بزنم سر فرصت کامل برات توضیح میدم برای رفع مشکلت چیکار کنی...
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)
ببین
saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
اینجا تو داری هم با سویچ l اسم فایل لیستت رو c می زاری هم با سویچ o اسم خروجی برنامت رو c می زاری یکیشون رو تغییر بده...
سوییچ l می گه که از کدوم کتابخونه استفاده بشه. مثلا -lc یعنی که از کتابخونه ی libc.so استفاده بشه و ریطی به اسم فایل نداره. نمی دونم مشکل از چیه. خروجی ls هم گذاشتم. فایل c واقعا وجود داره! در ضمن خروجی ls قبل از اجرای دستور رو هم گذاشتم تا ببینید که فایل c از قبل وجود نداشته!
-
اوه من اشتباه گرفتم با سویچ l در nasm...
-
چیکار کنم ](*,) ](*,) ](*,)