zoukankan      html  css  js  c++  java
  • Linux Linker Script

    先推荐两个网页:

         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文本中。

  • 相关阅读:
    BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】
    SPOJ QTree【树链剖分】
    BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】
    Hibernate学习实例
    Educational Codeforces Round 64 C. Match Points 【二分思想】
    ramn 备份操作
    表值函数--自定义工作日历
    删除win10开始菜单中程序的目录
    C#自定义注释自动生成模板注释
    oralce知识第三章
  • 原文地址:https://www.cnblogs.com/kanite/p/4171185.html
Copyright © 2011-2022 走看看