どうしても解決できそうにありません。どうかお願いします
リンク内容
上記の方法もやってみましたが
NASM形式に変換するツールというのが正常に動いているのかの判断が難しいうえに
マクロ、アセンブリ側のラベルをC言語側で参照できなさそうなので
こちらの方法は諦めました。
アセンブリプログラムとCプログラムをくっつけたいです。
カーネルをすべてアセンブリ言語で書くのは嫌なのでC言語も使いたい
リンカでオブジェクトファイルをくっつけたい場合
そのオブジェクトファイルたちの形式はそれぞれ同じにしなければいけない(と聞きました)
私が最終的に作りたいのはディスクイメージです。(つまり、ELF形式とかではなくただのバイト列)
①アセンブリプログラムとCプログラムをなんらかの方法で同じオブジェクト形式のファイルを生成する。
②2つのオブジェクトファイルをgcc,ld binutilのツール群でリンクさせる
③生成された何らかの形式の実行可能ファイルからobjdumpを使いバイナリ形式に変換させる。
前提としてCプログラムにはGCC
アセンブリプログラムにはNASM を使います。
1:Cプログラム gcc
Cプログラム(リンカを使う場合セクションを決める必要があるが それ以前のところで躓いているので
今回は省略 プログラムは適当にどっかから持ってきました。)
ファイル名:sample.c
c
1int function1 (void){ 2 int i,j; 3 for(i=1;i<21;i++) 4 j= i + 100; 5 return 0; 6 }
生成したオブジェクトファイル名:sample.o
以下のコマンドを使ってオブジェクト形式に!
cmd
1gcc -c -o sample.o sample.c
objdumpで何の形式でできているのか確認します。
cmd
1 2sample.o: file format pe-i386 3 4 5Disassembly of section .text: 6 700000000 <_aaa>: 8 0: 55 push %ebp 9 1: 89 e5 mov %esp,%ebp 10 3: 83 ec 28 sub $0x28,%esp 11 6: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) 12 d: eb 0d jmp 1c <_aaa+0x1c> 13 f: 8b 45 f4 mov -0xc(%ebp),%eax 14 12: 83 c0 64 add $0x64,%eax 15 15: 89 45 f0 mov %eax,-0x10(%ebp) 16 18: 83 45 f4 01 addl $0x1,-0xc(%ebp) 17 1c: 83 7d f4 14 cmpl $0x14,-0xc(%ebp) 18 20: 7e ed jle f <_aaa+0xf> 19 22: 8b 45 f4 mov -0xc(%ebp),%eax 20 25: 89 44 24 04 mov %eax,0x4(%esp) 21 29: c7 04 24 00 00 00 00 movl $0x0,(%esp) 22 30: e8 00 00 00 00 call 35 <_aaa+0x35> 23 35: b8 00 00 00 00 mov $0x0,%eax 24 3a: c9 leave 25 3b: c3 ret
2:アセンブリプログラム nasm
アセンブリプログラム
ファイル名: boot.s
(ちょっと長いので省略)
s
1BOOT_LOAD equ 0x7C00 2ORG BOOT_LOAD 3 4;/_/_/_/_/_/_/_/ 5;マクロ 6;/_/_/_/_/_/_/_/ 7%include "../include/marco.s" 8%include "../include/define.s" 9 10;/_/_/_/_/_/_/_/ 11;BPB 12;/_/_/_/_/_/_/_/ 13 14entry: 15jmp ipl 16times 90 - ($ - $$) db 0x90 ;先頭から90バイトまでをnop命令で埋め尽くす。 17 18;/_/_/_/_/_/_/_/ 19;ブートローダー本体 20;/_/_/_/_/_/_/_/ 21
以下のコマンドを使います!
生成するファイル名: boot.o
cmd
1nasm -o boot.o boot.s
ファイル形式を確認します。
objdump
1>objdump -d boot.o 2objdump: boot.o: file format not recognized
(NASMは余計な情報を付けずにコンパイルしてくれる)
Cオブジェクトファイルのファイル形式はpe-i386
アセンブリオブジェクトファイルのファイル形式もpe-i386にしないとリンクできない(たぶん)
ので
nasmで指定できる出力形式一覧を表示
cmd
1bin flat-form binary files (e.g. DOS .COM, .SYS) 2 ith Intel hex 3 srec Motorola S-records 4 aout Linux a.out object files 5 aoutb NetBSD/FreeBSD a.out object files 6 coff COFF (i386) object files (e.g. DJGPP for DOS) 7 elf32 ELF32 (i386) object files (e.g. Linux) 8 elf64 ELF64 (x86_64) object files (e.g. Linux) 9 elfx32 ELFX32 (x86_64) object files (e.g. Linux) 10 as86 Linux as86 (bin86 version 0.3) object files 11 obj MS-DOS 16-bit/32-bit OMF object files 12 win32 Microsoft Win32 (i386) object files 13 win64 Microsoft Win64 (x86-64) object files 14 rdf Relocatable Dynamic Object File Format v2.0 15 ieee IEEE-695 (LADsoft variant) object file format 16 macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files 17 macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files 18 dbg Trace of all info passed to output stage 19 elf ELF (short name for ELF32) 20 macho MACHO (short name for MACHO32) 21 win WIN (short name for WIN32)
見た限りpe-i386はありません。
nasm -f (形式) -o boot.o boot.s
ですべてのパターンを試しましたが
bin,ith,srec以外はエラーが発生しオブジェクトファイルにするこができませんでした。
(boot.s:2: error: parser: instruction expected
ORGなどの疑似命令のところで躓きます。)
アセンブリ側もC言語側もsrec形式なら正常にオブジェクトファイルに変換することができたので
srec形式にした2つのオブジェクトファイルをリンカでくっつけます。
cmd
1>objdump -d sample.bin 2 3sample.bin: file format srec 4 5objdump: can't disassemble for architecture UNKNOWN! 6 7 8>objdump -d boot.o 9 10boot.o: file format srec 11 12objdump: can't disassemble for architecture UNKNOWN! 13 14
cmd
1>gcc boot.o sample.o 2c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: unknown architecture of input file `boot.o' is incompatible with i386 output 3c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: unknown architecture of input file `sample.o' is incompatible with i386 output 4c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../libmingw32.a(main.o):(.text.startup+0xb0): undefined reference to `WinMain@16' 5collect2.exe: error: ld returned 1 exit status 6 7 8 9 10 11 12>ld boot.o sample.o 13ld: unknown architecture of input file `boot.o' is incompatible with i386 output 14ld: unknown architecture of input file `sample.o' is incompatible with i386 output 15 16 17 18 19 20 21 22 23 24>ar rvs sample.o boot.o 25ar: sample.o: file format not recognized 26
できませんでした・・・。
何か解決策はないでしょうか?
boot.o
sample.o
同じsrec形式のはずですが・・・
なんか違いますよね?
回答4件
あなたの回答
tips
プレビュー