首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM裸机程序研究 - 编译和链接(4)

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).   
继承事业,薪火相传
返回列表