如果我的link命令如下所示,我实现了一个重定向c来将printf输出重定向到串行端口进行调试,它可以被链接并且工作得很好:
arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs -g -mcpu=cortex-m4 -mthumb -fmessage-length=0 -std=c99 -fno-builtin -Wl,--gc-sections -Wl,-Map=main.map -T"$(LINKERFILE)" -o main.elf main.o retarget.o $(BUILDDIR)/libs.a -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
但是,当我将retarget.o归档到归档文件$(BUILDDIR)/libs.a中时,链接命令喜欢这样一个:
arm-none-eabi-gcc --specs=nano.specs --specs=nosys.specs -g -mcpu=cortex-m4 -mthumb -fmessage-length=0 -std=c99 -fno-builtin -Wl,--gc-sections -Wl,-Map=main.map -T"$(LINKERFILE)" -o main.elf main.o $(BUILDDIR)/libs.a -Wl,--start-group -lgcc -lc -lnosys -Wl,--end-group
它可以成功地链接起来,但是函数printf没有输出任何东西到串口,看来我自己的版本函数,比如重定向程序中的_write,在最终编译的程序中没有使用。
发布于 2021-07-06 03:44:56
您的_write实现没有链接,因为_write是,已经在libnosys.a中定义了,这是通过--specs=nosys.specs提供的。
若要使用静态库libs.a中定义的libs.a符号,请在最终链接期间使用-Wl,--undefined=_write调用gcc。
请参阅:man ld | grep -A4 --undefined=symbol
--undefined=symbol
Force symbol to be entered in the output file as an undefined symbol.详细信息
首先:规格文件。gcc是一个编译器驱动程序,它调用包括cc和ld在内的子程序.规范文件用于指定gcc的行为。
编译器的内置规范可以在arm-none-eabi-gcc -dumpspecs中看到。试试看!另见:gcc -dumpspecs
在命令行开头传递--specs=nosys.specs将在对ld的调用中插入一个-lnosys。(使用手臂GCC时,“nosys”、“nano”、“rdimon”是什么术语?)
arm-none-eabi-objdump -t arm-none-eabi/lib/libnosys.a | grep _write定位可能会覆盖您在$(BUILDDIR)/libs.a中定义的
还请参阅: Makani固件存储库,其中实现syscalls (Generation 链接器选项)的静态库
https://stackoverflow.com/questions/34986536
复制相似问题