当前位置:首页 » 专业资讯
开发技术指南» 文章正文
    引言: 本篇文章以linux为平台为例,演示ELF动态解析符号的过程。
 

 

    摘要:linux 打造一个开源的世界用最简单的话说,linux 是一个操作系统。它是一位赫尔辛基大学学生 linus torvalds(linux 是 linuss unix 的缩写)在 1991 年 10 月创造的。linux 本身实际上只是其内核;它实现了多任务和多用户功能,管理硬件,分配内存并且使应用程序能够运行。 对于任何一种操作系统,普通用户绝对没有足够的兴趣去了解如内核内部细节这样的内容。只有真正致力于此的人 ― 那些放弃个人生活或受雇做这种工作的人......
 ·中国顶级门户网站架构分析    »显示摘要«
    摘要:中国顶级门户网站架构分析先声明,下面的内容都是我个人根据一些工具形成的猜想。并不保证和现实中各大门户网站所用的架构一摸一样,不过我认为八九不离十了。   新浪和搜狐在国内的知名度可谓无人不知无人不晓。他们每天的点击率都在千万以上。这样大的访问量对于新浪和搜狐来说怎样利用有限的资源让网民获得最快的速度成为首要的前提,毕竟现在网络公司已经离开了烧钱的阶段,开始了良性发展,每一笔钱砸下去都需要一定回响才行的。另一方面,技术人员要绞尽脑汁,不能让用户老是无法访问、......


Elf动态解析符号过程(转载)

本篇文章以linux为平台为例,演示elf动态解析符号的过程

【相关文章:第一次装Redhat!

本篇文章以linux为平台为例,演示elf动态解析符号的过程。 【扩展阅读:linux 终端支持中文和透明

【扩展信息:libpam-modules出错及修复

不正之处,还请斧正。

通常,elf解析符号方式称为lazy mode装载的。这种装载技术是elf平台上

默认的方式。在不同的体系平台在实现这种机制也是不同的。但是i386与sparc

在大部分上是相同的。

动态连接器(rtld)提供符号的动态连接,装载共享objects与解析标号的引用。

通常是ld.so,它可以是一个共享object也可以是个可执行的文件。

★★ 符号表(symbol table)

每个object要想使它对其他的elf文件可用,就要用到符号表(symbol table)中

symbol entry.事实上,一个symbol entry 是个symbol结构,它描述了这个

symbol的名字与该symbol的value.symbol name被编码作为dynamic string

table的索引(index). the value of a symbol是在elf object文件内该

symbol的地址。该地址通常需要被重新定位(加上该object装载到内存的基地址

(base load address)). 从而构成该symbol在内存中的绝对地址。

一个符号表入口有如下的格式:

typedef struct

{

elf32_word st_name; /* symbol name (string tbl index) */

elf32_addr st_value; /* symbol value */

elf32_word st_size; /* symbol size */

unsigned char st_info; /* symbol type and binding */

unsigned char st_other; /* no defined meaning, 0 */

elf32_section st_shndx; /* section index */

} elf32_sym;

可执行文件他们知道运行时刻他们的地址,所以他们内部的引用符号在编译时候就已

经被重定位了。

★★ got(global offset table)

got是一个数组,存在elf image的数据段中,他们是一些指向objects的指针(通常

是数据objects).动态连接器将重新修改那些编译时还没有确定下来地址的符号的

got入口。所以说got在i386动态连接中扮演着重要的角色。

★★ plt(procedure linkage table)

plt是一个这样的结构,它的entries包含了一些代码片段用来传输控制到外部的过程。

在i386体系下,plt与他的代码片段entries有如下格式:

plt0:

push got[1] ; word of identifying information

jmp got[2] ; pointer to rtld function nop

...

pltn:

jmp got[x + n] ; got offset of symbol address

push n ; relocation offset of symbol

jmp plt0 ; call the rtld

pltn + 1

jmp got[x +n +1]; got offset of symbol address

push n +1 ; relocation offset of symbol

jmp plt0 ; call the rtld

当传输控制到一个外部的函数时,它传输执行到plt 中跟该symbol相关的那个entry

(是在编译时候连接器安装的)。在plt entry中第一条指令将jump到一个存储在got

中的一个指针地址;假如符号还没有被解析,该got中存放着的是该plt entry中的

下一条指令地址。该指令push一个在重定位表中的偏移量到stack,然后下一条指令

传输控制到plt[0]入口。该plt[0]包含了调用rtld解析符号的函数代码。该


...   下一页
 ·linux中文显示-vim    »显示摘要«
    摘要:命令#locale用来查看字体列表。设置vim的encode编辑.bash_profile文件,加入export lc_all=zh_cnexport lang=zh_cn好像这样,locale就全成中文的了,解决的好像并不完美...但......凑活先用了,起码显示了中文,:p......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE