![]() |
会员注册 会员登陆 取回密码 |
|
| 欢迎您回来 | ||
|
Linux内核研究系列之可执行文件格式
分类:: Unix/Linux / 发表时间 :: 2005-07-13 19:14:08 作者 :: 16hot | 人气 :: | 评论数目 (0) | 发送 | 来源 :: By 书生, 出处:bluerain 我们知道linux环境下不是所有的二进制文件都有相同的格式,linux系统使用二进制文件的处理程序来实现对不同二进制格式文件的分别处理。二进制处理程序通过内嵌在文件开头的“特征序列”(一个特殊的字节序列)来识别文件,有时也会通过文件名的一些特征,例如ELF文件以’E’’L’’F’字符开头,java文件以0xcafebabe开始前四个字节。 Linux用sys_execve装入可执行二进制文件。 1.当前linux版本(2.2)提供以下几种二进制文件处理程序: a.out:主要时为了和以前兼容,因为a.out很难实现动态链接,以被ELF所取。 相关内容见 ELF:现在主流的linux二进制文件。尽管如此,她一样要和其他格式一样需要使用二进制处理程序。 相关内容在 EM86:主要作用是在Alpha的主机上运行Intel的linux二进制文件,仿佛他们就是Alpha的本地二进制文件。 相关内容 Java:通过以.class文件的文件名为参数,处理程序返回执行字节码的解释程序。 相关内容见 Misc:最明智的二进制处理程序的方法。她通过内嵌的特征数字或文件名后缀识别二进制格式。另外她可以运行期配置,而不是只能在编译期配置,这样,你就可以在增加新二进制格式文件的支持而不用重新编译内核。有说将用她取代Java和EM86二进制处理程序。 详细参见 脚本:主要支持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的内核源码中经常可以看到。 例如对于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函数。 2.下面我们来看看关于这几个数据结构的主要操作: register_binfmt:主要作用使将一中二进制文件加到formats链表中。 extern int register_binfmt(struct linux_binfmt *); unregister_binfmt:执行与register_binfmt的反操作。 extern int unregister_binfmt(struct linux_binfmt *); 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链表。 load函数:执行二进制文件调入工作,其实质工作一般都由一个相应do_load函数来完成。如: do_load_elf_binary,do_load_elf_library,do_load_java…… extern int prepare_binprm(struct linux_binprm *); extern int search_binary_handler(struct linux_binprm*,struct pt_regs *); 这两个函数主要就涉及到另一个数据结构linux_binprm,她吗那就下次再说吧,到这里大家应该对linux下几种二进制文件处理程序有个大体的印象了,具体细节去看看源代码吧。 好了,这次就到这里了,该休息了。 [ 返回 ]
■ 相关文章
·
让firefox自动调用下载器
(2005-09-07)
· 浅谈linux优化及安全配置 (2005-09-07) · python入门1 (2005-09-07) · 以非超级用户身份安装 mod_perl (2005-09-07) · FC3中的JAVA安装及配置 (2005-09-07) · Perl与MandrakeLinux (2005-09-07) · Apache服务器实现用户验证 (2005-09-07) · 受限制环境安装Perl模块方法 (2005-09-07) · Linux内核研究系列之可执行文件格式 (2005-07-13) · 如何阅读源代码--工具篇 (2005-07-13) · 如何阅读源代码 (2005-07-13) · Linux内核编程风格 (2005-07-13) · Linux网络代码导读v0.2 (2005-07-13) · Linuxinodecache分析 (2005-07-13) · 目录项缓存dcache (2005-07-13) · Linux对I/O端口资源的管理 (2005-07-13) · Linux对ISA总线DMA的实现 (2005-07-13) · 基于i386的Linux实现特点剖析——基础的基础 (2005-07-13) · 基于i386的Linux实现特点剖析——关于中断 (2005-07-13) · 基于i386体系结构的Linux实现特点剖析——内存与进程 (2005-07-13) · ELF可执行联接规范(英汉对照版) (2005-07-13) · Linux内核0.11(0.95)详细注释 (2005-07-13) · ar和nm命令的使用 (2005-07-13) · JIDEv1.7 (2005-07-13) · Rhide-1.4.7 (2005-07-13) · KDevelop1.3 (2005-07-13) · Xwpe1.5.26a (2005-07-13) · XwpeFAQ (2005-07-13) · C-Forge1.6-4 (2005-07-13) · cvs客户端大全 (2005-07-13)
■ 发表评论
■ 相关评论
更多评论...
|
| http://www.isyi.com Copyright © 2002-2005 实易数码. All rights Reserved 版权声明:实易数码是本Blog托管服务提供商。实易数码不承担任何责任,请与Blog使用者联系解决。 粤ICP备05023051号 |