完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
对链接脚本好多疑问, 找了很多资料看了, 不知道我的理解有没有错误,还请指点
1. 编译地址就是加载地址?是不是存的就是编译完后的可执行文件?不管什么段,text,bss,data等等都顺序往下存? 2. 链接地址就是代码的运行地址, 指定了可执行文件被拷贝到SDRAM后程序实际运行的地址 那么这儿我的问题就是指定运行地址有什么用吗?当把执行文件拷贝到SDRAM的时候不是通过bootloader完成的吗?这个bootloader里不还是得程序员自己编写把各种段复制到哪个地址吗?既然这样的话,链接脚本里的地址起什么作用了? 还是说有了链接脚本指定运行地址的话就能自动复制执行文件到SDRAM呢? 问题很菜,但确实很不困惑,请了解的人多指点下, 万分感谢!!! |
|
相关推荐
6个回答
|
|
链接脚本跟启动代码有什么关系? 链接脚本里定的地址是虚的不起真正的作用, 实际各个段(text, bss, data...)存的实际位置还不是启动代码里指定吗? 启动代码如果指的位置跟链接脚本里不一样的话呢?
|
|
|
|
把另一个贴子的内容也一起贴过来
请问这样的脚本是不是对所有的程序通用? SECTIONS { . = 0x00; .text : { *(.text) } .rodata ALIGN(4) : {*(.rodata)} .data ALIGN(4) : { *(.data) } .bss ALIGN(4) : { *(.bss) *(COMMON) } } 或者说一句 ld -Ttext 0x0000 ... 就行了? 其它的都不用管? 反正上电后把这个0x00开始的4K代码都要自动复制过去然后从0X000运行的,不知道我这样理解对吗? 而且脚本里的TEXT段起始地址必需为0,不能改的? 不然STEPPINGSTONE从0开始的话就没法运行? |
|
|
|
1. 编译地址就是加载地址?是不是存的就是编译完后的可执行文件?不管什么段,text,bss,data等等都顺序往下存?
2. 链接地址就是代码的运行地址, 指定了可执行文件被拷贝到SDRAM后程序实际运行的地址 那么这儿我的问题就是指定运行地址有什么用吗?当把执行文件拷贝到SDRAM的时候不是通过bootloader完成的吗?这个bootloader里不还是得程序员自己编写把各种段复制到哪个地址吗?既然这样的话,链接脚本里的地址起什么作用了? 还是说有了链接脚本指定运行地址的话就能自动复制执行文件到SDRAM呢? 链接地址就是“程序运行时应该位于的地址”,这个地址上“应该”存有这个可执行程序。这些段是否顺序存放,是由链接脚本控制的。你完全可以修改链接脚本来决定哪一段放在哪。 我们说的是“裸板程序”,它自己把自己复制到SDRAM,BOOTLOADER是一个裸板,它也是自己把自己复制到SDRAM;BOOTLOADER不去复制其他可执行程序。 从没有“自动”,都是程序去复制的 |
|
|
|
谢谢版主!
我可能没表述清, 我的意思是说 1. 可执行文件存在FLASH里的时候是不是一个接一个段的往下存, 就是说FLASH中间不会空掉一截内存不存东西的?这些可执行文件的内容存储的空间是不是由编译地址决定而不由链接脚本决定? 那么编译地址是自动定的还是要指定呢? 2. 对裸板程序, 链接脚本指定了运行地址 A (就像完全手册上6.2.1例子中的arm-linux-gld -Ttext 0x30000000... 这里的0x30000000是指定的运行地址)后, 还是需要手动在BOOTLOADER里编进运行地址 B (不知这个叫法是否正确? 就是6.2.1例子中你定义的SDRAM_BASE 0X30000000), 把可执行文件复制到SDRAM里的运行地址. 如果BOOTLOADER里写的运行地址 B 跟链接脚本运行地址 A 不同会怎么样? 还会正常运行吗? 我理解是可以的, 因为BOOTLOADER拷完后是不是有一句跳转指令直接跳到程序入口(main入口), 好像跟链接脚本规定的运行地址 A 没什么关系, 那么链接脚本指定的运行地址起什么作用了? 请指点. 3. 你在上面的解答中说BOOTLOADER不去复制其他可执行程序. 不太理解, 其它可执行程序不是也得在SDRAM上运行吗? 那是由谁来负责从FLASH上复制? 另外其它可执行程序是不是指各类函数(包括main函数)? 我看了完全手册第6章2节6.2.1的例子, head.o与leds.o都应该被编进sdram.bin了吧, 复制了前4K是不是应该把所有的可执行文件都复制过去了? |
|
|
|
1.
可执行文件存在FLASH里的时候是不是一个接一个段的往下存, 就是说FLASH中间不会空掉一截内存不存东西的?这些可执行文件的内容存储的空间是不是由编译地址决定而不由链接脚本决定? 那么编译地址是自动定的还是要指定呢? 答:这由链接脚本决定,你可以空出一段 2. 对裸板程序, 链接脚本指定了运行地址 A (就像完全手册上6.2.1例子中的arm-linux-gld -Ttext 0x30000000... 这里的0x30000000是指定的运行地址)后, 还是需要手动在BOOTLOADER里编进运行地址 B (不知这个叫法是否正确? 就是6.2.1例子中你定义的SDRAM_BASE 0X30000000), 把可执行文件复制到SDRAM里的运行地址. 答:手动在BOOTLOADER里编进运行地址?听不明白 如果BOOTLOADER里写的运行地址 B 跟链接脚本运行地址 A 不同会怎么样? 还会正常运行吗? 我理解是可以的, 因为BOOTLOADER拷完后是不是有一句跳转指令直接跳到程序入口(main入口), 好像跟链接脚本规定的运行地址 A 没什么关系, 那么链接脚本指定的运行地址起什么作用了? 请指点. 3. 你在上面的解答中说BOOTLOADER不去复制其他可执行程序. 不太理解, 其它可执行程序不是也得在SDRAM上运行吗? 那是由谁来负责从FLASH上复制? 另外其它可执行程序是不是指各类函数(包括main函数)? 我看了完全手册第6章2节6.2.1的例子, head.o与leds.o都应该被编进sdram.bin了吧, 复制了前4K是不是应该把所有的可执行文件都复制过去了? 答:BOOTLOADER的目的是启动内核,它确实是把内核从FLASH里复制到SDRAM里。 复制了前4K是不是应该把所有的可执行文件都复制过去了? : 是的,全部 |
|
|
|
嗯,懂了不少,谢谢您,版主。
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2195 浏览 6 评论
1994 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4549 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 10:15 , Processed in 0.832608 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号