link错误__semihosting_swi_guard multiply defined问题

最近在mstar上编译c++代码,编译最后link时报错:

Error: L6200E: Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o).

陌生的错误,从来没见过,__semihosting_swi_guard重定义,这个是什么东西,立即在工程里展开搜索,结果0,工程代码里都没有这个东西。郁闷了。

找google,恩,相关文章不少啊。

Semihosting:一种机制,在RVCT C库中,对某些ISO C功能的支持由主机调试环境提供,提供改功能的机制就是Semihosting.关于它推荐个文章:

基于arm的semihosting的分析与实现 http://www.docin.com/p-72364998.html

关于这个错误,ARM官网上也有说明并且给出了解决方法,详见http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0056d/Babdhjff.html

大致意思是如果在程序中引入了__use_no_semihosting_swi,但最终映像仍链接了Semihosting库,会提示重定义。或者你的程序里调用了一些标准C的函数,如malloc,printf之类,但这些函数在嵌入式C语言里是没有定义的,你需要对你调用的这些函数进行重新定义。

为帮助找出这些使用了Semihosting的函数,可以使用-verbose链接选项。关于-verbose选项官方说明http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0493c/CHDJIBID.html

mstar中使用:

打开link.mak文件,目录proj\sc\customer\product\common\mak\,找到如下代码段

ifeq ($(LINKER),RVCTV22_link)
ifeq ($(filter __I_SW__ ,$(PP_OPT_COMMON)),__I_SW__)
LDFLAGS=--elf --noremove --map --symbols --info sizes --info unused --xref --entry 0x0 --list $(OUT)link.info --symdefs symdefs.info
else
# Eric: Use RVCT linker functional link to save unused section
LDFLAGS=--elf --remove --map --symbols --info sizes --info unused --xref --entry 0x0 --list $(OUT)link.info --symdefs symdefs.info --keep MontageRam --keep msmDrvTypeA_s --feedback $(BUILD)$(PRODUCT)/fb.txt
endif
endif

我代码中LINKER=RVCTV22_link,所以修改红色代码部分,添加-verbose 选项:

LDFLAGS=--elf --remove --verbose --map --symbols --info sizes --info unused --xref --entry 0x0 --list $(OUT)link.info --symdefs symdefs.info --keep MontageRam --keep msmDrvTypeA_s --feedback $(BUILD)$(PRODUCT)/fb.txt

重新编译代码,代码中调用的c库函数或者semihosting的函数会被__I_use_semihosting_swi标记,在log中查找__I_use_semihosting_swi,这些实现这些函数。

比如:

  Loading member sys_exit.o from c_a__un.l.

                               definition: _sys_exit

                               reference: __I_use_semihosting_swi

只要在代码里重新实现_sys_exit函数就可

void _sys_exit(int exit)
{
exit = exit;
}

重新编译,ok!




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值