亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? binfmt_elf.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * linux/fs/binfmt_elf.c
 */
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/a.out.h>
#include <linux/errno.h>
#include <linux/signal.h>
#include <linux/binfmts.h>
#include <linux/string.h>
#include <linux/fcntl.h>
#include <linux/ptrace.h>
#include <linux/malloc.h>
#include <linux/shm.h>

#include <asm/segment.h>

asmlinkage int sys_exit(int exit_code);
asmlinkage int sys_close(unsigned fd);
asmlinkage int sys_open(const char *, int, int);
asmlinkage int sys_brk(unsigned long);

#define DLINFO_ITEMS 8

#include <linux/elf.h>

/* We need to explicitly zero any fractional pages
   after the data section (i.e. bss).  This would
   contain the junk from the file that should not
   be in memory */

static void padzero(int elf_bss){
  unsigned int fpnt, nbyte;
  
  if(elf_bss & 0xfff) {
    
    nbyte = (PAGE_SIZE - (elf_bss & 0xfff)) & 0xfff;
    if(nbyte){
      verify_area(VERIFY_WRITE, (void *) elf_bss, nbyte);
      
      fpnt = elf_bss;
      while(fpnt & 0xfff) put_fs_byte(0, fpnt++);
    };
  };
}

unsigned long * create_elf_tables(char * p,int argc,int envc,struct elfhdr * exec, unsigned int load_addr, int ibcs)
{
	unsigned long *argv,*envp, *dlinfo;
	unsigned long * sp;
	struct vm_area_struct *mpnt;

	mpnt = (struct vm_area_struct *)kmalloc(sizeof(*mpnt), GFP_KERNEL);
	if (mpnt) {
		mpnt->vm_task = current;
		mpnt->vm_start = PAGE_MASK & (unsigned long) p;
		mpnt->vm_end = TASK_SIZE;
		mpnt->vm_page_prot = PAGE_PRIVATE|PAGE_DIRTY;
		mpnt->vm_share = NULL;
		mpnt->vm_inode = NULL;
		mpnt->vm_offset = 0;
		mpnt->vm_ops = NULL;
		insert_vm_struct(current, mpnt);
		current->stk_vma = mpnt;
	}
	sp = (unsigned long *) (0xfffffffc & (unsigned long) p);
	if(exec) sp -= DLINFO_ITEMS*2;
	dlinfo = sp;
	sp -= envc+1;
	envp = sp;
	sp -= argc+1;
	argv = sp;
	if (!ibcs) {
		put_fs_long((unsigned long)envp,--sp);
		put_fs_long((unsigned long)argv,--sp);
	}

	/* The constant numbers (0-9) that we are writing here are
	   described in the header file sys/auxv.h on at least
	   some versions of SVr4 */
	if(exec) { /* Put this here for an ELF program interpreter */
	  struct elf_phdr * eppnt;
	  eppnt = (struct elf_phdr *) exec->e_phoff;
	  put_fs_long(3,dlinfo++); put_fs_long(load_addr + exec->e_phoff,dlinfo++);
	  put_fs_long(4,dlinfo++); put_fs_long(sizeof(struct elf_phdr),dlinfo++);
	  put_fs_long(5,dlinfo++); put_fs_long(exec->e_phnum,dlinfo++);
	  put_fs_long(9,dlinfo++); put_fs_long((unsigned long) exec->e_entry,dlinfo++);
	  put_fs_long(7,dlinfo++); put_fs_long(SHM_RANGE_START,dlinfo++);
	  put_fs_long(8,dlinfo++); put_fs_long(0,dlinfo++);
	  put_fs_long(6,dlinfo++); put_fs_long(PAGE_SIZE,dlinfo++);
	  put_fs_long(0,dlinfo++); put_fs_long(0,dlinfo++);
	};

	put_fs_long((unsigned long)argc,--sp);
	current->arg_start = (unsigned long) p;
	while (argc-->0) {
		put_fs_long((unsigned long) p,argv++);
		while (get_fs_byte(p++)) /* nothing */ ;
	}
	put_fs_long(0,argv);
	current->arg_end = current->env_start = (unsigned long) p;
	while (envc-->0) {
		put_fs_long((unsigned long) p,envp++);
		while (get_fs_byte(p++)) /* nothing */ ;
	}
	put_fs_long(0,envp);
	current->env_end = (unsigned long) p;
	return sp;
}


/* This is much more generalized than the library routine read function,
   so we keep this separate.  Techincally the library read function
   is only provided so that we can read a.out libraries that have
   an ELF header */

