おもちゃUnix OSの作成:ld問題

おもちゃUnix OSの作成:ld問題

だから私はこのチュートリアルに従っています。独自の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

形式はelf32ビット形式です。最新の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
$

問題を解決しました。

関連情報