分享
 
 
 

Linux动态函式库解析(一)

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

摘要:使用动态函式库的好处有许多。首先,就是由於执行档主要呼叫的函式都包含於动态函式库中,所以档案所占的空间可以因而缩小。其次,当动态函式库的函式内容有所改变时,呼叫该动态函式库的程序,可以在最小修正甚至是不需重新编程的情况下,就可以叫用到新版本的函式库服务。

前言

用 MS Windows 一段时间的读者,应该都听过动态函式库这个名词。在 Windows 9X/ME 或是 Windows NT/2000 中,常见到的动态函式库为副档名 “DLL” (Dynamic Loading Library)的档案。

而在 Linux 中,当然也有动态函式库的机制存在。如此一来,所撰写的程序便无需透过静态连结(Static Link),而可以在编程时透过动态连结(Dynamic Link)产生我们所要的执行档。

使用动态函式库的好处有许多。首先,就是由於执行档主要呼叫的函式都包含於动态函式库中,所以档案所占的空间可以因而缩小。其次,当动态函式库的函式内容有所改变时,呼叫该动态函式库的程序,可以在最小修正甚至是不需重新编程的情况下,就可以叫用到新版本的函式库服务。

对於发展 Embedded Linux 的业者来说,能够尽可能减少应用程序执行环境所需空间的大小,便可以把日後成品所需的 Flash 容量降到最低,在整体成本以及所耗用的记忆体空间来说,都可以得到许多的好处,而在动态函式库来著手所得到的效益也是相当可观的,尽可能的删去不必要的动态函式库,以及针对动态函式库改写来缩小或是透过工具删去用不到的函式,都可以带来许多的助益。

当然棉,动态函式库的好处还不只这些,相信读者们在文章中可以发现其它的妙用的。

档案格式(ELF VS A.out)

首先,我们必须先确定目前所执行的 Linux Kernel 版本有开启 ELF 与 A.out 执行档案格式的支援(通常都会有)

Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [M/n/y/?]

Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]

举个例子来说,若要执行 a.out 格式的执行档时,我们必须确认 CONFIG_BINFMT_AOUT 为 Y,也就是由 Kernel 直接支援 a.out 档案格式,或者 CONFIG_BINFMT_AOUT 为 M,也就是不把 a.out 的档案格式支援编入Kernel 中,改以 Module 的形式存在,一旦 Kernel 需要执行 a.out 格式的程序时,在动态的载入该 Module,来启动具备执行 a.out 执行档的能力。不过a.out 执行档的格式,是 Unix 上使用了相当久的的档案格式,ELF 是目前较新的的档案格式。a.out 档案格式共有三个 Section,分别为.text, .data, 及 .bss,并还包括了一个文字表(String Table)与符号表(Symbol Table)。与ELF 档案格式比较起来,a.out 相形之下显得较为缺乏弹性,ELF档案格式允许多个节区的存在,执行档可以根据需求提供应用程序执行环境的节区,并且ELF 档支援了 32-bit 与 64-bit 的执行环境。其实,两者之间还有其它规格上的不同,有兴趣的读者也可以自行找一些相关的资料来比较即可了解。

再来呢,我们就来讨论动态函式库的档案格式。我们都知道在 Linux中有 a.out 与 ELF 两种档案的格式,其中目前我们最常见的便是 ELF 档案格式。在 Linux 的函式库目录中,我们常常可以见到 “*.so” 的档案,例如:“/lib/libc.so.6” 或是 “/lib/ld-linux.so.2”。这些便是在 Linux中所常见到的动态函式库档案。由下图我们可以看到动态函式库 libc.so.6 的 ELF Header:

libc.so.6 的 ELF Header

e_ident -EI_MAG0:7fh

-EI_MAG1:E

-EI_MAG2:L

-EI_MAG3:F

-EI_CLASS:32-bit objects

-EI_DATA:ELFDATA2LSB

-EI_VERSION:1h

-EI_PAD:0h

-EI_NIDENT:3h

e_type: ET_DYN (Shared Obj File)

e_machine:Intel 80386

e_version:Current version

e_entry:182a8h

e_phoff:34h

e_shoff:3bbf8ch

e_flags:0h

e_ehsize:34h

e_phentsize:20h

e_phnum:5h

e_shentsize:28h

e_shnum:40h

e_shstrndx:3dh

由图中,我们可以注意到 e_type: ET_DYN,e_type 是在ELF 档案的格式中,用来描述目前该档的档案型态,我们所举的例子为 libc.so.6 这个动态函式库的档案,所以 e_type 的属性为 Shared Obj File。

当然棉,我们若再拿一个ELF执行档来比较也是不错的,所以如下图

ls 的 ELF Header

e_ident -EI_MAG0:7fh

-EI_MAG1:E

-EI_MAG2:L

-EI_MAG3:F

-EI_CLASS:32-bit objects

-EI_DATA:ELFDATA2LSB

-EI_VERSION:1h

-EI_PAD:0h

-EI_NIDENT:2h

e_type: ET_EXEC (Executable file)

e_machine:Intel 80386

e_version:Current version

e_entry:8049130h

e_phoff:34h

e_shoff:bea4h

e_flags:0h

e_ehsize:34h

e_phentsize:20h

e_phnum:6h

e_shentsize:28h

e_shnum:1ah

e_shstrndx:19h

我们可以注意到 e_type: ET_EXEC,这就是 ELF 档中对於执行档所定义的档案属性

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有