CaryStudio

 找回密码
 立即注册
搜索
查看: 6418|回复: 0

ASUS N14U 源码编译过程分析(上)

[复制链接]
发表于 2017-11-17 13:51:09 | 显示全部楼层 |阅读模式

请先登录

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
      源代码下载地址:http://www.right.com.cn/forum/thread-158208-1-1.html
      主要涉及到两个关键的Makfile,因为这些Makefile的自动化程度不高,所以代码显得很繁琐,但正因为如此,才相对显得比较简单。首先是asuswrt/release/src-ra-mt7620目录下的Makefile
      略去前面的变量定义部分,进入关键的部分:

image目标
  1. image:  
  2.     @if [ -z "$(BUILD_NAME)" ]; then \  
  3.         echo "No BUILD_NAME is assigned"; \  
  4.         exit 1; \  
  5.     fi  
  6.   
  7.     @rm -f image/$(BUILD_NAME)_$(KERNEL_VER).$(FS_VER)_$(SERIALNO).trx  
  8.     @$(MAKE) -C router image  
  9.   
  10. ifeq ($(CONFIG_RALINK),y)  
  11.     #开始生成image  
  12. else  
  13.     #非ralink设备,只进行简单的打包  
  14. endif
复制代码
生成image部分没有什么特别的编译行为,但是里面对文件进行相关的打包操作,很有技巧性,值得学习和研究。


内核打包
  1. @rm -rf $(PLATFORMDIR)/zImage.lzma ; \  
  2. mipsel-linux-objcopy -O binary $(LINUXDIR)/vmlinux $(PLATFORMDIR)/vmlinus ; \  
  3. asustools/lzma -9 -f -c $(PLATFORMDIR)/vmlinus > $(PLATFORMDIR)/zImage.lzma ; \  
  4. cp -f $(PLATFORMDIR)/zImage.lzma $(PLATFORMDIR)/zImage.img ; \  
复制代码
首先生成kernel的bin目标文件vmlinus,然后调用lzma进行最高强度的压缩,生成zImage.lzma,最后将文件拷贝到$(PLATFORMDIR)目录,
通过前面的定义
  1. export PLATFORM := mipsel-uclibc  
  2. export PLATFORMDIR := $(SRCBASE)/router/$(PLATFORM)
复制代码
可知,该目录位于router/mipsel-uclibc

对内核进行字节填充
      此部分的代码比较多,但是容易理解,用到了shell中的wc、awk、expr、dd、tr等命令,此处不详述,感兴趣的读者可以对照Makefile文件研究。
生成最终的刷机固件
      核心代码是调用mkimage命令,生成trx刷机固件文件。
我们知道mkimage需要知道代码的入口点,这个入口点如何用程序获取呢?这个技巧值得我们去学习:
  1. @ENTRY=`LANG=en_US readelf -h $(ROOTDIR)/$(LINUXDIR)/vmlinux | grep "Entry" | awk '{print $4}'` ; \  
  2. ISIZE=`wc -c $(PLATFORMDIR)/zImage.img | awk '{print $1}'` ; \  
  3. KSIZE=`wc -c $(PLATFORMDIR)/zImage.lzma | awk '{print $1}'` ; \  
  4. RSIZE=`wc -c $(PLATFORMDIR)/target.image | awk '{print $1}'` ; \  
  5. PAD2=`expr
  6. ISIZE−

  7. {KSIZE} - ${RSIZE}` ; \  
  8. RFSOFFSET=`expr 64 +
  9. KSIZE+

  10. {PAD2}` ; \  
  11. echo "PAD2: ${PAD2}" ; \  
  12. asustools/mkimage -A mips -O linux -T kernel -C lzma -a 80000000 -e
  13. ENTRY−r

  14. {RFSOFFSET} \  
  15.     -n $(BUILD_NAME) -V "$(KERNEL_VER)" "$(FS_VER)" "0" "0" "0" "0" "0" "0" "0" "0" \  
  16.     -d $(PLATFORMDIR)/zImage.img image/$(BUILD_NAME)_$(KERNEL_VER).$(FS_VER)_$(SERIALNO)_$(SWPJVER)$(EXTENDNO).trx ; \  

复制代码
它利用readelf -h,读出vmlinux的header部分信息:
  1. ABI Version:                       0  
  2. Type:                              EXEC (Executable file)  
  3. Machine:                           MIPS R3000  
  4. Version:                           0x1  
  5. <span style="color:#ff0000"> Entry point address:               0x8000c150</span>  
  6. Start of program headers:          52 (bytes into file)  
  7. Start of section headers:          3445604 (bytes into file)  
  8. Flags:                             0x70001001, noreorder, o32, mips32r2  
  9. Size of this header:               52 (bytes)  
  10. Size of program headers:           32 (bytes)  
  11. Number of program headers:         2  
  12. Size of section headers:           40 (bytes)  
  13. Number of section headers:         21  
  14. Section header string table index: 18
复制代码
利用grep "Entry" | awk '{print $$4}',就能获取到入口地址0x8000c150

通配符目标
利用通配符,实现了一些简化的操作,如:
  1. mk-%:  
  2.     @$(MAKE) -C router $(shell echo $@ | sed s/mk-//)
复制代码
和:
  1. %: dummy  
  2.     @[ ! -d router/$* ] || $(MAKE) -C router $@  
  3.   
  4.   
  5. %-clean: dummy  
  6.     @-[ ! -d router/$* ] || $(MAKE) -C router $@  
  7.   
  8. %-install: dummy  
  9.     @[ ! -d router/$* ] || $(MAKE) -C router $* $@  
  10.   
  11. %-stage: dummy  
  12.     @[ ! -d router/$* ] || $(MAKE) -C router $* $@  
  13.   
  14. %-build: dummy  
  15.     $(MAKE) $*-clean $*  
  16.   
  17. %-tags: dummy  
  18.     @[ ! -d router/$* ] || ctags -a -R $(CTAGS_EXCLUDE_OPT) $(SRCBASE)/../src/router/$*  
复制代码

all目标
有意放在最后来介绍,因为此处就要跳转到router目录,进行下一个重要编译过程
  1. all: rt_ver  
  2.     @echo ""  
  3.     @echo "Building $(BUILD_NAME)_$(KERNEL_VER).$(FS_VER)_$(SERIALNO).trx"  
  4.     @echo ""  
  5.     @echo ""  
  6.   
  7.     @-mkdir image  
  8.     @$(MAKE) -C router all  
  9.     @$(MAKE) -C router install  
  10.     @$(MAKE) image
复制代码
实际上是进入到router目录,对all和install目标进行编译。
我将在下一篇文章中,对router目录中的Makefile进行描述。











回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|CaryStudio ( 粤ICP备16022806号 )

GMT+8, 2023-6-8 10:54 , Processed in 0.087260 second(s), 12 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表