版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、解释一个 ld.script 文件本文详细解释一个 ld.script 文件OUTPUT_FORMAT("elf32-tradlittlemips") OUTPUT_ARCH(mips)ENTRY(_start)SECTIONS/* Read-only sections, merged into text segment: */. = 0x80100000;.text :_ftext = . ;*(.text)*(.rodata)*(.rodata1)*(.reginfo)*(.init)*(.stub)/* .gnu.warning sections are handle
2、d specially by elf32.em. */*(.gnu.warning) =0_etext = .; PROVIDE (etext = .);.fini: *(.fini) =0.data :_fdata = . ;*(.data)CONSTRUCTORS.data1 : *(.data1) .ctors :_CTOR_LIST_ = .; LONG(_CTOR_END_ -CTOR_LIST_) / 4 - 2)*(.ctors) LONG(0)_CTOR_END_ = .;.dtors :_DTOR_LIST_ = .;LONG(_DTOR_END_ -_DTOR_LIST_)
3、 / 4 - 2)*(.dtors)LONG(0)_DTOR_END_ = .;_gp = ALIGN(16) + 0x7ff0;.got :*(.got.plt) *(.got)/* We want the small data sections together, so single-instruction offsetscan access them all, and initialized data all before uninitialized, sowe can shorten the on-disk segment size.*/.sdata: *(.sdata) .lit8
4、: *(.lit8) .lit4 : *(.lit4) _edata = .;PROVIDE (edata = .);_bss_start = .;_fbss = .;.sbss: *(.sbss) *(.scommon) .bss:*(.dynbss)*(.bss)*(COMMON). = ALIGN(16);_bss_end = .;_end = .;_end = .; end = .;PROVIDE (end = .);/* These are needed for ELF backends which have not yet beenconverted to the new styl
5、e linker. */.stab 0 : *(.stab) .stabstr 0 : *(.stabstr) /* DWARF debug sections.Symbols in the .debug DWARF section are relative to the beginning of thesection so we begin .debug at 0. It's not clear yet what needs to happenfor the others. */.debug 0 : *(.debug) .debug_srcinfo0 : *(.debug_srcinf
6、o) .debug_aranges0 : *(.debug_aranges) .debug_pubnames 0 : *(.debug_pubnames) .debug_sfnames0 : *(.debug_sfnames) .line0 : *(.line) /* These must appear regardless of . */.gptab.sdata : *(.gptab.data) *(.gptab.sdata) .gptab.sbss : *(.gptab.bss) *(.gptab.sbss) 下面逐句解释。OUTPUT_FORMAT("elf32-tradlit
7、tlemips") OUTPUT_ARCH(mips)OUTPUT_FORMAT 和 OUTPUT_ARCH 都是 ld 脚本的保留字命令。OUTPUT_FORMAT 说明输出二进制文件的格式。 OUTPUT_ARCH 说明输出文 件在平台。ENTRY(_start)ENTRY 命令的作用是, 将后面括号中的符号 值设置成入口地址。入口地址( entrypoint)的定义是这样的一一进程执行的第一条用户空间的指令 在进程地址空间中的地址。ld 有多种方法设置进程入口地址,通常它按以下顺序: (编 号越前 , 优先级越高)1, ld 命令行的 -e 选项2, 连接脚本的ENTRY(SY
8、MBOL) 命令3, 如果定义了 start 符号 , 使用 start 符号值4, 如果存在 .text section, 使用 .text section 的第一字节的位置值5, 使用值 0SECTIONS然后,接下来是一大段的SECTIONS ,对应的右大括号直到脚本的末尾。SECTIONS 命令告诉 ld 如何把输入文件的 sections 映射到输出文件的各个 section :即是如何将输入 section 合为输出 section ;如何 把输出 section放入程序地址空间 (VMA) 和进程地址空间 (LMA) 。该命 令格式如下:SECTIONS…./
9、* Read-only sections, merged into text segment: */. = 0x80100000; 这句把定位器符号置为 0x80100000 (若不指定,则该符号的初始值为0 )。是一个特殊的符号,它是定位器,一个位置指针,指向程序 地址空间内的某位置(或某 section 内的偏移,如果它在 SECTIONS 命令内的某 section 描述内),该符号只能在 SECTIONS 命令内使用。.text :_ftext = . ;*(.text)*(.rodata)*(.rodata1)*(.reginfo)*(.init)*(.stub)/* .gnu.wa
10、rning sections are handled specially by elf32.em. */*(.gnu.warning) =0.text : 表示 text 段开始。_ftext*(.text)将所有 (*符号代表任意输入文件 )输入文件的 .text section 合 并成一个 .text section, 该 section 的地址由定位器符号的值 指定 ,即 0x80100000.*(.rodata)*(.rodata1)*(.reginfo)*(.init)*(.stub)*(.gnu.warning)=0 表示合并时留下的空隙用 0 填充;_etext = .;PRO
11、VIDE (etext = .);_etext = .; 我们看到,很多变量都定 义成等于这个 . 符,实际上这个符号所代表的值是在变化的, 随着越往后走, 值越增加,根据前面填充的多少自动往后加。PROVIDE 关键字用于定义这类符号: 在目标文件内被引用, 但没有在任何目标文件内被定义的符号。这里就定义了一个etext 符号,当目标文件内引用了 etext 符号,却没有定义 它时, etext 符号对应的地址被定义为 .text section 之后的 第一个字节的地址。.fini: *(.fini) =0 意思与前面一样,但 fini 这名字是哪个段,我还搞不太清楚(?) 。.data
12、:_fdata = . ;*(.data)CONSTRUCTORS.data1: *(.data1) 数据段终于来到了,意思很容易理解的了。CONSTRUCTORS 是一个保留字命令。与 c+ 内的(全局对象的)构造函数和(全局对像的)析构函数相 关。.ctors :_CTOR_LIST_ = .;LONG(_CTOR_END_ -_CTOR_LIST_) / 4 - 2)*(.ctors)LONG(0)_CTOR_END_ = .;.dtors :_DTOR_LIST_ = .;LONG(_DTOR_END_ -_DTOR_LIST_) / 4 - 2)*(.dtors)LONG(0)_DT
13、OR_END_ = .; 对于支持任意 section 名的目标文件格式,比如 COFF 、ELF 格式, GNU C+ 将全局构造和全局析构信息分别放入.ctors section 和 .dtors section内当连接器生成的目标文件格式不支持任意 section 名字时, 比如说 ECOFF 、XCOFF 格式, 连接器将通过名字来识别全 局构造和全局析构,对于这些文件格式,连接器把与全局构 造和全局析构的相关信息放入出现CONSTRUCTORS 关键字的输出 section 内。符号 _CTORS_LIST_ 表示全局构造信息的的开始处,_CTORS_END_ 表示全局构造信息的结束
14、处。符号 _DTORS_LIST_ 表示全局构造信息的的开始处,_DTORS_END_ 表示全局构造信息的结束处。 这两块信息的开始处是一字长的信息,表示该块信息有多少 项数据,然后以值为零的一字长数据结束。一般来说, GNUC+ 在函数 _main 内安排全局构造代码的运行,而 _main 函数被初始化代码(在 main 函数调用之前执行)调用。_gp = ALIGN(16) + 0x7ff0;_gp 是一个重要的全局变量,好 像是用作全局引用的一个指针。.got :*(.got.plt) *(.got)/* We want the small data sections together,
15、 so single-instruction offsetscan access them all, and initialized data all before uninitialized, sowe can shorten the on-disk segment size.*/.sdata : *(.sdata) .lit8 : *(.lit8) .lit4 : *(.lit4) 意义类似。_edata = .;PROVIDE (edata = .); 意义与前面的 etext 符号也较为重要。_bss_start = .;_fbss = .;.sbss: *(.sbss) *(.sco
16、mmon) .bss:*(.dynbss)*(.bss)*(COMMON). = ALIGN(16);_bss_end = .;_end = .;_end = .; end = .;PROVIDE (end = .);BSS 段开始了。类似。 edatasection 。COMMON 的COMMON 这个保留字的意义: 通用符号 (common symbol) 的输入 section : 在许多目标文件格式中,通用符号并没有占用一个 连接器认为: 输入文件的所有通用符号在名为 section 内。上例中将所有输入文件的所有通用符号放入输出.bsssection 内。 这里,定义了几个重要的符号
17、 _bss_start = .;_bss_end = .;_end = .;_end = end = .; 在代码中可能会用到的。/* These are needed for ELF backends which have not yet beenconverted to the new style linker. */.stab 0 : *(.stab) .stabstr 0 : *(.stabstr) /* DWARF debug sections.Symbols in the .debug DWARF section are relative to the beginning of t
18、hesection so we begin .debug at 0. It's not clear yet what needs to happenfor the others. */.debug0 : *(.debug) .debug_srcinfo 0 : *(.debug_srcinfo) .debug_aranges0 : *(.debug_aranges) .debug_pubnames 0 : *(.debug_pubnames) .debug_sfnames0 : *(.debug_sfnames) .line 0 : *(.line) /* These must app
19、ear regardless of. */.gptab.sdata : *(.gptab.data) *(.gptab.sdata) .gptab.sbss : *(.gptab.bss) *(.gptab.sbss) 余下的这几个意义也类似,看英文注释应该能明白。 对初步编译出来的一个二进制文件进行 nm 解析,得到如下 内容80100200 D _CTOR_END_801001f8 D _CTOR_LIST_80100208 D _DTOR_END_80100200 D _DTOR_LIST_80100220 A _bss_end80100208 A _bss_start80100220
20、A _end80100208 A _edata80100220 A _end801001f8 A _etext80100208 A _fbss80100200 A _fdata80100000 T _ftext80108200 A _gp80100000 T _start80100038 t cleanpipe80100220 A end80100210 b flag_initialized.126380100158 T inbFrCom801000b4 T initBss80100060 T initConstructor80100100 T initMips801001a4 T outbT
21、oCom80100140 T readComReg801000f8 T showVersion800fc000 T stack80100000 T start80100120 T writeComReg开始的可以看到,所有的地址全是从 0x80100000 三个起始符号( T 表示在 text 段中) 80100000 T _start80100000 T start80100000 T _ftext 几个函数都在代码段内 80100038 t cleanpipe 80100060 T initConstructor 801000b4 T initBss 801000f8 T showVers
22、ion 80100100 T initMips 80100120 T writeComReg 80100140 T readComReg 80100158 T inbFrCom 801001a4 T outbToCom 栈底地址果然是在 start 下方 0x4000 处 800fc000 T stack (A 表示绝对不变) 801001f8 A _etext 80100200 A _fdata80100208 Aedata80100208 A _fbss80100208 A _bss_start80100220 A_bss_end80100220 A _end80100220 A _end80100220 A end全局构造和析构变量段( D 表示在已初始化过的数据段中)801001f8 D _CTOR_LIST_80100200 D_CTOR_END_801002
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2021高考语文总复习专题检测:15-论述类文章阅读一
- 【先学后教新思路】2020高考物理一轮复习-教案47-电容器与电容-带电粒子在电场中的运动
- 陕西省渭南市尚德中学2024-2025学年高一上学期第一次阶段性地理试卷(含答案)
- 吉林省松原市前郭五中2024~2025学年高一上期末考试 化学(含答题卡、答案)
- 《病患投诉处理技巧》课件
- 河北省唐山市2025届高三上学期1月期末考试数学试题(含答案)
- 浙江省杭州临平2023-2024学年第二学期期中检测卷 六年级下册科学
- 【同步备课】2020年高中物理学案(新人教必修二)7.9《实验:验证机械能守恒定律》5
- 《传统批发业重组》课件
- 【全程复习方略】2020年高考化学课时提升作业(四)-2.2-离子反应(人教版-四川专供)
- 律师法律服务应急预案
- 主动脉夹层介入手术的护理
- 浙江省嘉兴市经开区2023-2024学年四年级上学期期末学科素养评价科学试题
- 森林火灾灭火器具使用与技巧课件
- 双氧水资源综合利用项目建议书
- 物流园区及货运站场规划设计方案
- 如何处理销售过程中的问题和挑战
- 广东省广州市黄埔区2023-2024学年八年级上学期期末生物试卷+
- 眼科优势病种中医诊疗方案
- 高中数学联赛历年真题分类汇编解析(高分强基必刷)
- 2024年工程部工作总结与计划
评论
0/150
提交评论