免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4308 | 回复: 3
打印 上一主题 下一主题

bootloader启动后变量编译地址和运行地址不一致问题(powerpc处理器) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-06 16:54 |只看该作者 |倒序浏览
大家好,又来请教大家了。
之前咨询过大家关于powerpc的一些问题,现在我们板子用uboot引导起来了,我们裁剪了u-boot。
在之后应用编程发现一个问题,用汇编语言编写的函数,访问一个已经初始化的全局变量,全局变量在之后在一个C代码函数里修改过,在汇编函数里读取值发现全局变量的值还是初始化的。
过程如下:

unsigned long globala=111;//全局变量

在一个C函数里:
void A()
{
...
修改globala =200;
...
}
在一个B汇编函数里:
读取修改的全局变量:
.globl  global
global:
    mflr r27
    lis  r3,globala@ha
    lwz r3,globala@l(r3)
    bl printgl //打印globala的值,发现还是111,而不是200,
   mtlr r27
    blr
我们认为和got全局偏移量表有关,是不是全局变量放在偏移量表里面了,所以没法访问:
然后汇编修改如下:
    lis  r3,globala@got@ha
    lwz r3,globala@got@l(r3)
发现还是111.而不是200??
想请教下大家。

论坛徽章:
0
2 [报告]
发表于 2009-12-06 16:55 |只看该作者
惨了,我发现freescale的基于e300内核的mpc8313开发板。
在boot起来时,CPU片选nor flash(地址为0xfe000000,ram的地址为0x0),在flash里启动,然后重定位到ram里进行,在ram里起来后,ram地址为0x0,flash还是为0xfe000000,这就导致了程序编译和运行的地址不一样,导致访问全局变量时,地址还是flash的地址,除非在函数里,申请临时变量来获取全局变量的地址(编译器解决了这个问题),直接在汇编代码里获取全局变量的值和地址还是在flash里的,没有取到ram里的。我们不知道怎么解决全局变量地址问题?这和arm不一样,arm起来时,flash是0x0,内存是0x50000000,重定位后,又把ram映射为0x0,flash映射为0x50000000,不会使同一个变量有2个地址。
各位大侠,有什么高见啊?
linux怎么做的~

论坛徽章:
0
3 [报告]
发表于 2009-12-09 20:32 |只看该作者
符号解析过早?
linux中的共享库, map到哪当然都是可以, 然后连接器解析符号, 但是一旦解析完成,你再把数据都移动了,那GOT/PLT中的内容肯定是旧的,所以应该先移动(确定位置)后符号解析(你的情况却像相反)。
不过没太看懂你的情况,仅随口说说, 可以到CPU与编译器版问问

论坛徽章:
0
4 [报告]
发表于 2009-12-11 18:10 |只看该作者
嗯,楼主,我就是在CPU与编译器版上面和大家交流,然后到这里再问问大家。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP