这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » relocation value dose not fit in 26 bits

共17条 1/2 1 2 跳转至

relocation value dose not fit in 26 bits

菜鸟
2007-05-10 19:24:10     打赏

vxworks运行正常,但在加载应用程序时

报出:“relocation value dose not fit in 26 bits”错误,一堆

是否符号表损坏,只要是加载任何程序都是,调用loadmodule时会出错

没见过此现象

如何入手查这问题???




关键词: relocation     value    

菜鸟
2007-05-10 20:58:00     打赏
2楼
缺省的编译都是26位地址的,当程序变大的时候会由于调用时跨度太大导致地址越界。可以使用编译选项-mlongcall来解决。风河的库都是按照26位编译的,如果必要的话,库也要重编。可以使用objdump查看。

菜鸟
2007-05-10 22:08:00     打赏
3楼

好像由于内存扩大造成,现2片,各32M

相关branch instruction产生错误

在gcc编译中增加mlongcall,编译不通过,不识别longcall

“cc1.exe: Invalid option `longcalls'”,并且无源码,无法重新编译库!

将参数改为longcall或-mlong-calls后,可编译通过,但问题没有解决,可能和库有关。

找到几种解决办法供大家参考:

The easiest way around it is to limit the board memory to 64m, load your
program and do a memAddToPool for the rest of the memory.

Or use mlongcalls

Or link your app in with the kernel

or (I think) get the current release


[align=right][color=#000066][此贴子已经被作者于2007-5-10 14:51:28编辑过][/color][/align]

菜鸟
2007-05-11 15:47:00     打赏
4楼

应该是 -mlongcall ,如:

ccppc -g -mcpu=603 -mlongcall -mstrict-align -ansi -fno-builtin -I. -ID:\WindRiv
er\Tornado2.2.2ForPpc/target/config/wrSbcPowerQuiccII -ID:\WindRiver\Tornado2.2.
2ForPpc/target/h -ID:\WindRiver\Tornado2.2.2ForPpc/target/config/comps/src -ID:\
WindRiver\Tornado2.2.2ForPpc/target/src/drv -DCPU=PPC603 -DTOOL_FAMILY=gnu -DTOO
L=gnu -DPRJ_BUILD -c D:\WindRiver\Tornado2.2.2ForPpc/target/config/comps/src/ve
rsion.c


菜鸟
2007-05-11 15:55:00     打赏
5楼

编译以后使用objdumpppc -r syslib.o查看,使用-mlongcall前编译的函数是24位的:

00000084 R_PPC_REL24 eepromReadByte
000000b4 R_PPC_REL24 eepromUnlock
000000cc R_PPC_REL24 eepromDelay
000000d4 R_PPC_REL24 eepromReadByte
00000114 R_PPC_REL24 eepromLock
00000150 R_PPC_REL24 eepromDelay
000001b8 R_PPC_REL24 eepromDelay
000001ec R_PPC_REL24 eepromDelay
00000224 R_PPC_REL24 eepromDelay
00000278 R_PPC_REL24 vxDecGet
0000028c R_PPC_REL24 vxDecGet
0000029c R_PPC_REL24 abs
000002b4 R_PPC_REL24 abs
000002d0 R_PPC_REL24 abs
00000398 R_PPC_REL24 eepromReadByte
00000498 R_PPC_REL24 eepromWriteByte
000004a0 R_PPC_REL24 eepromReadByte
0000062c R_PPC_REL24 vxTas

使用之后是32位的:

0000008e R_PPC_ADDR16_HA eepromReadByte
00000092 R_PPC_ADDR16_LO eepromReadByte
000000ca R_PPC_ADDR16_HA eepromUnlock
000000ce R_PPC_ADDR16_LO eepromUnlock
000000ee R_PPC_ADDR16_HA eepromDelay
000000f2 R_PPC_ADDR16_LO eepromDelay
00000102 R_PPC_ADDR16_HA eepromReadByte
00000106 R_PPC_ADDR16_LO eepromReadByte
0000014e R_PPC_ADDR16_HA eepromLock
00000152 R_PPC_ADDR16_LO eepromLock
000001a6 R_PPC_ADDR16_HA eepromDelay
000001aa R_PPC_ADDR16_LO eepromDelay
0000021a R_PPC_ADDR16_HA eepromDelay
0000021e R_PPC_ADDR16_LO eepromDelay
0000026a R_PPC_ADDR16_HA eepromDelay
0000026e R_PPC_ADDR16_LO eepromDelay
000002ae R_PPC_ADDR16_HA eepromDelay
000002b2 R_PPC_ADDR16_LO eepromDelay
0000031a R_PPC_ADDR16_HA vxDecGet
0000031e R_PPC_ADDR16_LO vxDecGet
0000033a R_PPC_ADDR16_HA vxDecGet
0000033e R_PPC_ADDR16_LO vxDecGet
00000356 R_PPC_ADDR16_HA abs
0000035a R_PPC_ADDR16_LO abs
0000037a R_PPC_ADDR16_HA abs
0000037e R_PPC_ADDR16_LO abs
000003a2 R_PPC_ADDR16_HA abs
000003a6 R_PPC_ADDR16_LO abs
00000482 R_PPC_ADDR16_HA eepromReadByte
00000486 R_PPC_ADDR16_LO eepromReadByte
0000059e R_PPC_ADDR16_HA eepromWriteByte
000005a2 R_PPC_ADDR16_LO eepromWriteByte
000005b2 R_PPC_ADDR16_HA eepromReadByte
000005b6 R_PPC_ADDR16_LO eepromReadByte

一个很明显的问题,就是代码段变长了,这也是风河的库缺省不使用32位编译的原因。

[em13]

菜鸟
2007-05-11 17:38:00     打赏
6楼

是不是每个版本的vxworks识别命令不同

我用的是“-mlongcall”,确实有问题,如上所述

版本:vxworks5.5 为做过任何升级


菜鸟
2007-05-11 17:59:00     打赏
7楼
你是不是在longcall后面加了s啊?怎么显示“cc1.exe: Invalid option `longcalls'”呢

菜鸟
2007-05-12 01:47:00     打赏
8楼
以下是引用woodhead在2007-5-11 9:59:00的发言:
你是不是在longcall后面加了s啊?怎么显示“cc1.exe: Invalid option `longcalls'”呢

感觉很奇怪,

用“-mlongcall”时报出“cc1.exe: Invalid option `longcall'”

用“-mlongcalls”时报出“cc1.exe: Invalid option `longcalls'”

很无奈,实在没办法,只好牺牲32M内存了,实在不想:(


菜鸟
2007-05-13 19:40:00     打赏
9楼

不需要牺牲的。。。可以把高32M作为堆栈和动态块(用malloc等分配)来使用。在BSP中通过内存映射函数把这块内存添加到系统内存堆中。

也就是说,文本段的大小被限制为低32M内,使用26位寻址,但数据段则没有限制。

如果使用longcall,代价太大,不合适。。。。

[align=right][color=#000066][此贴子已经被作者于2007-5-13 11:42:41编辑过][/color][/align]

菜鸟
2007-05-14 20:01:00     打赏
10楼
以下是引用yaopg在2007-5-13 11:40:00的发言:

不需要牺牲的。。。可以把高32M作为堆栈和动态块(用malloc等分配)来使用。在BSP中通过内存映射函数把这块内存添加到系统内存堆中。

也就是说,文本段的大小被限制为低32M内,使用26位寻址,但数据段则没有限制。

如果使用longcall,代价太大,不合适。。。。


网上看了一下,longcall有不少缺点,不太想用。

你说的内存映射函数在哪里?如何实现能说的具体点吗?

我在bsp中将bank模块定义为64M的,但size为32M,剩余的32M除了用memAddToPool()函数,还能增么添加进去?

谢谢yaopg,有空请你吃肯德基

[em10]

共17条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]