Использование ld для связывания файла делает его слишком большим для загрузчика, хотя работает в nasm :( - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь сделать простой загрузчик, но сталкиваюсь с проблемами с ld (я думаю).

Когда я компилирую свой файл сборки (ниже) с помощью nasm -f bin, он работает, и я получаю хороший 512-байтовый файл. Для этого я добавляю org 0x7c00 вверху, и все работает как положено.

Однако сейчас я пытаюсь сделать что-то более сложное и связать ядро ​​C (неясно, нахожусь ли я на правильном пути, но я уверен, что скоро это узнаю). В любом случае, когда я компилирую его с nasm -f elf -o loader_elf bootloader.asm и связываю его с i386-elf-ld loader_elf -o loader_exe -Ttext 0x7C00, я получаю файл размером 4196 байт (с файлом эльфа 1152 байта).

Что мне нужно сделать для файла elf или ld, чтобы получить исполняемый файл с правильным размером файла?

Спасибо за вашу помощь!

Вот этот файл:

bits 16 ; 16-bit Real Mode
;org 0x7c00 ; BIOS boot origin... only used for bin, not elf

global _start

Message db "Starting YADBL", 0x0 

jmp _start ;Jump to start main() entry-point 

;Print characters to the screen 
Println:
    lodsb ;Load string 
    or al, al
    jz complete
    mov ah, 0x0e    
    int 0x10 ;BIOS Interrupt 0x10 - Used to print characters on the screen via Video Memory 
    jmp Println ;Loop       
complete:
    call PrintNwL

;Prints empty new lines like '\n' in C/C++  
PrintNwL: 
    mov al, 0   ; null terminator '\0'
    stosb       ; Store string 

    ;Adds a newline break '\n'
    mov ah, 0x0E
    mov al, 0x0D
    int 0x10
    mov al, 0x0A 
    int 0x10
    ret

;Reboot the Machine 
AToHalt:     
    call GetPressedKey 
    ; Inputted key is in al
    cmp al, 'A'
    jne rbt
    ; We got an A!!!
;    mov si, Halting
;    call Println
    cli
    hlt

rbt:
    ret  ; we're returning, not rebooting

    ;Sends us to the end of the memory
    ;causing reboot 
    ;db 0x0ea 
    ;dw 0x0000 
    ;dw 0xffff 
    jmp 0xffff:0000h ; also restarts

;Gets the pressed key 
GetPressedKey:
    mov ah, 0
    int 0x16  ;BIOS Keyboard Service 
    ret 

;Bootloader entry-code 
_start:
   cli ;Clear interrupts 
   ;Setup stack segments 
   mov ax,cs              
   mov ds,ax   
   mov es,ax               
   mov ss,ax                
   sti ;Enable interrupts 

   ;Print the first characters  
   mov si, Message 
   call Println 

   call AToHalt

   times 510 - ($-$$) db 0 ;Fill the rest of the bootloader with zeros 
   dw 0xAA55 ;Boot signature
...