12/04/13 4:17
LittleHacker
Salve a tutti, sto da poco provando a compilare il mio MicroOS su piattaforma Mac OSX 10.8.3, ho installato tutto il necessario (nasm, gcc, g++, ld) ma ho un problema per quanto rigurda il linking del codice Assembler!
Ho questo codide:
Per quanto rigurda la compilazione tutto
ma quando vado a fare il linking mi esce questo messaggio di errore:
E non capisco il perché! Come comandi uso:
Riepilogo:
Compilazione NASM
Compilazione GCC
Linking
Qualcuno sa aiutarmi?
Grazie
P.S: Su Ubuntu funziona tutto a meraviglia; è solo su Mac che non vuole saperne di funzionare!
Edit: Risolto! Non riusciva a trovare la funzione d'ingresso 'start' che in questo codice è chiamata loader, mi è bastato cambiare 'loader' con 'start' e tutto è andato a buon fine!
Ho questo codide:
global loader global _gdt_flush ; expose gdt reload routine global _idt_load ; loads the IDT global _isr0 global _isr1 global _isr2 global _isr3 global _isr4 global _isr5 global _isr6 global _isr7 global _isr8 global _isr9 global _isr10 global _isr11 global _isr12 global _isr13 global _isr14 global _isr15 global _isr16 global _isr17 global _isr18 global _isr19 global _isr20 global _isr21 global _isr22 global _isr23 global _isr24 global _isr25 global _isr26 global _isr27 global _isr28 global _isr29 global _isr30 global _isr31 global _irq0 global _irq1 global _irq2 global _irq3 global _irq4 global _irq5 global _irq6 global _irq7 global _irq8 global _irq9 global _irq10 global _irq11 global _irq12 global _irq13 global _irq14 global _irq15 extern kernel ; our Kernel pointer extern gp ; our GDT pointer is exposed elsewhere also extern idtp ; our IDT pointer MODULEALIGN equ 1<<0 MEMINFO equ 1<<1 FLAGS equ MODULEALIGN | MEMINFO MAGIC equ 0x1BADB002 CHECKSUM equ -(MAGIC + FLAGS) section .text align 4 MultiBootHeader: dd MAGIC dd FLAGS dd CHECKSUM STACKSIZE equ 0x4000 loader: mov esp, stack+STACKSIZE push eax push ebx call kernel ; Call kernel main cli hang: hlt jmp hang _gdt_flush: ; This routine will reload the segment registers when called lgdt [gp] ; This line loads our custom GDT mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax ret _idt_load: lidt [idtp] ret ; 0: Divide By Zero Exception _isr0: cli push byte 0 push byte 0 jmp isr_common_stub ; 1: Debug Exception _isr1: cli push byte 0 push byte 1 jmp isr_common_stub ; 2: Non Maskable Interrupt Exception _isr2: cli push byte 0 push byte 2 jmp isr_common_stub ; 3: Int 3 Exception _isr3: cli push byte 0 push byte 3 jmp isr_common_stub ; 4: INTO Exception _isr4: cli push byte 0 push byte 4 jmp isr_common_stub ; 5: Out of Bounds Exception _isr5: cli push byte 0 push byte 5 jmp isr_common_stub ; 6: Invalid Opcode Exception _isr6: cli push byte 0 push byte 6 jmp isr_common_stub ; 7: Coprocessor Not Available Exception _isr7: cli push byte 0 push byte 7 jmp isr_common_stub ; 8: Double Fault Exception (With Error Code!) _isr8: cli push byte 8 jmp isr_common_stub ; 9: Coprocessor Segment Overrun Exception _isr9: cli push byte 0 push byte 9 jmp isr_common_stub ; 10: Bad TSS Exception (With Error Code!) _isr10: cli push byte 10 jmp isr_common_stub ; 11: Segment Not Present Exception (With Error Code!) _isr11: cli push byte 11 jmp isr_common_stub ; 12: Stack Fault Exception (With Error Code!) _isr12: cli push byte 12 jmp isr_common_stub ; 13: General Protection Fault Exception (With Error Code!) _isr13: cli push byte 13 jmp isr_common_stub ; 14: Page Fault Exception (With Error Code!) _isr14: cli push byte 14 jmp isr_common_stub ; 15: Reserved Exception _isr15: cli push byte 0 push byte 15 jmp isr_common_stub ; 16: Floating Point Exception _isr16: cli push byte 0 push byte 16 jmp isr_common_stub ; 17: Alignment Check Exception _isr17: cli push byte 0 push byte 17 jmp isr_common_stub ; 18: Machine Check Exception _isr18: cli push byte 0 push byte 18 jmp isr_common_stub ; 19: Reserved _isr19: cli push byte 0 push byte 19 jmp isr_common_stub ; 20: Reserved _isr20: cli push byte 0 push byte 20 jmp isr_common_stub ; 21: Reserved _isr21: cli push byte 0 push byte 21 jmp isr_common_stub ; 22: Reserved _isr22: cli push byte 0 push byte 22 jmp isr_common_stub ; 23: Reserved _isr23: cli push byte 0 push byte 23 jmp isr_common_stub ; 24: Reserved _isr24: cli push byte 0 push byte 24 jmp isr_common_stub ; 25: Reserved _isr25: cli push byte 0 push byte 25 jmp isr_common_stub ; 26: Reserved _isr26: cli push byte 0 push byte 26 jmp isr_common_stub ; 27: Reserved _isr27: cli push byte 0 push byte 27 jmp isr_common_stub ; 28: Reserved _isr28: cli push byte 0 push byte 28 jmp isr_common_stub ; 29: Reserved _isr29: cli push byte 0 push byte 29 jmp isr_common_stub ; 30: Reserved _isr30: cli push byte 0 push byte 30 jmp isr_common_stub ; 31: Reserved _isr31: cli push byte 0 push byte 31 jmp isr_common_stub ; We call a C function in here. We need to let the assembler know ; that '_fault_handler' exists in another file extern _fault_handler ; This is our common ISR stub. It saves the processor state, sets ; up for kernel mode segments, calls the C-level fault handler, ; and finally restores the stack frame. isr_common_stub: pusha push ds push es push fs push gs mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp push eax mov eax, _fault_handler call eax pop eax pop gs pop fs pop es pop ds popa add esp, 8 iret ; 32: IRQ0 _irq0: cli push byte 0 push byte 32 jmp irq_common_stub ; 33: IRQ1 _irq1: cli push byte 0 push byte 33 jmp irq_common_stub ; 34: IRQ2 _irq2: cli push byte 0 push byte 34 jmp irq_common_stub ; 35: IRQ3 _irq3: cli push byte 0 push byte 35 jmp irq_common_stub ; 36: IRQ4 _irq4: cli push byte 0 push byte 36 jmp irq_common_stub ; 37: IRQ5 _irq5: cli push byte 0 push byte 37 jmp irq_common_stub ; 38: IRQ6 _irq6: cli push byte 0 push byte 38 jmp irq_common_stub ; 39: IRQ7 _irq7: cli push byte 0 push byte 39 jmp irq_common_stub ; 40: IRQ8 _irq8: cli push byte 0 push byte 40 jmp irq_common_stub ; 41: IRQ9 _irq9: cli push byte 0 push byte 41 jmp irq_common_stub ; 42: IRQ10 _irq10: cli push byte 0 push byte 42 jmp irq_common_stub ; 43: IRQ11 _irq11: cli push byte 0 push byte 43 jmp irq_common_stub ; 44: IRQ12 _irq12: cli push byte 0 push byte 44 jmp irq_common_stub ; 45: IRQ13 _irq13: cli push byte 0 push byte 45 jmp irq_common_stub ; 46: IRQ14 _irq14: cli push byte 0 push byte 46 jmp irq_common_stub ; 47: IRQ15 _irq15: cli push byte 0 push byte 47 jmp irq_common_stub extern _irq_handler irq_common_stub: pusha push ds push es push fs push gs mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov eax, esp push eax mov eax, _irq_handler call eax pop eax pop gs pop fs pop es pop ds popa add esp, 8 iret section .bss align 4 stack: resb STACKSIZE
Per quanto rigurda la compilazione tutto
ma quando vado a fare il linking mi esce questo messaggio di errore:
Undefined symbols for architecture i386: "start", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture i386
E non capisco il perché! Come comandi uso:
nasm -f macho loader/loader.S -o $build/loader.o gcc -m32 -Wall kernel/kernel.c -o $build/kernel.o ld -arch i386 -map linker/linker.ld -o kernel.bin $build/loader.o $build/kernel.o ...
Riepilogo:
Compilazione NASM
Compilazione GCC
Linking
Qualcuno sa aiutarmi?
Grazie
P.S: Su Ubuntu funziona tutto a meraviglia; è solo su Mac che non vuole saperne di funzionare!
Edit: Risolto! Non riusciva a trovare la funzione d'ingresso 'start' che in questo codice è chiamata loader, mi è bastato cambiare 'loader' con 'start' e tutto è andato a buon fine!
Ultima modifica effettuata da LittleHacker 12/04/13 6:40
aaa