だから私はこのチュートリアルに従っています。独自のUNIX玩具を発売。
サンプルソースコードをコンパイルしてみましたこのページ。ダウンロードリンクですサンプルソースコード
Makefileは次のようになります。
SOURCES=boot.o main.o
CC=gcc
CFLAGS=-nostdlib -nostdinc -fno-builtin -fno-stack-protector
LDFLAGS=-Tlink.ld
ASFLAGS=-felf
all: $(SOURCES) link
clean:
-rm *.o kernel
link:
ld $(LDFLAGS) -o kernel $(SOURCES)
.s.o:
nasm $(ASFLAGS) $<
OSXではできません。make
なぜならリンゴld移行はサポートされていません-T
。 CentOSでコンパイルを試み、次のような結果を得ました。
[gideon@centosbox src]$ make
nasm -felf boot.s
cc -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o main.o main.c
main.c:4: warning: 'struct multiboot' declared inside parameter list
main.c:4: warning: its scope is only this definition or declaration, which is probably not what you want
ld -Tlink.ld -o kernel boot.o main.o
boot.o: could not read symbols: File in wrong format
make: *** [link] Error 1
もちろん私の唯一の質問はFile in wrong format.
どういう意味ですか?どうすれば修正できますか?
答え1
これは、異なるアーキテクチャのコードを混在させるように聞こえます。ねえ:記号を読み取れません。ファイル形式が正しくありません。。
抜粋
スキーマを変更すると、このエラーが発生します。 CHOST / CFLAGS設定は新しいですか?
質問
- Toy Unix OSがx64ではなくx86でのみ構築できるかどうか疑問に思います。勉強すべきことがあります。
make clean
。 CentOSで使用されているファイルはOSXから出ていますか?boot.o
使用されているように見えますが、nasm -felf boot.s
ビルドしないとコンパイルされていることがわかりませんので、ファイルのOSXバージョンかもしれません。
修理する
オプションを見ると、nasm
スイッチの使用がわかります。
$ nasm -felf boot.s
形式はelf
32ビット形式です。最新の64ビットシステムでは、これをに変更する必要がありますelf64
。次のオプションを使用してこれらの形式を表示できますnasm -hf
。
$ nasm -hf
...
valid output formats for -f are (`*' denotes default):
* bin flat-form binary files (e.g. DOS .COM, .SYS)
ith Intel hex
srec Motorola S-records
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf64 ELF64 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
...
Make ファイルで次の行を変更します。
ASFLAGS=-felf64
もう一度実行してくださいmake
。
$ make
ld -Tlink.ld -o kernel boot.o main.o
$
問題を解決しました。