读书频道 > 系统 > linux > 深度探索Linux操作系统系统构建和原理解析
3.2.5 setup.bin的构建过程
2013-09-28 16:10:10     我来说两句 
收藏    我要投稿   
全书一共8章:第1章介绍了如何准备工作环境。在第2章中构建了编译工具链,这是后面构建操作系统各个组件的基础。在这一章中,不仅详细讲解了工具链的构建过程,而且还通过对编译链接过程的探讨,深入讨论了工具链  立即去当当网订购

构建setup.bin的规则也在arch/x86/boot目录下的Makefile中:
linux-3.7.4/arch/x86/boot/Makefile:
setup-y  += a20.o bioscall.o cmdline.o copy.o cpu.o cpucheck.o
...
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
...
LDFLAGS_setup.elf   := -T
$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
    $(call if_changed,ld)
OBJCOPYFLAGS_setup.bin  := -O binary
$(obj)/setup.bin: $(obj)/setup.elf FORCE
    $(call if_changed,objcopy)

根据setup.bin的构建命令可见,setup.bin是由setup.efl经过objcopy复制而来的。根据构建setup.elf的规则可见,构建setup.elf的命令为cmd_ld,其定义如下:
linux-3.7.4/scripts/Makefile.lib:
cmd_ld = $(LD) $(LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) \
           $(filter-out FORCE,$^) -o $@

这里LD就是链接器i686-none-linux-gnu-ld,定义在顶层Makefile中:
linux-3.7.4/Makefile:
LD      = $(CROSS_COMPILE)ld

链接器的输出就是规则的目标(“$@”),这里就是setup.elf。“$^”也是make的一个自动变量,表示规则的全部依赖,所以这里链接器的输入即是规则的依赖,但是使用make的内置函数filter-out过滤掉了依赖中的伪目标FORCE,因此输入是arch/x86/boot/setup.ld和$(SETUP_OBJS)。其中,setup.ld是传递给链接器的链接脚本;SETUP_OBJS对应的则是变量setup-y中记录的目标文件,只不过使用make的内置函数addprefix在这些文件前面中添加了一个前缀,目的是在顶层目录中能找到这些目标文件。

这里我们看到了kbuild的一个约定,虽然都在arch/x86/boot目录下,但是引用原本就存在的文件setup.ld使用的是变量src,而引用动态创建的SETUP_OBJS则使用了变量obj。

将上述变量替换到cmd_ld,cmd_ld最后展开为:
cmd_ld = i686-none-linux-gnu-ld –T arch/x86/boot/setup.ld \
         arch/x86/boot/a20.o arch/x86/boot/bioscall.o ...\
         –o arch/x86/boot/setup.elf

也就说,链接器依照链接脚本setup.ld,将arch/x86/boot目录下的目标文件a20.o、bioscall.o等链接为setup.elf。

但是setup.elf也是ELF格式的,ELF附加的一些信息对内核是没有意义的,所以kbuild也将ELF格式的setup.elf转换为裸二进制格式的setup.bin。至此,一级推进系统准备完成。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.2.4 vmlinux.bin的构建过程
下一篇:3.2.6 bzImage的组合过程
相关文章
图文推荐
3.3.6 GNOME的软件管
3.3.5 GNOME的文件管
3.3.4 GNOME的窗口管
3.3.3 收藏夹和快捷
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站