fazendo um brinquedo unix os: questões com ld

3

Então, estou seguindo este tutorial sobre lançando seu próprio brinquedo unix .

Estou empenhado em compilar a fonte de amostra em esta página . Este é um link de download para o código-fonte de amostra

O Makefile tem esta aparência:

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) $<

No OSX, não consegui gerenciar make porque O ld da Apple não suporta um switch -T . Eu tentei compilar no CentOS e consegui isso:

[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

Claro que meu único problema é File in wrong format.

O que isso significa? Como corrijo isso?

    
por gideon 16.10.2013 / 21:42

1 resposta

5

Parece que você está misturando código para arquiteturas diferentes. Veja aqui: não foi possível ler símbolos, arquivo no formato errado .

trecho

You get that error when you change architectures. Are those CHOST/CFLAGS settings new?

Perguntas

  • Gostaria de saber se o sistema operacional Toy Unix só pode ser construído em x86 e não em x64. Algo para investigar.
  • %código%. Os arquivos que você está usando no CentOS vêm do OSX de alguma forma?
  • Eu vejo o make clean sendo usado, mas não o vejo sendo compilado, a menos que o boot.o o construa, então talvez seja a versão do OSX desse arquivo.

A correção

Se você der uma olhada nas opções para nasm -felf boot.s , perceberá que está usando os switches:

$ nasm -felf boot.s

O formato nasm é um formato de 32 bits. Em sistemas mais novos, de 64 bits, é necessário alterar isso para elf . Você pode ver esses formatos usando a opção elf64 :

$ 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
...

Então, alterando esta linha no arquivo Make:

ASFLAGS=-felf64

e re-executando nasm -hf :

$ make
ld -Tlink.ld -o kernel boot.o main.o
$

resolve o problema.

    
por 16.10.2013 / 22:22

Tags