PDA

View Full Version : مشکل لینک کردن آبجکت فایل



jeson_park
یک شنبه 06 فروردین 1391, 15:04 عصر
با سلام
یه کرنل داریم که از 2 بخش تشکیل شده یه فایل Asm و یه فایل .c
فایل Asm رو با NASM اسمبل می کنم مشکلی نداره
nasm -f aout kernel.asm -o k.o
فایل سی هم مشکلی نداره
gcc -c kernel.c -o kernel.o
اما موقع کار با ld و لینک کردن خطا می ده
ld -T link.ld -o kernel.bin k.o kernel.o
متن خطا هم اینه


k.o:file not recognized: File format not recognized

این هم اسکریپت link.ld هست



OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
.text 0x100000 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(4096);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(4096);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .; _end = .; __end = .;
}


ممنون میشم راهنمایی کنید

jeson_park
سه شنبه 08 فروردین 1391, 09:51 صبح
یعنی الان کسی نیست جوا منو بده؟!؟؟! :عصبانی++:

pswin.pooya
سه شنبه 08 فروردین 1391, 11:42 صبح
سلام
آخه نحوه كامپايل شما هم مشكل داره. Makefile آراكس رو نگاه كن متوجه ميشي:
http://arax.svn.sourceforge.net/viewvc/arax/Makefile?revision=17&view=markup

jeson_park
سه شنبه 08 فروردین 1391, 14:09 عصر
من make file ندارم
کرنل خیلی کوچیکه!
فقط می خوام زودی بوت شه و تابع سی رو صدا بزنه
راه حلی سراغ ندارین؟؟
پلت فرمم ویندوز 7 هست
مشکل چیه؟؟

pswin.pooya
چهارشنبه 09 فروردین 1391, 16:17 عصر
من make file ندارم

نگفتم كه make بنويس گفتم از روش نحوه كامپايل كردن رو نگاه كن. بدون make و لينوكس به نظر من فايده نداره

jeson_park
پنج شنبه 10 فروردین 1391, 17:50 عصر
نگفتم كه make بنويس گفتم از روش نحوه كامپايل كردن رو نگاه كن. بدون make و لينوكس به نظر من فايده نداره
ببنید پروژه کوچیک هست نمی خوامواسه یه پروژه کوچیک لینوکس نصب کنم و درگیرش شم
حالا اصلا درحالت کلی چه راه هایی برای لینک کردن 2 تا کد (یکی اسمبلی و یکی هم سی ) به وجود داره؟

pswin.pooya
پنج شنبه 10 فروردین 1391, 22:16 عصر
كار خيلي راحتي هست. اگر ميخوايين داخل اسمبلي توابع رو تعريف كنيد بايد از استاندارد cdecl استفاده بكنيد و بعدش پروتوتايپ تابع رو بنويسيد و دست آخر لينك كنيد و بر عكس اگر ميخواييد توابع سي رو از داخل اسمبلي صدا كنيد كافيه كه از دستور call استفاده بكنيد. داخل آراكس هر دو نمونه اون هست.

xman_1365_x
شنبه 12 فروردین 1391, 01:39 صبح
k.o:file not recognized: File format not recognized
فایل فرمت های دیگه رو امتحان کنید
nasm -f elf -o boot.o [your asm file here]
nasm -f coff -o boot.o [your asm file here]

jeson_park
سه شنبه 15 فروردین 1391, 17:22 عصر
فایل فرمت های دیگه رو امتحان کنید
nasm -f elf -o boot.o [your asm file here]
nasm -f coff -o boot.o [your asm file here]



ld: cannot preform PE operations on non PE output file "kernel.bin".

xman_1365_x
سه شنبه 15 فروردین 1391, 23:33 عصر
چرا k.o رو در لینکر بکار بردین؟ به صورت زیر عمل کنید ببینید مشکلتون حل میشه اینطوری باید دو فایل bin برای خروجی داشته باشید که بوت bin در سکتور0 کپی میشه البته اگر هر دو فایل مربوط به کرنل نباشه،اگر مشکل حل نشد سورس رو قرار بدین

nasm –f bin –o boot.bin boot.asm
gcc -c -o kernel.o kernel.c

linker script:



