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]打赏帖 | |
---|---|
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】mcxa156使用低功耗定时器适配硬件RTC框架被打赏26分 | |
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 |