L6200E: __semihosting_swi_guard multiply defined的解决方法

2011-11-06 08:47

MSTAR终端编译时提示错误:Error: L6200E: Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o).
这个问题的原因可能是程序里调用了一些标准C的函数,但这些函数在嵌入式C语言里没有定义,那就需要对调用的这些函数进行重新定义。
举个例子,例如调用了标准C里面的printf函数,就会出现上述所说的错误,那就需要在程序里对这个函数进行重定义或者直接删除。
(MSTAR的link命令后默认加了-verbose)直接查找link.info中的__I_use_semihosting_swi,可以看到哪些函数导致了该编译错误。

比如,编译链接时提示:<TNG>Error: L6200E: Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o).
在link.info中查找,发现了如下的线索:
    sys_exit.o(.text) refers to use_semi.o(.text) for __I_use_semihosting_swi   
    -abort.o(.text) refers to sys_exit.o(.text) for _sys_exit
    --h1_alloc.o(.text) refers to abort.o(.text) for abort
    ---malloc.o(.text) refers to h1_alloc.o(.text) for __Heap_DescSize
    ----zutil.o(.text) refers to malloc.o(.text) for malloc
    -h1_free.o(.text) refers to abort.o(.text) for abort
    --free.o(.text) refers to h1_free.o(.text) for __Heap_Free
    ---zutil.o(.text) refers to free.o(.text) for free
    sys_stackheap.o(.text) refers to use_semi.o(.text) for __I_use_semihosting_swi
    -stkheap1.o(.text) refers to sys_stackheap.o(.text) for __user_initial_stackheap
    --heapext.o(.text) refers to stkheap1.o(.text) for __rt_heap_extend
    ---malloc.o(.text) refers to heapext.o(.text) for __heap_extend
    ----zutil.o(.text) refers to malloc.o(.text) for malloc
即包含“__I_use_semihosting_swi”的有两条记录,根据它们往上追查,最后都归到zutil.o,它调用了标准C的接口malloc和free
用armar.exe和objdump.exe的命令,去分析zutil.o里的信息,也能印证zutil确实调用了malloc和free,见下图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值