OUTPUT_FORMAT("binary")
INPUT(kernel.o)
ENTRY(_main)
SECTIONS
{
.text 0x40000 :
{
*(.text)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}



ld -T link.ld -o kernel.bin


موفق باشی

jeson_park
چهارشنبه 16 فروردین 1391, 22:17 عصر
با تشکر از شما
بنده در پست اول گفتم
کرنل 2 بخش داره
یه فایل Asm که بوت لودر هست


[BITS 32] ; This is 32-bit Code

[global start] ;make an assembly language label global (accessible outside the file)
[extern _k_main] ; this is in the c file..reson of using '_'
;This is because C/C++ compilers add an underscore( _ ) in front of all C/C++ functions

start:
call _k_main

cli ; stop interrupts,interrupts can awake the CPU from a hlt instruction
hlt ; halt(stop) the CPU and tells the CPU to stop executing

times 510 - ($-$$) db 0 ; $-$$ returns the number of bytes from the current line to the start write distance between 0-510 bye with '0'
dw 0xAA55 ; write last tow byte AA 55


یه فایل .c که هسته اصلی هست و از داخل فایل Asm صدا زده می شه

حالا 2 فایل خروجی bin داشته باشم چه طوری لودشون کنم؟؟
-=-=-edit-=-=-=-=
باز هم موقع کامپایل ارور داد
http://up98.org/upload/server1/02/g/1eo8piaaqya1pcnf7.png

xman_1365_x
پنج شنبه 17 فروردین 1391, 00:05 صبح
ساختار را اشتباه نوشتین ، به لینک های زیر برین تا مشکلتون حل شه،کد سی تونم هم که میدونید نباید از فایل کتابخانه سی استفاده کنید
Hello World Boot Loader (http://www.osdever.net/tutorials/view/hello-world-boot-loader)
How to develop your own Boot Loader (http://www.codeproject.com/Articles/36907/How-to-develop-your-own-Boot-Loader)
OS Development Tutorials (http://www.osdever.net/tutorials/index)
موفق باشی

jeson_park
پنج شنبه 17 فروردین 1391, 12:10 عصر
ساختار را اشتباه نوشتین ، به لینک های زیر برین تا مشکلتون حل شه،

اتفاقا این کرنل من هم مربوط میشه به یکی از همین لینک ها
اینجا (http://www.osdever.net/tutorials/view/writing-a-simple-c-kernel)



کد سی تونم هم که میدونید نباید از فایل کتابخانه سی استفاده کنید
موفق باشی
بله می دونم اما دلیلش رو نمی دونم ..قربون دستت میشه توضیح بدین چرا؟!؟!؟ :لبخند:
دیگه نرم الکی تاپیک جدا بزنم :لبخندساده:
قبلا هم اینجا (http://barnamenevis.org/showthread.php?314311-%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA-%D8%B3%D9%88%D8%B1%D8%B3-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%D9%87%D8%A7%DB%8C-c-c)درخواست سورس کتابخانه رو داده بودم ( که نخواد دوباره بشینم همه رو بنویسم )
با تشکر

nimvb123456
پنج شنبه 17 فروردین 1391, 17:00 عصر
بوت لودرت ایراد داره
باید با استفاده از یک بوت لودر مثل grub به protected mode سوئیچ کنی
از همون صفحه که مطالعه کردی و کد رو نوشتی ازش ،اگه توجه می کردی در پایین صفحه بهش اشاره کرده !
یک فایل ضمیمه گذاشتم،یاد میده که چه جوری کرنل رو با grub بوت کنیم و خود grub رو هم داره
با تشکر

jeson_park
پنج شنبه 17 فروردین 1391, 22:10 عصر
با تشکر از شما
می تونستم از GRUB استفاده کنم اما خب می خوام خودم به بوت لودر ساده بنویسم
چون مبدتی هستم نمی خوام درگیر مسائلی مثل MAKEFILE یا مثلا همین grub برای بوت بشم

nimvb123456
پنج شنبه 17 فروردین 1391, 23:45 عصر
با تشکر از شما
می تونستم از GRUB استفاده کنم اما خب می خوام خودم به بوت لودر ساده بنویسم
چون مبدتی هستم نمی خوام درگیر مسائلی مثل MAKEFILE یا مثلا همین grub برای بوت بشم

به نظر من بیشتر رو کرنل تمرکز کن تا بوت لودر!
به هر حال اگه می خوای بوت لودر رو از اول خودت بنویسی، به لینک زیر یه سر بزن

http://www.brokenthorn.com/Resources/OSDevIndex.html

jeson_park
جمعه 18 فروردین 1391, 10:02 صبح
دوستان از این حرف من ناراحت نشید
اما هر کی رسیده اینجا یا گفته "بوت لودر رو عوض کن" یا گفته " به لینک های زیر سری بزنید"
دوستان لینک هایی که شما دادید رو من خودم دارم و قبلا مطالعه کردم!
این لینک آخری هم که در پست 16 گفته شده و بنده خودم دارم
الان هم قسمت "Tutorial 5: Bootloaders 3" رو دارم می خونم
خواهش می کنم اگه می خواید لینک بدین ..پست ندین بهتره!
یه بار پست شماره 1 این تاپیک رو بخونید اگه می تونید راهنمایی کنید اگه هم نه که پست ندین
ممنون

xman_1365_x
جمعه 18 فروردین 1391, 16:28 عصر
شما در وبندوز به کار بردین که فکر میکنم پیش فرض براتون pe فرمت ساخته که باید از سوئیچ elf استفاده کنید
برنامه در لینوکس به راحتی لینک شد ، فقط باید در فایل سی k_main با آندرلاین شروع بشه که ویرایش کنید
بعد هم باید با لودر بوتش کنید که خود سایتش گفته با grub یا با لودر bootf02 bootsector (http://www.osdever.net/downloads/bootsectors/bootf02.zip) این کار رو انجام بدین(اگر خواستین لودر شخصی بنویسید هر دور نگاهی بندازین دومی ساده تره میگرده دنبال فایل و در حافظه بار میکنش)

فایل های راهنما برای ساخت دیسک بوت ایبل و کپی کرنل درون فایل فشرده موجود هست

برای دانلود ابزار های مورد نیاز هم به این (http://www.osdever.net/downloads.php)لینک برین

در این (http://www.shabgard.org/forums/showthread.php?t=21974)لینک هم joker گرامی آموزش کار بار ابزار های شبیه ساز رو توضیح دادن



بله می دونم اما دلیلش رو نمی دونم ..قربون دستت میشه توضیح بدین چرا؟!؟!؟
وقتی هر سیستم هدر خودشو رو داره و کامپایلری که برای محیط خاص نوشته شده از توابع api اون سیستم عامل استفاده میکنه مثلا برای داس از وقفه های داس استفاده میکنه که این توابع ناشناخته هست چرا که این توابع توسط سیستم عامل در حافظه رم قرار میگیره


قبلا هم اینجا درخواست سورس کتابخانه رو داده بودم ( که نخواد دوباره بشینم همه رو بنویسم )
در قسمتی گفتین پروژه کوچیکه اما اگر قصد ادامه دادن داشتین با پویا جان(pswin.pooya) همکاری کنید که چند سالی وقت گذاشتن نخواین از اول همه کار هارو تکرار کنید ، فقط اگر روش بهتری بود توابع رو بهینه یا ایجاد میکنید

البته پویا جان از grub استفاده کرده که نظر شخصیم اینه همه موارد باید بومی سازی بشه


ببنید پروژه کوچیک هست نمی خوامواسه یه پروژه کوچیک لینوکس نصب کنم و درگیرش شم
یک wmware و نصب لینوکس که زمانی نمیبره و شما هم نمیخوای با سیستم عاملش آشنا شی فقط دستورات رو در کنسولش وارد میکنی و از ابزار هاش استفاده میکنید
پیشنهاد میکنم لینوکس ubuntu رو نصب کنی نسخه 32 بیتی که باز درگیر سوییچ های تبدیل به 32 بیت و ساختار فایل که در ویندوز بهش برخوردی نشی بگی کامپایل یا لینک نشد


دوستان از این حرف من ناراحت نشید
چطور نشیم رو نمیدونم همه قصد کمک به شما برای حل مشکلتون رو دارن و وقت میزارن... ، شما توی سایت تخصصی سیستم عامل میخوای عضو شی ازت سوال تخصصی میکنه ببینه چیزی میدونی یا نه ، بیشتر موارد کارها تکراری هست و باید به مراجع رفت برای مطالعه بیشتر ، خطا هایی ها که شما قرار دادین بخاطر اجرای اون در سیستم عامل ویندوز هست که فکر میکنم ساختار پیش فرض سی برای کامپایل pe هست و باید تبدیل به elf بشه و یا موارد مشابه
به فرمت فایل های زیر نگاه کنید:

--------------------------------------------------------------------------------------

http://www.osdever.net/tutorials/view/writing-a-simple-c-kernel

--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------
assemble & compile & link
--------------------------
xman@ubuntu:~/Desktop/kernel$ nasm -f aout kernel_start.asm -o ks.o

xman@ubuntu:~/Desktop/kernel$ gcc -c kernel.c -o kernel.o

xman@ubuntu:~/Desktop/kernel$ ld -T link.ld -o kernel.bin ks.o kernel.o


--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------
file format
------------
xman@ubuntu:~/Desktop/kernel$ file ks.o
ks.o: Linux/i386 impure executable (OMAGIC)


xman@ubuntu:~/Desktop/kernel$ file kernel.o

kernel.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

xman@ubuntu:~/Desktop/kernel$ file kernel.bin
kernel.bin: ASCII text

--------------------------------------------------------------------------------------


اینم خروجی برنامه:

85339
موفق باشی