Компиляция с помощью Makefile кода на gnu ассемблере на Mac OS приводит к ошибке

Есть код на gnu ассемблере с Makefile и linker.ld. Необходимо его скомпилировать с помощью команды make. Установил gnu binutils и gcc:

brew install binutils
brew install gcc

Вот мой Makefile:

LD ?= ld
CC ?= gcc

CFLAGS = -ffreestanding -m32
AFLAGS = -ffreestanding -m32

all: boot.bin

OBJS = boot.o

boot.bin: $(OBJS) linker.ld
    $(LD) -T linker.ld $(OBJS) -o boot.bin

%.o: %.S
    $(CC) $(AFLAGS) -c $< -o $@

clean:
    rm *.o boot.bin

.PHONY: clean

А это linker.ld:

OUTPUT_FORMAT(binary)
OUTPUT_ARCH(i8086)
ENTRY(start)

SECTIONS {
    . = 0x7C00;
    .text : { *(.text) }
    . = 0x7DFE;
    /* BIOS determine MBR by special signature in
     * the last 2 bytes of 512 byte long sector. */
    .signature : { SHORT(0xAA55) }
}

Когда запускаю команду make происходит ошибка

ld: unknown option: -T

Хотя в документации по gnu ld флаг T присутствует. Если я убираю этот флаг, то происходит ошибка

ld: in section __TEXT,__text reloc 0: X86_64_RELOC_SUBTRACTOR must have r_length of 2 or 3 file 'boot.o' for architecture x86_64

Я слышал что в Mac OS встроен ассемблер, похожий на gnu ассемблер, но всё же отличающийся. Может быть команда ld вызывала именно этот линкер, а не gnu ld? Как правильно установить gnu ассемблер или как надо изменить Makefile, чтобы исправить эту ошибку? Если прописать путь до линкера, то всё равно ошибка

ld: unknown option: -T

Если убрать -T linker.ld, то ошибка

ld: warning: The i386 architecture is deprecated for macOS (remove from the Xcode build setting: ARCHS)
Undefined symbols for architecture i386:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture i386

Как я понимаю из данного сообщения, надо убрать какую-то настройку в Xcode. Но в настройках я не могу найти ARCHS, если это именно то, что надо изменить. Если именно то, то как найти эту настройку?


Ответы (0 шт):