分享
 
 
 

Linux内核研究系列之可执行文件格式

王朝system·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

// 本文档版权归bluerain所有,可自由转发,粘贴

// 如有疑问差错,请给我发信:hexn@ggw.com.cn,谢谢!

我们知道linux环境下不是所有的二进制文件都有相同的格式,linux系统使用二进制文件的处理程序来实现对不同二进制格式文件的分别处理。二进制处理程序通过内嵌在文件开头的“特征序列”(一个特殊的字节序列)来识别文件,有时也会通过文件名的一些特征,例如ELF文件以'E''L''F'字符开头,java文件以0xcafebabe开始前四个字节。

Linux用sys_execve装入可执行二进制文件。

当前linux版本(2.2)提供以下几种二进制文件处理程序:

l a.out:主要时为了和以前兼容,因为a.out很难实现动态链接,以被ELF所取。

相关内容见

l ELF:现在主流的linux二进制文件。尽管如此,她一样要和其他格式一样需要

使用二进制处理程序。相关内容在

l EM86:主要作用是在Alpha的主机上运行Intel的linux二进制文件,仿佛他们就是Alpha的本地二进制文件。相关内容

l Java:通过以.class文件的文件名为参数,处理程序返回执行字节码的解释程序。相关内容见

l Misc:最明智的二进制处理程序的方法。她通过内嵌的特征数字或文件名后缀识别二进制格式。另外她可以运行期配置,而不是只能在编译期配置,这样,你就可以在增加新二进制格式文件的支持而不用重新编译内核。有说将用她取代Java和EM86二进制处理程序。详细参见

l 脚本:主要支持shell脚本、Perl脚本,宽松一点说,所有前面两个字符是#!的可执行文件都由她来处理。详细参见

在继续向下介绍之前,我们必须先来认识一个数据结构linux_binfmt;

struct linux_binfmt{

struct linux_binfmt * next;

long *use_count;

int (*load_binary)(struct linux_binprm *,struct pt_regs *regs);

int (*load_shlib)(int fd);

int (*core_dump)(long signr,struct pt_regs *regs);

};

在linux_binfmt中包含两个重要指向函数的指针,load_binary装入可执行代码,load_shlib装入共享库。Core_dump是个转储函数指针。

很显然,由next构成一个链表,表头则由formats指向,如下图:

static struct linux_binfmt *formats=(struct linux_binfmt *)NULL;

系统为每个不同的文件格式定义了一个相应的对象:

static struct linux_binfmt elf_format;

static struct linux_binfmt java_format;

static struct linux_binfmt em86_format;

……

linux_binfmt的链表(由formats指向)则就是由这些不同的文件格式的

linux_binfmt构成的一个链表。而对不同格式二进制文件的处理程序则通过注册在相应的linux_binfmt中的函数来实行,实际这里已经使用了面向对象的思想,而这种情况在linux的内核[url=http://www.pccode.net].net" class="wordstyle"源码中经常可以看到。

例如对于ELF文件格式:

当使用“装入函数的指针”使,指针指向装入函数分别为:

load_elf_binary(struct linux_binprm *bprm,struct pt_regs *regs);

static int load_elf_library(int fd);

以上函数在 中定义实现。

而相应的elf_format 被定义成:

static struct linux_bmfmt elf_format={

#ifndef MODULE

NULL,NULL,load_elf_binary,load_elf_library,elf_core_dump

#else

NULL,&mod_use_count,load_elf_binary,load_elf_library,

elf_core_dump()

#endif

};

以此为参考我们自然也就可以想到其他文件格式的定义形式。

『注』Java的load函数为load_java,em86的load函数为load_em86,script 的load函数为load_script,他们没有提供library的load函数。

下面我们来看看关于这几个数据结构的主要操作:

l register_binfmt:主要作用使将一中二进制文件加到formats链表中。

extern int register_binfmt(struct linux_binfmt *);

l unregister_binfmt:执行与register_binfmt的反操作。

extern int unregister_binfmt(struct linux_binfmt *);

l init:对于每个不同的二进制文件格式系统都提供了一组init操作,如下:

extern int init_elf_binfmt(void);

extern int init_aout_binfmt(void);

extern int init_script_binfmt(void);

extern int init_java_binfmt(void);

extern int init_em86_binfmt(void);

extern int init_misc_binfmt(void);

以上函数在 中声明;

init函数的作用很简单,只是调用register_binfmt函数将自己的文件格式加入formats链表。

l load函数:执行二进制文件调入工作,其实质工作一般都由一个相应do_load函数来完成如:do_load_elf_binary,do_load_elf_library,do_load_java……..

l extern int prepare_binprm(struct linux_binprm *);

extern int search_binary_handler(struct linux_binprm*,struct pt_regs *);

这两个函数主要就涉及到另一个数据结构linux_binprm,她吗那就下次再说吧,到这里大家应该对linux下几种二进制文件处理程序有个大体的印象了,具体细节去看看源代码吧。

好了,这次就到这里了,该休息了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有