Компиляция с помощью 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, если это именно то, что надо изменить. Если именно то, то как найти эту настройку?