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
不需要牺牲的。。。可以把高32M作为堆栈和动态块(用malloc等分配)来使用。在BSP中通过内存映射函数把这块内存添加到系统内存堆中。
也就是说,文本段的大小被限制为低32M内,使用26位寻址,但数据段则没有限制。
如果使用longcall,代价太大,不合适。。。。
网上看了一下,longcall有不少缺点,不太想用。
你说的内存映射函数在哪里?如何实现能说的具体点吗?
我在bsp中将bank模块定义为64M的,但size为32M,剩余的32M除了用memAddToPool()函数,还能增么添加进去?
谢谢yaopg,有空请你吃肯德基
[em10]应该是:LOCAL_MEM_SIZE 64M
USER_RESERVED_MEM 32M
RAM_HIGH_ADRS不要超过32M范围,在29M处比较合适吧。
在sysLib.c里面用memAddToPool函数添加,,,,很多参考bsp里面有例子。
启动后,用大型内存块分配来测试是否成功。
内存起始地址定义:0x30000000
LOCAL_MEM_SIZE 64M
USER_RESERVED_MEM 32M
RAM_LOW_ADRS 0x30001000
RAM_HIGH_ADRS 0x30200000
正常启动后,内存大小为32M,此时加载应用程序loadmodule()正常
但,如果添加到内存池后,通过memAddToPool(0x32000000,0x2000000);
加载应用程序会像以前一样报出:“Relocation value does not fit in 26 bits.”
而且感觉两部分内存没有连接上,memAddToPool之后,用malloc来测试,
发现动态加载32M不成功,加载两个20M成功,20M的内存指针分别位于低32M和高32M中
所有两块内存没有连接统一管理。
分支和带链接分支寻址+—32M,添加内存池后,寻址范围还是超过32M。