Board logo

标题: ARM裸机程序研究 - 编译和链接(4) [打印本页]

作者: yuyang911220    时间: 2015-1-24 16:13     标题: ARM裸机程序研究 - 编译和链接(4)


所有节的位置都已确定。虽然.bss节也有大小,但是这个大小是告诉ELF装载器要分配多少内存给.bss,实际是不占文件大小的。所以.bss节没有“LOAD”标志。这点,也可以从.bss和后面的.comment有相同的File offset可以看出。更进一步,可以用hexdump查看文件,看变量的地址是不是已经被链接器修改。不过.text节的偏移已经变成0x94,所以需要查看的偏移也相应的变成0xd8。


再回到我们真正想要的裸代码上来。前面,我们只将生成的可执行文件中的.text节抠了出来,现在知道是不够的,因为丢掉了.data节,也就丢失了定义的全局变量。我们可以稍稍修改下链接脚本,将.data节合并到.text节中就可以了。新的链接脚本如下:

SECTIONS
{
    .text : {*(.init) *(.text) *(.data)}
}                                                                                                           



用arm-linux-ld -T ld.ld test.o -o test链接后,再用arm-linux-objdump -x查看,发现已经没有.data节了,而.text节的大小变成了0x58字节。至于.bss节,本来,ELF装载器会在内存中为其分配空间。但是对我们来说,还没有内存分配函数,只是将.bss放在.data节后面。对于裸代码来说,只有.text(包含.data)是有预定义数据,还有内存末端的栈是要占用一些内存的,其他都是自由的未使用的内存,这也正符合了.bss的需求。(本来应该将.bss也放入链接脚本,不过我发现ld会自动将.bss放在.data后面,所以这里链接脚本就没有列出.bss).   





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0