我正在尝试构建一个由单个程序集文件组成的应用程序。我编写了一个针对我的芯片的链接器文件,该芯片由 RISC-V CPU、ROM 和 RAM 组成。
我不知道如何告诉AS程序使用这个链接器文件。当尝试运行此 Makefile 时:
AS = ./xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-as.exe
OBJCOPY = ./xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-objcopy.exe
all : main.asm
$(AS) main.asm -o instr.elf -T linker.ld
$(OBJCOPY) -O binary -j .text instr.elf instr.bin
我得到以下输出:
riscv-none-elf-as.exe: unrecognized option `-T'
将链接器文件传递给 AS 程序的正确方法是什么?
解决方案:引用MadScientist:
“gcc 是一个前端,它调用所有(需要的)后端工具 正确的顺序。这可能包括预处理器、编译器、 汇编器和链接器(其中一些可能不会被调用,具体取决于 gcc 命令行参数)。后端工具从不互相调用: 他们根据命令行选项做一件事并退出。 ”
所以事实上我根本没有链接,链接器没有在我的 Makefile 中调用,因为 as.exe 根本不调用它。
这是现在可以使用的更新后的 Makefile,我更改了几处内容,但之前的 Makefile 中缺少的行是第 10 行,其中调用 $(LD) 中指定的链接器:
AS = ./xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-as.exe
LD = ./xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-ld.exe
OBJCOPY = ./xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-objcopy.exe
OBJDUMP = ./xpack-riscv-none-elf-gcc-14.2.0-1/bin/riscv-none-elf-objdump.exe
all : main.asm
ifeq ($(wildcard ./bin),)
mkdir -p ./bin
endif
$(AS) main.asm -o ./bin/main.o
$(LD) -o ./bin/main.elf ./bin/main.o -T linker.ld
$(OBJCOPY) -O binary -j .text ./bin/main.elf ./bin/instr.bin
$(OBJCOPY) -O binary -j .rodata ./bin/main.elf ./bin/rodata.bin
$(OBJDUMP) -D -M no-aliases ./bin/main.elf > ./bin/main.dasm
再次感谢大家。