Bueno, conseguí arreglarlo, tras una semana rompiéndome la cabeza lo conseguí. Este es el linker script, usando MinGW:
ld -nostdlib -nodefaultlibs -T linker.ld bin\Stage_3.o bin\kernel.o bin\idt.o bin\screen.o bin\string.o bin\io.o -o Kernel.out
Usando el comando ld de esa manera, nos generaría un ejecutable que trabajaría según la dirección de memoria 0x001216.
El Stage_2 de mi Kernel lo cargo en 0x001000, a lo que hay que sumarle el código del Stage_2 que luego carga el Kernel en C++. El tamaño del Stage_2 es de 0x216 bytes, por lo que sumándolo a la dirección base, se soluciona el problema.
Una vez linkeado nuestro ejecutable, lo convertimos a binario con objcopy, tal como hago en el bat que puse antes. Ahora tengo que portarlo a GCC para poder compilarlo en Linux, pero debería ser bastante fácil.
Saludos.
Código (bash) [Seleccionar]
OUTPUT_FORMAT("pe-x86-64")
ENTRY(loader)
SECTIONS
{
.text 0x001216 :
{
*(.text)
}
.rdata :
{
*(.rdata)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
ld -nostdlib -nodefaultlibs -T linker.ld bin\Stage_3.o bin\kernel.o bin\idt.o bin\screen.o bin\string.o bin\io.o -o Kernel.out
Usando el comando ld de esa manera, nos generaría un ejecutable que trabajaría según la dirección de memoria 0x001216.
El Stage_2 de mi Kernel lo cargo en 0x001000, a lo que hay que sumarle el código del Stage_2 que luego carga el Kernel en C++. El tamaño del Stage_2 es de 0x216 bytes, por lo que sumándolo a la dirección base, se soluciona el problema.
Una vez linkeado nuestro ejecutable, lo convertimos a binario con objcopy, tal como hago en el bat que puse antes. Ahora tengo que portarlo a GCC para poder compilarlo en Linux, pero debería ser bastante fácil.
Saludos.