Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...

在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来。这个过程对理解Linux内核具有很大的帮助。同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到基本的二进制文件读写方法。

首先,我们看一下minix可执行文件的格式(Linux和minix很基情)。

struct exec {
 unsigned char a_magic[2];
 unsigned char a_flags;
 unsigned char a_cpu;
 unsigned char a_hdrlen;
 unsigned char a_unused;
 unsigned short a_version;
 long a_text;
 long a_data;
 long a_bss;
 long a_entry;
 long a_total;
 long a_syms;
 long a_trsize;
 long a_drsize;
 long a_tbase;
 long a_dbase;
};
下面来具体看下读写代码:linux/tools/build.c line 60-117
        char buf[1024];
	...
        ...
       for (i=0;i<sizeof buf; i++) buf[i]=0;                      //buf初始化
	if ((id=open(argv[1],O_RDONLY,0))<0)                       //处理boot二进制文件
        die("Unable to open 'boot'");
	if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)             //读入MINIX_HEADER长度的内容
		die("Unable to read header of 'boot'");
	if (((long *) buf)[0]!=0x04100301)                         //其中的0x0301表示minix头部的a_magic魔数;0x10表示a_flag可执行;0x04 - a_cpu
		die("Non-Minix header of 'boot'");
	if (((long *) buf)[1]!=MINIX_HEADER)                       //a_hdrlen是否正确
		die("Non-Minix header of 'boot'");
	if (((long *) buf)[3]!=0)                                  //数据段长是否为0
		die("Illegal data segment in 'boot'");
	if (((long *) buf)[4]!=0)                                  //a_bss是否为0
		die("Illegal bss in 'boot'");
	if (((long *) buf)[5] != 0)                                //a_entry是否为0?哈哈,汇编的入口哦《Linux内核源代码分析——Linux内核入口》中的答案
		die("Non-Minix header of 'boot'");
	if (((long *) buf)[7] != 0)                                
		die("Illegal symbol table in 'boot'");
	i=read(id,buf,sizeof buf);
	fprintf(stderr,"Boot sector %d bytes.\n",i);
	if (i != 512)
		die("Boot block must be exactly 512 bytes");
	if ((*(unsigned short *)(buf+510)) != 0xAA55)
		die("Boot block hasn't got boot flag (0xAA55)");
	buf[508] = (char) minor_root;
	buf[509] = (char) major_root;	
	i=write(1,buf,512);                                         //剔除文件头之后,把执行代码写入标准输出
	if (i!=512)
		die("Write call failed");
	close (id);                                                 //处理boot二进制文件结束
	...
        ...       

所以,读写二进制文件的关键在于对Unix基本的api的熟悉。可以通过《Unix环境高级编程》得到这些基础知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PRM-DUL Oracle数据库恢复工具,一款专为Oracle数据救援而研发的企业级工具。可在多个操作平台(AIX/HPUX/SOLARIS/Linux/Windows)使用并支持对Oracle 9i/10g/11g/12c各版本数据库的数据救援工作。软件基于JAVA 开发,绿色无需安装,图形化操作界面,易于上手使用。可基于单数据文件操作或Oracle ASM存储磁盘操作。 PRM-DUL Oracle数据库恢复工具(简称PRM-DUL)是一款专为Oracle数据救援而研发的企业级工具。从1.0版本发布到现在,已经历了多次功能增强、补丁修正和恢复逻辑改进。PRM-DUL Oracle数据库恢复工具已在多个操作平台(AIX/HPUX/SOLARIS/Linux/Windows)被证明稳定可用。当前版本软件支持对Oracle 9i/10g/11g/12c各版本数据库的数据救援工作。软件基于JAVA 开发,绿色无需安装,下载解压后便可直接使用。(Windows上直接点击prm.bat,在Linux/Unix上运行./prm.sh)注意JAVA版本推荐在1.6版本以上。如果需对裸设备文件进行数据救援,请安装并使用JAVA openjdk版本,除此之外,使用官方JAVA版本既可。图形化操作界面,易于上手使用。使用者无需额外学习一套命令,或者了解ORACLE 的底层数据结构原理即可以通过恢复向导(Recovery Wizard)来恢复数据库中的数据。软件支持对单个数据文件的数据扫描和抽取,同时也支持对Oracle ASM存储数据恢复。其导出的数据既可导出为sqlldr导入数据文件,也可通过PRM-DUL的Data Bridge功能直接导出并插入到指定新库中,实现不落地恢复。 PRM-DUL Oracle数据库恢复工具功能 》》可以在不需要运行Oracle数据库的情况下直接针对数据库文件或进行数据解析。 》》支持ASM,可直接读取ASM磁盘并对其中数据文件以及文件中的数据进行扫描解析。 》》支持裸设备数据文件读取。 》》支持LOB字段(CLOB, NCLOB和BLOB)恢复,并支持同一个表中,不同LOB列使用不同CHUNK SIZE的情况 》》支持多种Big Endian/Little Endian操作平台(AIX/HPUX/SOLARIS/Linux/Windows)数据库数据恢复 》》支持分区、子分区数据恢复 》》支持各种表,包括普通的HEAP表和聚簇(CLUSTER)表数据恢复 》》支持表被truncate后的数据恢复 》》支持表被drop后的数据恢复 》》支持在没有SYSTEM表空间和数据字典损坏的情况下的非字典模式数据恢复,并能为判断数据类型提供辅助依据 》》支持10g及以上的大文件(BigFile)表空间 》》支持同一个库中不同块大小的数据文件 》》以纯文本导出时,能够自动生成建表的SQL语句和SQL*Loader导入所需的control文件 PRM-DUL Oracle(数据库恢复工具) v4.1更新日志 1. 对使用DELETE命令误删除的数据的救援恢复支持 2. 对在字典模式下LOB数据Data Bridge功能增强,大幅度改善导出性能 3. 增加在非字典模式下LOB数据的Data Bridge支持。 4. 增加对字典模式/非字典模式数据加载信息的重用支持 5. 增加Schema级的DDL导出支持(包含相表,索引,视图建立语句信息) PRM-DUL Oracle数据库恢复工具截图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值