nasm: error: двоичный формат вывода не поддерживает внешние ссылки - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь скомпилировать файл Assembly в объектный файл. Этот файл сборки вызывает функцию c. Но я сталкиваюсь с этой ошибкой: двоичный формат вывода не поддерживает внешние ссылки

Я вызываю функцию c в строке 17 файла сборки

Я пытаюсь скомпилировать ее с помощью этой команды:

cpu/interrupt.o: cpu/interrupt.asm
        nasm $< -f bin -o $@

как я могу решить эту проблему

[extern isr_handler]

; Common ISR code
isr_common_stub:
    ; 1. Save CPU state
    pusha ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
    mov ax, ds ; Lower 16-bits of eax = ds.
    push eax ; save the data segment descriptor
    mov ax, 0x10  ; kernel data segment descriptor
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    ; 2. Call C handler
    call isr_handler

    ; 3. Restore state
    pop eax 
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    popa
    add esp, 8 ; Cleans up the pushed error code and pushed ISR number
    sti
    iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP

; We don't get information about which interrupt was caller
; when the handler is run, so we will need to have a different handler
; for every interrupt.
; Furthermore, some interrupts push an error code onto the stack but others
; don't, so we will push a dummy error code for those which don't, so that
; we have a consistent stack for all of them.

; First make the ISRs global
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

1 Ответ

1 голос
/ 12 февраля 2020

Плоский двоичный файл не имеет метаданных для таблицы символов; nasm некуда поместить имя символа для компоновщика, чтобы заполнить адрес для символа extern.

Вы хотите создать объектный файл (.o), который вы можете передать компоновщику:
nasm -felf32 foo.asm

Плоский двоичный код - это буквально ничто иное, как байты, собранные из источника asm, такие как загрузочный сектор MBR или исполняемый файл DOS .com.

Если вы хотите связать C функцию в возможный плоский двоичный файл, вы собираете ассемблерную часть в .o, затем связываете, а затем objcopy текстовую часть результирующего исполняемый файл в плоский двоичный файл.

...