그래서 저는 이 튜토리얼을 따르고 있습니다.나만의 유닉스 장난감 출시.
예제 소스코드를 컴파일해봤습니다이 페이지. 다운로드 링크입니다샘플 소스 코드
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
$
문제를 해결했습니다.