arm-linux编译链接过程

 目前只知道编译内核时先make menuconfig进行一些个性化的设置。然后执行make即可在内核源码根目录下得到ELF文件vmlinux,并且在相应体系结构arch/arm/boot目录下得到zImage可执行的压缩内核映像,进而烧写到开发板中。

    只是这个过程到底是怎么样的,linux内核如何实现这一系列复杂的链接编译。网上看了点资料,总结一下。

    内核编译首先要生成的是vmlinux。这是一个ELF格式,非压缩的内核。他是如何得来的,在源码根目录下。vmlinux.cmd文件中可以查看到。

    cmd_vmlinux := arm-linux-ld -EL  -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o  init/built-in.o --start-group  usr/built-in.o  arch/arm/kernel/built-in.o  arch/arm/mm/built-in.o  arch/arm/common/built-in.o  arch/arm/mach-s3c64xx/built-in.o  arch/arm/plat-samsung/built-in.o  kernel/built-in.o  mm/built-in.o  fs/built-in.o  ipc/built-in.o  security/built-in.o  crypto/built-in.o  block/built-in.o  arch/arm/lib/lib.a  lib/lib.a  arch/arm/lib/built-in.o  lib/built-in.o  drivers/built-in.o  sound/built-in.o  firmware/built-in.o  net/built-in.o --end-group .tmp_kallsyms2.o

    可以看出vmlinux的生成依赖于arch/arm/kernel/head.o,arch/arm/kernel/init_task.o,以及其他子目录下的built-in.o。至于底层还需要什么文件也可以按图索骥了。

    vmlinux虽然已经是一个编译好的内核映像,但并不是最终烧写的映像,vmlinux需要通过arm-linux-objcopy转换,在对应体系结构下生成bin格式的映像文件Image。压缩映像由make zImage命令完成。最终生成zImage。

    过程为:

    1.用gzip对压缩内核二进制映象arch/arm/boot/ Image 进行压缩,生成arch/arm/boot/compressed/piggy.gz 文件

    2.在/arch/arm/boot/conpressed目录下生成vmlinux

    vmlinux把内含的内核符号表剥离,在arch/arm/boot/compressed/vmlinux.bin,再将vmlinux.bin压缩成vmlinux.bin.gz,将vmlinux.scr和vmlinux.bin.gz链接成piggy.o,将head.o、misc.o和piggy.o链接成当前目录下的vmlinux,将vmlinux文件strip掉符号表得到arch/i386/boot/vmlinux.bin。

    对应代码:

    cmd_arch/arm/boot/compressed/vmlinux := arm-linux-ld -EL    --defsym zreladdr=0x50008000 -p --no-undefined -X -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.gzip.o arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/decompress.o arch/arm/boot/compressed/lib1funcs.o -o arch/arm/boot/compressed/vmlinux

    这是具备自解压功能的压缩内核,也是ELF格式。

    3.用 arm-linux-objcopy 命令把 arch/arm/boot/compressed/vmlinux 转换为二进制格式映象:

    arch/arm/boot/zImage

    该目录下。zImage.cmd代码为

    cmd_arch/arm/boot/zImage := arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S  arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage

    zImage为压缩了的可执行二进制文件。但在这个文件开头部分内嵌有gzip解压缩代码。linux内核启动时由bootloader把这个映像文件调入内存RAM中,执行完开头的解压缩部分后即可真正进入内核。

    至于arm中linux内核是如何启动的,下回再述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值