完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
学到了第13课002节,不明白链接脚本中的这句代码.data 0x30000000 : AT(0x800) { *(.data) }中的运行时地址(0x3000000)起到了什么作用?
既然我还是需要在Start.S里面手动重定位代码,那么不要这一句也可以吧? |
|
相关推荐
5个回答
|
|
不指定0x30000000,代码怎么知道重定位到哪里呢
|
|
|
|
因为Start.S里面指定了啊
/* 重定位data段 */ mov r1, #0x800 ldr r0, [r1] mov r1, #0x30000000 str r0, [r1] |
|
|
|
ldr pc,=main是位置有关码,是根据链接地址去跳转的,链接地址在sdram,就跳到sdram里了
|
|
|
|
我说的也有问题。应该是,如果链接脚本里面只指定了data段运行时地址没有指定加载地址时,data段是直接放在0x30000000的地方,可以看到编译出来的bin文件很大。和直接在Makefile文件里面直接指定data段地址的效果是一样的,所以为了减少不必要的空间浪费,增加一个加载地址,把data段拼接到代码段的后面,这样编译出来的bin文件就小很多。
但是这样是运行是访问不到data段的数据的,因为main函数里面访问data段的数据时,是直接访问0x30000000这个地址,而实际上data段被放在了代码段的后面,所以就要在start.S里面做重定位的动作,把data段数据从0x800拷贝到0x30000000。 |
|
|
|
这一步仅仅是cpy, 运行时需要知道data的地址,因此需要在链接脚本中写明
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2187 浏览 6 评论
1987 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4545 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 09:52 , Processed in 0.761167 second(s), Total 83, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号