static unsigned int load_elf_interp(struct elfhdr * interp_elf_ex,
			     struct inode * interpreter_inode)
{
        struct file * file;
	struct elf_phdr *elf_phdata  =  NULL;
	struct elf_phdr *eppnt;
	unsigned int len;
	unsigned int load_addr;
	int elf_exec_fileno;
	int elf_bss;
	int old_fs, retval;
	unsigned int last_bss;
	int error;
	int i, k;
	
	elf_bss = 0;
	last_bss = 0;
	error = load_addr = 0;
	
	/* First of all, some simple consistency checks */
	if((interp_elf_ex->e_type != ET_EXEC && 
	    interp_elf_ex->e_type != ET_DYN) || 
	   (interp_elf_ex->e_machine != EM_386 && interp_elf_ex->e_machine != EM_486) ||
	   (!interpreter_inode->i_op || !interpreter_inode->i_op->bmap || 
	    !interpreter_inode->i_op->default_file_ops->mmap)){
		return 0xffffffff;
	};
	
	/* Now read in all of the header information */
	
	if(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > PAGE_SIZE) 
	    return 0xffffffff;
	
	elf_phdata =  (struct elf_phdr *) 
		kmalloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum, GFP_KERNEL);
	if(!elf_phdata) return 0xffffffff;
	
	old_fs = get_fs();
	set_fs(get_ds());
	retval = read_exec(interpreter_inode, interp_elf_ex->e_phoff, (char *) elf_phdata,
			   sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
	set_fs(old_fs);
	
	elf_exec_fileno = open_inode(interpreter_inode, O_RDONLY);
	if (elf_exec_fileno < 0) return 0xffffffff;
	file = current->filp[elf_exec_fileno];

	eppnt = elf_phdata;
	for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
	  if(eppnt->p_type == PT_LOAD) {
	    error = do_mmap(file, 
			    eppnt->p_vaddr & 0xfffff000,
			    eppnt->p_filesz + (eppnt->p_vaddr & 0xfff),
			    PROT_READ | PROT_WRITE | PROT_EXEC,
			    MAP_PRIVATE | (interp_elf_ex->e_type == ET_EXEC ? MAP_FIXED : 0),
			    eppnt->p_offset & 0xfffff000);
	    
	    if(!load_addr && interp_elf_ex->e_type == ET_DYN)
	      load_addr = error;
	    k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
	    if(k > elf_bss) elf_bss = k;
	    if(error < 0 && error > -1024) break;  /* Real error */
	    k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
	    if(k > last_bss) last_bss = k;
	  }
	
	/* Now use mmap to map the library into memory. */

	
	sys_close(elf_exec_fileno);
	if(error < 0 && error > -1024) {
	        kfree(elf_phdata);
		return 0xffffffff;
	}

	padzero(elf_bss);
	len = (elf_bss + 0xfff) & 0xfffff000; /* What we have mapped so far */

	/* Map the last of the bss segment */
	if (last_bss > len)
	  do_mmap(NULL, len, last_bss-len,
		  PROT_READ|PROT_WRITE|PROT_EXEC,
		  MAP_FIXED|MAP_PRIVATE, 0);
	kfree(elf_phdata);

	return ((unsigned int) interp_elf_ex->e_entry) + load_addr;
}

static unsigned int load_aout_interp(struct exec * interp_ex,
			     struct inode * interpreter_inode)
{
  int retval;
  unsigned int elf_entry;
  
  current->brk = interp_ex->a_bss +
    (current->end_data = interp_ex->a_data +
     (current->end_code = interp_ex->a_text));
  elf_entry = interp_ex->a_entry;
  
  
  if (N_MAGIC(*interp_ex) == OMAGIC) {
    do_mmap(NULL, 0, interp_ex->a_text+interp_ex->a_data,
	    PROT_READ|PROT_WRITE|PROT_EXEC,
	    MAP_FIXED|MAP_PRIVATE, 0);
    retval = read_exec(interpreter_inode, 32, (char *) 0, 
		       interp_ex->a_text+interp_ex->a_data);
  } else if (N_MAGIC(*interp_ex) == ZMAGIC || N_MAGIC(*interp_ex) == QMAGIC) {
    do_mmap(NULL, 0, interp_ex->a_text+interp_ex->a_data,
	    PROT_READ|PROT_WRITE|PROT_EXEC,
	    MAP_FIXED|MAP_PRIVATE, 0);
    retval = read_exec(interpreter_inode,
		       N_TXTOFF(*interp_ex) ,
		       (char *) N_TXTADDR(*interp_ex),
		       interp_ex->a_text+interp_ex->a_data);
  } else
    retval = -1;
  
  if(retval >= 0)
    do_mmap(NULL, (interp_ex->a_text + interp_ex->a_data + 0xfff) & 
	    0xfffff000, interp_ex->a_bss,
	    PROT_READ|PROT_WRITE|PROT_EXEC,
	    MAP_FIXED|MAP_PRIVATE, 0);
  if(retval < 0) return 0xffffffff;
  return elf_entry;
}

/*
 * These are the functions used to load ELF style executables and shared
 * libraries.  There is no binary dependent code anywhere else.
 */

#define INTERPRETER_NONE 0
#define INTERPRETER_AOUT 1
#define INTERPRETER_ELF 2

int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
{
	struct elfhdr elf_ex;
	struct elfhdr interp_elf_ex;
	struct file * file;
  	struct exec interp_ex;
	struct inode *interpreter_inode;
	unsigned int load_addr;
	unsigned int interpreter_type = INTERPRETER_NONE;
	int i;
	int old_fs;
	int error;
	struct elf_phdr * elf_ppnt, *elf_phdata;
	int elf_exec_fileno;
	unsigned int elf_bss, k, elf_brk;
	int retval;
	char * elf_interpreter;
	unsigned int elf_entry;
	int status;
	unsigned int start_code, end_code, end_data;
	unsigned int elf_stack;
	char passed_fileno[6];
	
	status = 0;
	load_addr = 0;
	elf_ex = *((struct elfhdr *) bprm->buf);	  /* exec-header */
	
	if (elf_ex.e_ident[0] != 0x7f ||
	    strncmp(&elf_ex.e_ident[1], "ELF",3) != 0)
		return  -ENOEXEC;
	
	
	/* First of all, some simple consistency checks */
	if(elf_ex.e_type != ET_EXEC || 
	   (elf_ex.e_machine != EM_386 && elf_ex.e_machine != EM_486) ||
	   (!bprm->inode->i_op || !bprm->inode->i_op->default_file_ops ||
	    !bprm->inode->i_op->default_file_ops->mmap)){
		return -ENOEXEC;
	};
	
	/* Now read in all of the header information */
	
	elf_phdata = (struct elf_phdr *) kmalloc(elf_ex.e_phentsize * 
						 elf_ex.e_phnum, GFP_KERNEL);
	
	old_fs = get_fs();
	set_fs(get_ds());
	retval = read_exec(bprm->inode, elf_ex.e_phoff, (char *) elf_phdata,
			   elf_ex.e_phentsize * elf_ex.e_phnum);
	set_fs(old_fs);
	if (retval < 0) {
	        kfree (elf_phdata);
		return retval;
	}
	
	elf_ppnt = elf_phdata;
	
	elf_bss = 0;
	elf_brk = 0;
	
	elf_exec_fileno = open_inode(bprm->inode, O_RDONLY);

	if (elf_exec_fileno < 0) {
	        kfree (elf_phdata);
		return elf_exec_fileno;
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
1024精品合集| 国产日产精品1区| 国产精品美女久久福利网站 | 精品国产乱码久久久久久浪潮 | 欧美视频一区二区| 久久精品欧美一区二区三区不卡 | 久久不见久久见中文字幕免费| 暴力调教一区二区三区| 欧美高清一级片在线| 成人欧美一区二区三区黑人麻豆 | 午夜精品国产更新| 99r精品视频| 久久久久久久综合狠狠综合| 视频一区国产视频| 99re亚洲国产精品| 久久亚洲影视婷婷| 日韩国产欧美三级| 在线视频欧美区| 亚洲欧洲一区二区三区| 国产精品主播直播| 日韩精品在线一区二区| 亚洲高清免费一级二级三级| 色狠狠桃花综合| 国产精品另类一区| 国产大片一区二区| 精品国产露脸精彩对白| 日韩高清不卡一区二区三区| 欧美视频三区在线播放| 亚洲精品中文字幕乱码三区| 成人av资源网站| 欧美国产一区二区| 国产大片一区二区| 国产日韩欧美精品一区| 国产精品 日产精品 欧美精品| 精品国产乱码久久久久久闺蜜| 美女视频黄免费的久久| 制服丝袜中文字幕一区| 午夜a成v人精品| 欧美日韩国产小视频在线观看| 亚洲精品欧美专区| 色吊一区二区三区 | 精品久久人人做人人爰| 日韩高清一级片| 欧美一区二区三区在线视频| 午夜精品久久久久久不卡8050| 欧美日韩国产一区| 日本aⅴ亚洲精品中文乱码| 欧美电影在哪看比较好| 视频一区二区三区入口| 欧美一区二区久久久| 日本亚洲三级在线| 日韩三级伦理片妻子的秘密按摩| 青青草伊人久久| 欧美成人精品二区三区99精品| 六月丁香综合在线视频| wwwwxxxxx欧美| 国产不卡视频一区| 国产精品乱人伦| 91网站视频在线观看| 亚洲精品一二三区| 欧美午夜免费电影| 奇米影视7777精品一区二区| 精品黑人一区二区三区久久| 国产麻豆午夜三级精品| 国产免费观看久久| 92国产精品观看| 亚洲国产精品精华液网站| 777午夜精品视频在线播放| 日本aⅴ亚洲精品中文乱码| www一区二区| 不卡的av网站| 亚洲一区在线电影| 欧美一区二区三区视频在线观看| 久国产精品韩国三级视频| 国产日产欧美一区| 日本精品视频一区二区三区| 日精品一区二区三区| 精品三级在线看| 不卡电影一区二区三区| 亚洲最新在线观看| 日韩欧美在线影院| 成人视屏免费看| 一个色综合av| 精品国产乱码久久久久久影片| 成人97人人超碰人人99| 夜夜精品浪潮av一区二区三区| 欧美一区二区三区思思人| 国产99久久久国产精品| 亚洲一卡二卡三卡四卡五卡| 日韩欧美二区三区| 99精品偷自拍| 麻豆精品一区二区三区| 国产精品久久影院| 日韩一区二区视频| av网站一区二区三区| 三级在线观看一区二区| 国产午夜精品一区二区三区视频 | 国产自产视频一区二区三区 | 欧美tickling网站挠脚心| 成人美女在线视频| 偷拍自拍另类欧美| 国产色综合久久| 欧美色精品在线视频| 国产一区在线看| 亚洲综合久久久久| 久久久三级国产网站| 欧美日韩一区二区三区不卡| 国产成人无遮挡在线视频| 亚洲成av人片在www色猫咪| 久久免费国产精品| 欧美精品粉嫩高潮一区二区| 成人av小说网| 久久精品国产精品亚洲精品 | 久久亚洲精精品中文字幕早川悠里| 91网站视频在线观看| 极品瑜伽女神91| 亚洲福中文字幕伊人影院| 欧美激情一二三区| 欧美成人国产一区二区| 91福利在线免费观看| 国产精品99久久久久久有的能看| 亚洲成人精品一区| 国产精品对白交换视频| 26uuu亚洲综合色| 欧美精品黑人性xxxx| 色哟哟日韩精品| 国产不卡一区视频| 精品亚洲国产成人av制服丝袜| 亚洲激情图片一区| 中国色在线观看另类| 日韩美一区二区三区| 欧美日韩成人一区| 色先锋久久av资源部| 成人一级黄色片| 国内精品国产成人国产三级粉色| 亚洲成人一区二区在线观看| 综合激情成人伊人| 国产精品视频一二三区 | 色哟哟在线观看一区二区三区| 国产电影一区在线| 国产在线精品一区二区| 日本美女一区二区| 午夜精品久久久久久久久久久| 中文字幕佐山爱一区二区免费| 久久久亚洲高清| 精品国产区一区| 日韩欧美中文字幕制服| 91精品免费观看| 欧美人动与zoxxxx乱| 欧美偷拍一区二区| 日本韩国欧美在线| 色悠悠久久综合| 色综合久久久久网| 色哟哟一区二区在线观看| 91在线精品秘密一区二区| 成人激情黄色小说| 高清国产一区二区三区| 国产成人av福利| 成人免费看的视频| 丁香婷婷综合色啪| 成人国产精品免费| 99久久99久久精品国产片果冻| 成人黄色小视频| 东方aⅴ免费观看久久av| 国产成人av一区| 99久久精品国产麻豆演员表| 91一区在线观看| 色一区在线观看| 在线视频综合导航| 欧美丝袜丝交足nylons图片| 欧美日韩精品欧美日韩精品| 欧美日本国产视频| 日韩欧美国产成人一区二区| 精品国产a毛片| 国产欧美一区二区三区鸳鸯浴 | 国产精品色噜噜| 国产精品美女久久久久久| 亚洲三级视频在线观看| 亚洲精品大片www| 亚洲成av人片| 秋霞午夜av一区二区三区| 九九**精品视频免费播放| 国产成人超碰人人澡人人澡| 91在线播放网址| 欧美日韩精品一区二区天天拍小说 | www.成人在线| 色国产精品一区在线观看| 欧美日韩国产综合一区二区三区 | 在线不卡中文字幕| 日韩欧美精品在线视频| 久久婷婷久久一区二区三区| 欧美激情在线一区二区三区| 日韩毛片视频在线看| 亚洲3atv精品一区二区三区| 九九精品一区二区| 成人高清视频免费观看| 欧美色手机在线观看| 欧美成人r级一区二区三区| 日本一区二区免费在线观看视频 | 久久久精品国产99久久精品芒果|