vxworks运行正常,但在加载应用程序时
报出:“relocation value dose not fit in 26 bits”错误,一堆
是否符号表损坏,只要是加载任何程序都是,调用loadmodule时会出错
没见过此现象
如何入手查这问题???
好像由于内存扩大造成,现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
应该是 -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
编译以后使用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]不需要牺牲的。。。可以把高32M作为堆栈和动态块(用malloc等分配)来使用。在BSP中通过内存映射函数把这块内存添加到系统内存堆中。
也就是说,文本段的大小被限制为低32M内,使用26位寻址,但数据段则没有限制。
如果使用longcall,代价太大,不合适。。。。
网上看了一下,longcall有不少缺点,不太想用。
你说的内存映射函数在哪里?如何实现能说的具体点吗?
我在bsp中将bank模块定义为64M的,但size为32M,剩余的32M除了用memAddToPool()函数,还能增么添加进去?
谢谢yaopg,有空请你吃肯德基
[em10]有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |