разное поведение arm-none-eabi-as в зависимости от текущей дериктории

Дано:

  1. скрипт для линкера

loop.ld

SECTIONS {
    flash 0x08000000 : {
        LONG(0x20000000 + 20K);
        LONG(loop | 1);
        . = 0x130;
        loop.o(code);
    }
}
  1. исходник на ассемблере

loop.s

.cpu cortex-m3
.syntax unified
.thumb

.global loop

.section code

loop:
    add r0, r0, 1
    bl loop
  1. Маке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). Однако тут у меня два вопроса:

  1. почему он так считает? Ведь на вход подан файл с расширением .s;
  2. почему изменение логического расположения в иерархии влияет на поведение ассемблера?

Заранее благодарю за помощь.


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

Автор решения: Telman I

Решение:

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 снизу"

→ Ссылка