load_binary = load_elf_binary, .load_shlib = load_elf_library, .core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE, .hasvdso = 1 }; 要支持ELF文件的运行,则必须向内核登记注册elf_format这个linux_binfmt类型的数据结构,加入到内核支持的可执行程序的队列中。内核提供两个函数来完成...
if (!elf_check_arch(elf_ex)) goto out; if (elf_check_fdpic(elf_ex)) goto out; if (!bprm->file->f_op->mmap) goto out; 程序首先读取了e_ident中的魔数并进行了校验,elf_ident是ELF文件最头部的一个长度为16字节的数组,不区分架构和系统位数。e_ident起始的4个字节固定为\0x7fELF,通过校验...
load_elf_binary,主要负责对可执行文件中elf文件读取,并提前做好相关的内存布局关于elf文件elf文件的全称——Executable and Linking Format。一般来说elf文件规定了二进制程序的组织规范。 elf文件的信息分布视图一般而言,其排布顺序是elf header->program header->section header。但是内存信息的排布,并不是唯一的,其...
接着,把此段的内容做了elf_map映射,即从文件中映射到了进程空间中,但要注意的是,映射到进程空间中的地址不只是vaddr,这里还加了一个偏移量load_bias,这个偏移量将被加在所有段的映射上,只所以设计这样一个偏移量,是为满足段的位置随机化的需要。如果没有打开随机化这一功能的话,load_bias的值将保持为0。
ELF可执行文件类型对应的linux_binfmt如上,其中其.load_binary函数指针为load_elf_binary()函数。当我们运行ELF文件时就是由load_elf_binary()加载并启动此ELF文件。 ELF文件启动过程# do_execve# 在linux中运行一个ELF可执行文件通常通过shell命令行。而shell命令行程序实际会先调用fork() 复制一个当前进程的副本...
.core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE, }; ELF可执行文件类型对应的linux_binfmt如上,其中其.load_binary函数指针为load_elf_binary()函数。当我们运行ELF文件时就是由load_elf_binary()加载并启动此ELF文件。 ELF文件启动过程 ...
elf文件的linux_binfmt对象结构如下,该结构体定义了elf文件由load_elf_binary函数加载: 复制 static struct linux_binfmt elf_format={.module=THIS_MODULE,.load_binary=load_elf_binary,.load_shlib=load_elf_library,#ifdef CONFIG_COREDUMP.core_dump=elf_core_dump,.min_coredump=ELF_EXEC_PAGESIZE,#endif};...
内核中实际执行execv()或execve()系统调用的程序是do_execve(),这个函数先打开目标映像文件,并从目标文件的头部(第一个字节开始)读入若干(当前Linux内核中是128)字节(实际上就是填充ELF文件头,下面的分析可以看到),然后调用另一个函数search_binary_handler(),在此函数里面,它会搜索我们上面提到的Linux支持的可执行...
load_elf_binary 函数直接操作 elf 文件,对文件中的段进行加载,在elf文件格式分析中知道,elf文件链接时是按照段(section)视图组织(readelf -S elf_file),所有的段大致可以分为三种类型: 数据段,程序数据,典型的比如 .data、.bss 代码段,指令数据,典型的比如 .text、.init 针对链接阶段的辅助信息,典型的比如重...
然后识别文件是否为可执行文件或动态链接文件,ELF文件当前主要有4种格式,分别为可重定位文件(ET_REL)、可执行文件(ET_EXEC)、共享目标文件(ET_DYN)和core文件(ET_CORE)。load_elf_binary函数只负责解析exec和dyn文件。最后还解析了文件依赖的系统架构等必要项。