先推荐两个网页:
http://blog.csdn.net/muyuyuzhong/article/details/7755291
http://www.cnblogs.com/liulipeng/archive/2013/10/14/3368938.html
链接脚本的核心部分Section定义如下:
1 SECTIONS { 2 ... 3 secname start BLOCK(align) (NOLOAD) : AT ( ldadr ) 4 { contents } >region :phdr =fill 5 ... 6 }
secname 定义段名称。
start 指定运行地址。
BLOCK(align) 指定块对齐。比如前一个段从0x3000_000到0x3000_03f1,此处标记ALIGN(4),表示此处最小占用4Byte,即使下一个段是紧挨这个段,那么下一个段的起始地址(也就是运行地址)为0x3000_03f4。看内核的链接脚本vmlinux.lds(arch/arm/kernel/vmlinux.lds)中会出现很多ALIGN(1<<12)或者ALIGN(8192)等,指定下一段的地址地址原理也是一样的。
NOLOAD 告诉加载器,程序运行时不加载这一段。这个字段告诉我一个重要信息,有加载器这个东西。程序从FLASH搬到SDRAM中运行时,是用到了加载器这个东西。
AT(ldaddr):指定这个段在编译出来的印象文件中的地址--加载地址。在推荐的第一个网页中,cnblog网友关于加载地址和运行地址的解释很不好理解,他将加载地址理解为存储在FLASH中的地址。但问题是,NANDFLASH是挂在CPU总线系统之上的,怎么确定NANDFLASH的地址呢,只能说某段相对整个可执行文件起点的相对位置。在韦东山的书中,关于这点的解释是“通过这个选项,可以控制各段分别保存输出文件中不同的位置,便于把文件保存在单板上:A段放在A处、B段放在B处,运行前再把A、B端分别读出来组装成一个完整的执行程序。”这也是看得很模糊,先留着,以后再表。
关于链接脚本的例子,参见cnblog网友的例子。
两个重要的工具指令: arm-linux-objdump -h vmlinux > vmlinux.txt 输出linux内核段信息到vmlinux.txt文本中。
arm-linux-objdump -f vmlinux > sec_symbol.txt输出内核段信息和符号到sec_symbol.txt文本中。