版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、解释一个Id.script资料GNU Id (GNU Binutils for Ubuntu)Supported emulations:elf_i386i386linuxelf_x86_64elf_l1omusing internal linker script:/* Script for -z combreloc: combine and sort reloc sections*/OUTPUT_FORMAT(elf32-i386, elf32-i386,elf32-i386)OUTPUT_ARCH(i386)ENTRY(_start)SEARCH_DIR(/usr/i486-linux-gn
2、u/lib32);SEARCH_DIR(/usr/local/lib32);SEARCH_DIR(/lib32); SEARCH_DIR(/usr/lib32);SEARCH_DIR(/usr/i486-linux-gnu/lib);SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/lib);SEARCH_DIR(/usr/lib);SECTIONS /* Read-only sections, merged into text segment: */PROVIDE (_executable_start =SEGMENT_START(text-segment, 0
3、x08048000);.=SEGMENT_START(text-segment, 0x08048000)+ SIZEOF_HEADERS;.interp: *(.interp) .note.gnu.build-id : *(.note.gnu.build-id) .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_d .gnu.version .rel.dyn*(.rel.init): *(.hash) : *(.gnu.hash) : *(.d yn sym) : *(.dynstr) : *(.gnu.version) : *
4、(.gnu.version_d) : *(.gnu.version_r) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)*(.rel.fini)*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)*(.rel.tbss
5、 .rel.tbss.* .rel.gnu.linkonce.tb.*)*(.rel.ctors)*(.rel.dtors)*(.rel.got)*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)*(.rel.ifunc).rel.plt:*(.rel.plt)PROVIDE_HIDDEN (_rel_iplt_start =.);*(.rel.iplt)PROVIDE_HIDDEN (_relplt_end =.);.init:KEEP (*(.init) =0x90909090Pit: *(.plt) *(.iplt) .text*(.text.unl
6、ikely .text.*_unlikely)*(.text .stub .text.* .gn ui nkonce.t.*)/* .gnu.warning sections are handled specially byelf32.em. */*(.gnu.warning) =0x90909090.fini:KEEP (*(.fini) =0x90909090PROVIDE (_etext =.);PROVIDE (_etext =.);PROVIDE (etext =.);.rodata: *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata1:
7、*(.rodata1) .eh_frame_hdr : *(.eh_frame_hdr) .eh_frame: ONLY_IF_RO KEEP (*(.eh_frame) .gcc_except_table : ONLY_IF_RO *(.gcc_except_table .gcc_except_table.*) /* Adjust the address for the data segment.We wantto adjust up tothe same address within the page on the next pageup. */.=ALIGN (CONSTANT (MAX
8、PAGESIZE) - (CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE)- 1); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE);/* Exception handling */.eh_frame: ONLY_IF_RW KEEP (*(.eh_frame) .gcc_except_table : ONLY_IF_RW *(.gcc_except_table .gcc_except_table.*) /* Thread Loc
9、al Storage sections */.tdata : *(.tdata .tdata.* .gnuinkonce.td.*).tbss: *(.tbss .tbss.* .gn ui nkonce.tb.*)*(.tcommon) .preinit_array:PROVIDE_HIDDEN (_preinit_array_start =.);KEEP (*(.preinit_array)PROVIDE_HIDDEN (_preinit_array_end =.);.init_arrayPROVIDE_HIDDEN (_init_array_start =.);KEEP (*(SORT(
10、.init_array.*)KEEP (*(.init_array)PROVIDE_HIDDEN (_init_array_end =.); .fini_arrayPROVIDE_HIDDEN (_fini_array_start =.);KEEP (*(.fini_array)KEEP (*(SORT(.fini_array.*)PROVIDE_HIDDEN (_fini_array_end =.);.ctors/* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first.
11、Because this is a wildcard, it doesnt matter if the user does not actually link against crtbegin.o; the linker wont look for a file to match a wildcard. The wildcard also means that it doesnt matter which directory crtbegin.o is in. */KEEP (*crtbegin.o(.ctors)KEEP (*crtbegin?.o(.ctors)/* We dont wan
12、t to include the .ctor section fromthe crtend.o file until after the sorted ctors.The .ctor section from the crtend file contains the end of ctors marker and it must be last */KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)KEEP (*(SORT(.ctors.*)KEEP (*(.ctors).dtors:KEEP (*crtbegin.o(.dtors)KEE
13、P (*crtbegin?.o(.dtors)KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)KEEP (*(SORT(.dtors.*)KEEP (*(.dtors).jcr: KEEP (*(.jcr) .data.rel.ro : *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)*(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) .dynamic: *(.dynamic) .got: *(.got) *(.igot) .=DATA_SEGMEN
14、T_RELRO_END (12,.);.got.plt: *(.got.plt) *(.igot.plt) .data:*(.data .data.* .gnu.linkonce.d.*)SORT(CONSTRUCTORS).data1: *(.data1) _edata = .; PROVIDE (edata =.);_bss_start =.;.bss*(.dynbss)*(.bss .bss.* .gnu.linkonce.b.*)*(C0MM0N)/* Align here to ensure that the .bss section occupiesspace up to_end.
15、Align after .bss to ensure correct alignmenteven if the.bss section disappears because there are no input sections.FIXME: Why do we need it? When there is no .bss section, we dontpad the .data section. */.=ALIGN(. != 0 ? 32 / 8 : 1);.=ALIGN(32 / 8);.=ALIGN(32 / 8);_end = .; PROVIDE (end =.);.=DATA_S
16、EGMENT_END (.);/* Stabs debugging sections. */.stab0 : *(.stab) .stabstr0 : *(.stabstr) .stab.excl0 : *(.stab.excl).stab.exclstr0 : *(.stab.exclstr) .stab.index0 : *(.stab.index) .stab.indexstr 0 : *(.stab.indexstr) .comment10 : *(.comment) 专业.专注/* DWARF debug sections.Symbols in the DWARF debugging
17、 sections are relative to the beginningof the section so we begin them at 0.*/* DWARF 1 */.debug0 : *(.debug) .line0 : *(.line) /* GNU DWARF 1 extensions */.debug_srcinfo0 : *(.debug_srcinfo) .debug_sfnames0 : *(.debug_sfnames) /* DWARF 1.1 and DWARF 2 */.debug_aranges0 : *(.debug_aranges) .debug_pu
18、bnames 0 : *(.debug_pubnames) /* DWARF 2 */.debug_info0 : *(.debug_info .gnu.linkonce.wi.*) .debug_abbrev0 : *(.debug_abbrev) .debug_line0 : *(.debug_line) .debug_frame0 : *(.debug_frame) .debug_str0 : *(.debug_str) .debug_loc0 : *(.debug_loc) .debug_macinfo0 : *(.debug_macinfo) /* SGI/MIPS DWARF 2
19、extensions */.debug_weaknames 0 : *(.debug_weaknames) .debug_funcnames 0 : *(.debug_funcnames) .debug_typenames 0 : *(.debug_typenames) .debug_varnames 0 : *(.debug_varnames) /* DWARF 3 */.debug_pubtypes 0 : *(.debug_pubtypes) .debug_ranges 0 : *(.debug_ranges) .gnu.attributes 0 : KEEP (*(.gnu.attri
20、butes) /DISCARD/ : *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) =下面逐句解释。OUTPUT_FORMAT(elf32-i386, elf32-i386,elf32-i386) OUTPUT_ARCH(i386)OUTPUT_FORMAT 和 OUTPUT_ARCH都是ld脚本的保留字命令 OUTPUT_FORMAT说明输出二进制文件的格式 OUTPUT_ARCH说明输出文件系统平台。ENTRY(_start)ENTRY命令的作用是,将后面括号中的符号 值设置成入口地址。入口地址(entry point )的定义是这
21、样的一进程执行的第一条用户空间的指令在进程地址空 间中的地址。ld有多种方法设置进程入口地址,通常它按以下顺序:(编号越前,优先级越高)1, Id命令行的-e选项2, 连接脚本的 ENTRY(SYMBOL)命令3, 如果定义了 start符号,使用start符号值4, 如果存在.text section, 使用.text section的第一字节的位置值5, 使用值0SEARCH_DIR(/usr/i486-linux-gnu/lib32);设置链接时搜寻库文件目录SECTIONS然后,接下来是一大段的SECTIONS,对应的右大括号直到脚本的末尾。SECTIONS命令告诉ld如何把输入文件的
22、 sections 映射 到输出文件的各个 section :即是如何将输入 section合为输出section ;如何把输出section放入程序地址空间 (VMA)和进程地址空间 (LMA)。该命令格式如下:SECTIONS/* Read-only sections, merged into text segment: */PROVIDE (_executable_start =SEGMENT_START(text-segment, 0x08048000); PROVIDE定义的变量 如果源文件中已经定义值那么用源文件中的,如果没有定义则用脚本中定义的。并设定该变量的值为 0x08048
23、000.=SEGMENT_START(text-segment, 0x08048000) +SIZEOF_HEADERS;这句把定位器符号置为0x08048000 + SIZE_HEADERS (若不指定,则该符号的初始值为0 )。SIZE_HEADERS为输出文件的文件头.是一个特殊的符号,它是定位器,一个位置指针,指向程 序地址空间内的某位置 (或某section内的偏移,如果它在 SECTIONS命令内的某section描述内),该符号只能在 SECTIONS命令内使用。.rel.dyn:*(.rel.init)*(.rel.text .rel.text.* .rel.gn ui nko
24、nce.t.*)*(.rel.fini)*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)*(.rel.data.rel.ro* .rel.gnu.linkoncedrel.ro.*)*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)*(.rel.ctors)*(.rel.dtors)*(.rel.got)*(.r
25、el.bss .rel.bss.* .rel.gnu.linkonce.b.*)*(.rel.ifunc).rel.plt*(.rel.plt)PROVIDE_HIDDEN (_rel_iplt_start =.);*(.rel.iplt)PROVIDE_HIDDEN (_relplt_end =.);.先以上这些段主要用于重定位.具体的内容还需进一步学习不做介绍.init:KEEP (*(.init) =0x90909090.plt: *(.plt) *(.iplt) .text*(.text.unlikely .text.*_unlikely)*(.text .stub .text.* .
26、gn ui nkonce.t.*)/* .gnu.warning sections are handled specially byelf32.em. */*(.gnu.warning) =0x90909090.init 将在下文与.fini 一起介绍.text :表示 text段开始.*(.text)将所有(*符号代表任意输入文件)输入文件的.text section合并成一个.text section, 该section的地址由定位器 符号的值指定,即0x08048000.*(.text.unlikely .text.*_unlikely)*(.text .stub .text.* .gn
27、u.linkonce.t.*)/* .gnu.warning sections are handled specially by elf32.em.*/*(.gnu.warning) .fini:KEEP (*(.fini) #KEEP(强制连接器保留一些特定的section =0x90909090ELF 文件中定义了 .init 和.fini两个特殊 的段,其中.init段中的代码会在 main之前被执行,.fini 段中的代码会在main退出之后被执行.默认用NOP(0x90)字 段进行填充.PROVIDE (_etext =.);PROVIDE (_etext =.);PROVIDE (
28、etext = .);_etext=._etext = . etext=.;我们看到,很多变量都定义成等于这个.符,实际上这个符号 所代表的值是在变化的,随着越往后走,值越增加,根据 前面填充的多少自动往后加。即指定当前地址值为代码段结束位置.这里就定义了一个etext符号,当目标文件内引用了etext符号,却没有定义它时,etext符号对应的地址被定义 为.text section之后的第一个字节的地址。.rodata: *(.rodata .rodata.* .gnuinkonce.r.*).rodata1: *(.rodata1) 数据段终于来到了 段)。,意思很容易理解的了 (用于只读
29、数据/* Adjust the address for the data segment.We want toadjust up tothe same address within the page on the next pageup. */.=ALIGN (CONSTANT (MAXPAGESIZE) - (CONSTANT(MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE)-1);.=DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE),CONSTANT (COMMONPAGESIZE);如注释所述用于地址调整,
30、为数据段作相应的地址对齐./*Thread Local Storage sections */.tdata: *(.tdata .tdata.* .gnu.linkonce.td.*) .tbss: *(.tbss .tbss.* .gn ui nkonce.tb.*)*(.tcommon) 正如注释所描述,这两个段用于线程的局部数据段(包括data及bss)CONSTRUCTORS 是一个保留字命令 。与C+ 内的(全局对象的)构造函数和(全局对像的)析构函数相关。.ctors:/* gcc uses crtbegin.o to find the start ofthe constructo
31、rs, so we make sure it is first. Because this is a wildcard, it doesnt matter if the user does not actually link against crtbegin.o; the linker wont look for a file to match a wildcard. The wildcard also means that it doesnt matter which directory crtbegin.o is in. */KEEP (*crtbegin.o(.ctors)KEEP (*
32、crtbegin?.o(.ctors)/* We dont want to include the .ctor section fromthe crtend.o file until after the sorted ctors.The .ctor section from the crtend file contains the end of ctors marker and it must be last */KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)KEEP (*(SORT(.ctors.*)KEEP (*(.ctors).d
33、tors:KEEP (*crtbegin.o(.dtors)KEEP (*crtbegin?.o(.dtors)KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)KEEP (*(SORT(.dtors.*)KEEP (*(.dtors)对于支持任意section名的目标文件格式,比如COFF、ELF格式,GNU C+将全局构造和全局析构信息分别放入.ctors section 和.dtors section 内当连接器生成的目标文件格式不支持任意section名字时,比如说ECOFF、XCOFF格式,连接器将通过名字来识别全 局构造和全局析
34、构,对于这些文件格式,连接器把与全局 构造和全局析构的相关信息放入出现CONSTRUCTORS关键字的输出section内。般来说,GNU C+在函数main内安排全局构造代码的运行,而_main函数被初始化代码 (在main函数调用之前 执行)调用。.got: *(.got) *(.igot) .=DATA_SEGMENT_RELRO_END (12,.);.got.plt: *(.got.plt) *(.igot.plt) 意义不明,需进步探究._edata = .; PROVIDE (edata =.); 意义与前面的 etext 类似。edata 符号也较为重要。_bss_start
35、=.;.bss*(.dynbss)*(.bss .bss.* .gnu.linkonce.b.*)*(COMMON)/* Align here to ensure that the .bss section occupiesspace up to_end. Align after .bss to ensure correct alignmenteven if the.bss section disappears because there are no input sections.FIXME: Why do we need it? When there is no .bsssection,
36、we dontpad the .data section. */.=ALIGN(. != 0 ? 32 / 8 : 1);.=ALIGN(32 / 8);.=ALIGN(32 / 8);_end = .; PROVIDE (end =.);.=DATA_SEGMENT_END (.);BSS 段开始了COMMON 这个保留字的意义:通用符号(common symbol) 的输入 section :在许多目标文件格式中,通用符号并没有占用一个section。连接器认为:输入文件的所有通用符号在名为COMMON 的 section 内。上例中将所有输入文件的所有通用符号放入输出.bsssectio
37、n 内。这里,定义了几个重要的符号bss_start =.;_end =.;end =.;.word格式,在代码中可能会用到的。/* Stabs debugging sections. */.stab0 : *(.stab) .stabstr0 : *(.stabstr) .stab.excl0 : *(.stab.excl) .stab.exclstr 0 : *(.stab.exclstr) .stab.index0 : *(.stab.index) .stab.indexstr 0 : *(.stab.indexstr) .comment0 : *(.comment) /* DWARF
38、debug sections.Symbols in the DWARF debugging sections are relative to the beginningof the section so we begin them at 0.*/* DWARF 1 */.debug0 : *(.debug) .line0 : *(.line) /* GNU DWARF 1 extensions */.debug_srcinfo0 : *(.debug_srcinfo) .debug_sfnames 0 : *(.debug_sfnames) /* DWARF 1.1 and DWARF 2 *
39、/.debug_aranges 0 : *(.debug_aranges) .debug_pubnames 0 : *(.debug_pubnames) /* DWARF 2 */.debug_info0 : *(.debug_info .gn ui nkonce.wi.*) .debug_abbrev0 : *(.debug_abbrev) .debug_line0 : *(.debug_line) .debug_frame0 : *(.debug_frame) .debug_str0 : *(.debug_str) .debug_loc0 : *(.debug_loc) .debug_ma
40、cinfo0 : *(.debug_macinfo) /* SGI/MIPS DWARF 2 extensions */.debug_weaknames 0 : *(.debug_weaknames) .debug_funcnames 0 : *(.debug_funcnames) .debug_typenames 0 : *(.debug_typenames) .debug_varnames0 : *(.debug_varnames) /* DWARF 3 */.debug_pubtypes 0 : *(.debug_pubtypes) .debug_ranges0 : *(.debug_r
41、anges) .gnu.attributes 0 : KEEP (*(.gnu.attributes) 这里主要包含代码的调试信息,用于调试时使用包括一些行 号信息及符号表等./DISCARD/ : *(.note.GNU-stack) *(.gnu_debuglink)(.gnu.lto_*) DISCARD关键字用于将指定段舍弃,不出现在输出文件中.余 下的这几个意义也类似,看英文注释应该能明白。对初步编译出来的一个二进制文件进行nm解析(nm -na.out),得到如下内容:U _IO_getcGLIBC_2.0w _Jv_RegisterClassesU _ctype_b_locGLI
42、BC_2.3U _errno_locationGLIBC_2.0 w _gmon_start_U _isoc99_sscanfGLIBC_2.7U _libc_start_mainGLIBC_2.0U _stack_chk_failGLIBC_2.4U exitGLIBC_2.0U fcloseGLIBC_2.1U feofGLIBC_2.0U fgetsGLIBC_2.0U fopenGLIBC_2.1U printfGLIBC_2.0U sprintfGLIBC_2.0U strerrorGLIBC_2.0U strtolGLIBC_2.0U vfprintfGLIBC_2.0080485
43、a8 Tnit 08048700 T _start 08048730 t _do_global_dtors_aux 08048790 t frame_dummy080487b4 T die 080487e7 T print_name_pid08048904 T print_maps08048be3 T parse_pid08048c3a T main08048cc0 T_libc_csu_fini08048cd0 T_libc_csu_init08048d2a T_08048d30t_do_global_ctors_aux08048d5cTfini08048d78 R _fp_hw08048d7c R _IO_stdin_used08048e80 r _FRAME_END08049f0c d _CTOR_LIST_08049f0c d _init_array_end08049f0c d _init_array_start08049f10 d _CTOR_END_08049f14 d _DTOR_LIST_08049f18 D _DTOR_END_08049f1c d _JCR_END_08049f1c d _JCR_LIST_08049f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年范文生态园土地承包合同
- 2024试析《物业服务合同》的解除或终止问题
- 2024小吃加盟合同范本
- 物业管理服务协议参考样本
- 个人建房施工合同范本
- 2024广告设计类合同范本
- 解除版权买卖合同协议
- 2024年家庭保姆服务合同范本
- 广告屏幕租赁合同范例
- 2024简易版专利转让合同协议书
- 难点详解人教版九年级化学上册第一单元走进化学世界专题训练练习题(含答案详解版)
- 财务管理委托代理会计服务 投标文件(技术方案)
- 2024年全国高考Ⅰ卷英语试题及答案
- 期刊编辑的学术期刊编辑规范考核试卷
- T-CCSAS014-2022《化工企业承包商安全管理指南》
- 电梯安全总监和安全员的任命文件
- SL-T+62-2020水工建筑物水泥灌浆施工技术规范
- 2024年安徽省普通高中学业水平选择性考试 历史试卷
- 电子商务师职业技能等级证书培训方案
- JBT 14615-2024 内燃机 活塞运动组件 清洁度限值及测定方法(正式版)
- DL5009.2-2013电力建设安全工作规程第2部分:电力线路
评论
0/150
提交评论