장난감 유닉스 OS 만들기: ld 문제

장난감 유닉스 OS 만들기: ld 문제

그래서 저는 이 튜토리얼을 따르고 있습니다.나만의 유닉스 장난감 출시.

예제 소스코드를 컴파일해봤습니다이 페이지. 다운로드 링크입니다샘플 소스 코드

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
$

문제를 해결했습니다.

관련 정보