韦东山Linux嵌入式课程社区
直播中

李丽

7年用户 304经验值
私信 关注

请问链接脚本编译地址就是加载地址吗?

对链接脚本好多疑问, 找了很多资料看了, 不知道我的理解有没有错误,还请指点

1. 编译地址就是加载地址?是不是存的就是编译完后的可执行文件?不管什么段,text,bss,data等等都顺序往下存?
2. 链接地址就是代码的运行地址, 指定了可执行文件被拷贝到SDRAM后程序实际运行的地址
那么这儿我的问题就是指定运行地址有什么用吗?当把执行文件拷贝到SDRAM的时候不是通过bootloader完成的吗?这个bootloader里不还是得程序员自己编写把各种段复制到哪个地址吗?既然这样的话,链接脚本里的地址起什么作用了? 还是说有了链接脚本指定运行地址的话就能自动复制执行文件到SDRAM呢?

问题很菜,但确实很不困惑,请了解的人多指点下, 万分感谢!!!

回帖(6)

谭军红

2019-7-5 10:48:30
链接脚本跟启动代码有什么关系? 链接脚本里定的地址是虚的不起真正的作用, 实际各个段(text, bss, data...)存的实际位置还不是启动代码里指定吗? 启动代码如果指的位置跟链接脚本里不一样的话呢?
举报

孔维源

2019-7-5 10:56:43
把另一个贴子的内容也一起贴过来

请问这样的脚本是不是对所有的程序通用?
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开始的话就没法运行?
举报

娄莉莉

2019-7-5 11:12:44
1. 编译地址就是加载地址?是不是存的就是编译完后的可执行文件?不管什么段,text,bss,data等等都顺序往下存?
2. 链接地址就是代码的运行地址, 指定了可执行文件被拷贝到SDRAM后程序实际运行的地址
那么这儿我的问题就是指定运行地址有什么用吗?当把执行文件拷贝到SDRAM的时候不是通过bootloader完成的吗?这个bootloader里不还是得程序员自己编写把各种段复制到哪个地址吗?既然这样的话,链接脚本里的地址起什么作用了? 还是说有了链接脚本指定运行地址的话就能自动复制执行文件到SDRAM呢?

链接地址就是“程序运行时应该位于的地址”,这个地址上“应该”存有这个可执行程序。这些段是否顺序存放,是由链接脚本控制的。你完全可以修改链接脚本来决定哪一段放在哪。
我们说的是“裸板程序”,它自己把自己复制到SDRAM,BOOTLOADER是一个裸板,它也是自己把自己复制到SDRAM;BOOTLOADER不去复制其他可执行程序。
从没有“自动”,都是程序去复制的
举报

王凤英

2019-7-5 11:25:01
谢谢版主!

我可能没表述清, 我的意思是说
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是不是应该把所有的可执行文件都复制过去了?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分