разное поведение arm-none-eabi-as в зависимости от текущей дериктории
Дано:
- скрипт для линкера
loop.ld
SECTIONS {
flash 0x08000000 : {
LONG(0x20000000 + 20K);
LONG(loop | 1);
. = 0x130;
loop.o(code);
}
}
- исходник на ассемблере
loop.s
.cpu cortex-m3
.syntax unified
.thumb
.global loop
.section code
loop:
add r0, r0, 1
bl loop
- Макеfile
BUILD_DIR = ../build
OBJCOPY = arm-none-eabi-objcopy
LINKER = arm-none-eabi-ld
ASM = arm-none-eabi-as
loop.bin: loop.elf
$(OBJCOPY) -O binary -j flash $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.bin
loop.elf: loop.ld loop.o
$(LINKER) -T loop.ld -o $(BUILD_DIR)/loop.elf loop.o
loop.o: loop.s
$(ASM) -o loop.o loop.s
clean:
rm -f loop.o $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.bin
Если все три файла расположены на одном логическом уровне иерархии проекта (напр. в папке src), то никаких проблем нет, проект успешно собирается:
STM32/01_loop/src$ make
arm-none-eabi-as -o loop.o loop.s
arm-none-eabi-ld -T loop.ld -o ../build/loop.elf loop.o
arm-none-eabi-objcopy -O binary -j flash ../build/loop.elf ../build/loop.bin
Однако, если вывести Makefile в корневую директорию проекта:
3.1 новый Makefile:
BUILD_DIR = ./build
SRC_DIR = ./src
OBJCOPY = arm-none-eabi-objcopy
LINKER = arm-none-eabi-ld
ASM = arm-none-eabi-as
all: loop.bin
loop.bin: loop.elf
$(OBJCOPY) -O binary -j flash $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.bin
loop.elf: $(SRC_DIR)/loop.ld $(SRC_DIR)/loop.o
$(LINKER) -T $(SRC_DIR)/loop.ld -o $(BUILD_DIR)/loop.elf $(SRC_DIR)/loop.o
loop.o: $(SRC_DIR)/loop.s
$(ASM) -o $(SRC_DIR)/loop.o $(SRC_DIR)/loop.s
clean:
rm -f $(SRC_DIR)/loop.o $(SRC_DIR)/loop.s $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.bin
то начинаются вот такие ошибки:
/STM32/01_loop$ make
as -o src/loop.o src/loop.s
src/loop.s: Assembler messages:
src/loop.s:1: Error: unknown pseudo-op: `.cpu'
src/loop.s:2: Error: unknown pseudo-op: `.syntax'
src/loop.s:3: Error: unknown pseudo-op: `.thumb'
src/loop.s:10: Error: too many memory references for `add'
src/loop.s:11: Error: no such instruction: `bl loop'
make: *** [<builtin>: src/loop.o] Error 1
Если я правильно понимаю, то ассемблер считает, что ему на вход подают исходник, требующий препроцессорную обработку (т.е. файл с расширением .S). Однако тут у меня два вопроса:
- почему он так считает? Ведь на вход подан файл с расширением
.s; - почему изменение логического расположения в иерархии влияет на поведение ассемблера?
Заранее благодарю за помощь.
Ответы (1 шт):
Решение:
Makefile
BUILD_DIR = ./build
SRC_DIR = ./src
OBJCOPY = arm-none-eabi-objcopy
LINKER = arm-none-eabi-ld
ASM = arm-none-eabi-as
all: loop.bin
loop.bin: loop.elf
$(OBJCOPY) -O binary -j flash $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.bin
loop.elf: $(SRC_DIR)/loop.ld loop.o
$(LINKER) -T $(SRC_DIR)/loop.ld -o $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.o
loop.o: $(SRC_DIR)/loop.s
$(ASM) -o $(BUILD_DIR)/loop.o $(SRC_DIR)/loop.s
clean:
rm -f $(BUILD_DIR)/loop.o $(BUILD_DIR)/loop.elf $(BUILD_DIR)/loop.bin
.PHONY: all
Для наглядности: строка, подвергшаяся изменениям:
loop.elf: $(SRC_DIR)/loop.ld $(SRC_DIR)/loop.o
$(LINKER) -T $(SRC_DIR)/loop.ld -o $(BUILD_DIR)/loop.elf $(SRC_DIR)/loop.o
Далее возникла проблема следующего характера:
$ make
arm-none-eabi-as -o ./build/loop.o ./src/loop.s
arm-none-eabi-ld -T ./src/loop.ld -o ./build/loop.elf ./build/loop.o
arm-none-eabi-ld: cannot find loop.o: No such file or directory
make: *** [Makefile:13: loop.elf] Error 1
После некоторых изысканий удалось выяснить, что скрипт линкера необходимо модифицировать следующим образом:
loop.ld
SECTIONS {
flash 0x08000000 : {
LONG(0x20000000 + 20K);
LONG(loop | 1);
. = 0x130;
./build/loop.o(text);
}
}
p.s. эта сборка относится к замечательному курсу "Осваиваем SMT32 снизу"