
arabasso
(usa Slackware)
Enviado em 05/03/2008 - 14:06h
Olá a todos, estou com um problema que está me fazendo arrancar os cabelos. Estou estudando sobre arquitetura de sistemas operacionais usando C e Assembly GAS.
No linux, é fácil de copilar e linkar, o problema é no windows (usando cygwin com mingw). No windows, é preciso usar o parâmetro -i pra ele não colocar funções do windows no programa, pois quero um binário puro.
Aí que começam os problemas... Se eu uso ld -i pra linkar, ele simplesmente linka tudo de qualquer jeito! Vejam:
arquivo "loader.S"
.text
.globl start
.extern _main
.code16
start:
call _main
-------------------------------------------
Arquivo "main.c"
main()
{
for(;;);
}
-------------------------------------------
Compilando:
# gcc -c loader.S -o loader.o
# gcc -c -nostdinc -ffreestanding -o main.o main.c
# ld -i -e start -Ttext 0x50 -o tmp.o loader.o main.o
# objcopy -R .note -R .comment -S -O binary tmp.o loader.bin
Ele gera o binário puro, mas nada funciona. Ele não chama a função _main de jeito nenhum, nem coloca o código no segmento 0x0050 (sou obrigado a setar os registradores de segmento com esse valor). O duro é que se não usar -i no ld, o programa fica enorme e ele diz que há referência à funções da win32.
O que pode estar acontecendo?