首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么重定向器中的"_write“等函数在静态库中存档时没有链接?

为什么重定向器中的"_write“等函数在静态库中存档时没有链接?
EN

Stack Overflow用户
提问于 2016-01-25 06:43:03
回答 1查看 1.4K关注 0票数 1

如果我的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,在最终编译的程序中没有使用。

EN

回答 1

Stack Overflow用户

发布于 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

代码语言:javascript
复制
--undefined=symbol
    Force symbol to be entered in the output file as an undefined symbol.

详细信息

首先:规格文件gcc是一个编译器驱动程序,它调用包括ccld在内的子程序.规范文件用于指定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 链接器选项)的静态库

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34986536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档