免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 808 | 回复: 0
打印 上一主题 下一主题

ELF文件格式(二) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-13 21:28 |只看该作者 |倒序浏览
ELF文件格式(二)
String table sections 保存着以NULL终止的一系列字符,一般我们称为字
符串。object文件使用这些字符串来描绘符号和section名。一个字符串的
参考是一个string table section的索引。第一个字节,即索引0,被定义保
存着一个NULL字符。同样的,一个string table的最后一个字节保存着一个
NULL字符,所有的字符串都是以NULL终止。索引0的字符串是没有名字或者说
是NULL,它的解释依靠上下文。一个空的string table section是允许的;
它的section header的成员sh_size将为0。对空的string table来说,非0的
索引是没有用的。
一个 settion 头的 sh_name 成员保存了一个对应于该 setion 头字符表部分
的索引(就象ELF头的 e_shstrndx 成员所特指的那样。下表列出了一个有 25 字节
的字符串表(这些字符串和不同的索引相关联):
       Index   +0   +1   +2   +3   +4   +5   +6   +7   +8   +9
       =====   ==   ==   ==   ==   ==   ==   ==   ==   ==   ==
          0    \0   n    a    m    e    .    \0   V    a    r     
         10    i    a    b    l    e    \0   a    b    l    e
         20    \0   \0   x    x    \0
+ Figure 1-15: String Table Indexes
  Index   String
  =====   ======
      0   none
      1   "name."
      7   "Variable"
     11   "able"
     16   "able"
     24   null string
如上所示,一个字符串表可能涉及该 section 中的任意字节。一个字符串可能
引用不止一次;引用子串的情况是可能存在的;一个字符串也可能被引用若干次;而
不被引用的字符串也是允许存在的。
   ==================== Symbol Table 符号表=========================
一个object文件的符号表保存了一个程序在定位和重定位时需要的定义和引用的信息。
一个符号表索引是相应的下标。0表项特指了该表的第一个入口,就象未定义的符号
索引一样。初始入口的内容在该 section 的后续部分被指定。
                             Name       Value
                             ====       =====
        STN_UNDEF      0
一个符号表入口有如下的格式:
+ Figure 1-16: Symbol Table Entry
  typedef struct {
      Elf32_Word st_name;
      Elf32_Addr st_value;
      Elf32_Word st_size;
      unsigned char st_info;
      unsigned char st_other;
      Elf32_Half st_shndx;
  } Elf32_Sym;
* st_name
  该成员保存了进入该object文件的符号字符串表入口的索引(保留了符号名的表达字符)。   
  如果该值不为 0 ,则它代表了给出符号名的字符串表索引。否则,该符号无名。
注意:External C 符号和object文件的符号表有相同的名称。
* st_value
  该成员给出了相应的符号值。它可能是绝对值或地址等等(依赖于上下文);
  细节如下所述。
* st_size
  许多符号和大小相关。比如,一个数据对象的大小是该对象所包含的字节数目。
  如果该符号的大小未知或没有大小则这个成员为 0 。
* st_info
  成员指出了符号的类型和相应的属性。相应的列表如下所示。下面的代码说明了
  如何操作该值。
    #define ELF32_ST_BIND(i) ((i)>>4)
    #define ELF32_ST_TYPE(i) ((i)&0xf)
    #define ELF32_ST_INFO(b, t) (((b)
* st_other
  该成员目前为 0 ,没有含义。
* st_shndx
  每一个符号表的入口都定义为和某些 section 相关;该成员保存了相关的 section
  头索引。就象 Figure 1-8 {*}和相关的文字所描述的那样,某些 section 索引
  指出了特殊的含义。
一个符号的属性决定了可链接性能和行为。
+ Figure 1-17: Symbol Binding, ELF32_ST_BIND
  Name        Value
  ====        =====
  STB_LOCAL       0
  STB_GLOBAL      1
  STB_WEAK        2
  STB_LOPROC     13
  STB_HIPROC     15
* STB_LOCAL
  在包含了其定义的object文件之外的局部符号是不可见的。不同文件中的具有相同
  名称的局部符号并不相互妨碍。
* STB_GLOBAL
  全局符号是对所有的object目标文件可见的。一个文件中的全局符号的定义可以
  满足另一个文件中对(该文件中)未定义的全局符号的引用。   
* STB_WEAK
  弱符号相似于全局符号,但是他们定义的优先级比较低一些。
* STB_LOPROC through STB_HIPROC
  其所包含范围中的值由相应的处理器语义所保留。
全局符号和弱符号的区别主要在两个方面。
* 当链接器链接几个可重定位的目标文件时,它不允许 STB_GLOBAL 符号的同名
多重定义。另一方面,如果一个全局符号的定义存在则具有相同名称的弱符号名不会
引起错误。链接器将认可全局符号的定义而忽略弱符号的定义。与此相似,如果有一个
普通符号(比如,一个符号的 st_shndx 域包含 SHN_COMMON),则一个同名的弱符号
不会引起错误。链接器同样认可普通符号的定义而忽略弱符号。
* 当链接器搜索%B


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11760/showart_215146.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP