找回密码
 注册
搜索
查看: 937|回复: 7

arm编译器高手必看

[复制链接]
发表于 2009-9-30 13:44:15 | 显示全部楼层 |阅读模式
编译2个文件a.c b.c,
在a.c中调用test_function(),但是test_function在b.c中定义void test_function(void){}为空函数
编译报错 报错 Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o).

如果在a.c中把test_function 注释就可以编译连接通过.

那么高手能解释?
 楼主| 发表于 2009-9-30 17:52:31 | 显示全部楼层
哪位高手给解决一下,急!!!!
点评回复

使用道具 举报

发表于 2009-9-30 21:33:16 | 显示全部楼层
楼主看这样行不
b.h中extern void test_function(void);
然后a.c包含b.h不就可以了
我也很菜呵呵
点评回复

使用道具 举报

发表于 2009-10-2 11:27:33 | 显示全部楼层
相信你使用了scatter loading,如果是mtk平台,我不太熟悉,仅仅看过几个基带芯片的datasheet!我觉得你的函数名可能与c lib里的函数重名!因为scatter loading的方式下,c lib是需要重定向的.最好把你的编译器,连接器,函数名,loading方式(如果是scatter loading把scattering file 发上来)和你的两个文件的编译选项都贴上来,这样才方便大家帮你分析解决问题!
点评回复

使用道具 举报

发表于 2009-10-7 13:30:36 | 显示全部楼层
是不是某个人写的测试代码,可能是临时写的而后来没有仔细清干净。如果注释掉对功能没影响就注释掉算了。按函数名且系空函数,猜想正是调试用的函数,没什么影响的。原因可能是在另的地方已有test_function()的定义,所以在这里重复故报错。
点评回复

使用道具 举报

发表于 2009-10-7 13:50:19 | 显示全部楼层
ciean
说的做法是对的。
空函数如果不放在.h文件里,空函数会被arm编译器优化掉。。。。
点评回复

使用道具 举报

发表于 2009-10-27 18:13:02 | 显示全部楼层
3楼说的对。你使用了scatter file进行link,与库文件冲突。你必须重新实现函数__user_initial_stackheap。

例如汇编实现如下:       
IMPORT |Image$$SRAM$$ZI$$Limit|, WEAK
        EXPORT __user_initial_stackheap
   
__user_initial_stackheap   
        LDR R0, =|Image$$SRAM$$ZI$$Limit|
           MOV   pc,lr        

如果你使用c的话,转换一下吧!
点评回复

使用道具 举报

发表于 2009-10-27 18:14:30 | 显示全部楼层
具体解释如下:相信已经很清楚了。

如果使用了--scatter选项,必须定义__user_initial_stackheap函数
如果不定以,会有如下错误产生
Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o)   
__user_initial_stackheap函数返回四个参数,后2个可选
heap base -- r0, stack base -- r1, heap limit -- r2, stack limit -- r3
heap一般都是向上长的(limit > base),stack一般向下减的(limit < base)
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-30 05:35 , Processed in 0.044761 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表