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,通过校验...
Linux内核中ELF可执行文件的装载/load_elf_binary()函数解析,在Linux系统中运行一个可执行的ELF文件时,内核首先需要识别这个文件,然后解析并装载它以构建进程的内存空间,最后切换到新的进程来运行。在fs/binfmt_elf.c中定义了函数load_elf_binary()和load_elf_library()
ELF是一个通用的可执行文件格式,几乎所有的Linux可执行文件都支持它。ELF头包含了进程映像的许多信息,如程序入口、共享对象表和链接信息。它也包含了此进程映像中程序代码和数据的头部信息,如数据段、BSS段、符号表等等。 ELF头:https://static.oschina.net/uploads/space/2023/1222/110013_Qscl_5524496.png 4. ...
load_shlib = load_elf_library, .core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE, }; 当我们执行一个可执行程序的时候, 内核会list_for_each_entry遍历所有注册的linux_binfmt对象, 对其调用load_binrary方法来尝试加载, 直到加载成功为止。上面代码可以看倒,ELF中加载程序即为load_elf_...
.load_shlib = load_elf_library, .core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE, }; ELF可执行文件类型对应的linux_binfmt如上,其中其.load_binary函数指针为load_elf_binary()函数。当我们运行ELF文件时就是由load_elf_binary()加载并启动此ELF文件。
.load_binary = load_elf_binary, .load_shlib = load_elf_library, .core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE }; ELF格式的二进制映像的认领、装入和启动是由load_elf_binary()完成的。而“共享库”、即动态连接库映像的装入则由load_elf_library()完成。实际上共享库的映像也是...
其中load_binary函数指针指向的就是一个可执行程序的处理函数。 ELF文件格式的定义如下: staticstructlinux_binfmt elf_format ={ .module=THIS_MODULE, .load_binary=load_elf_binary, .load_shlib=load_elf_library, .core_dump=elf_core_dump, .min_coredump=ELF_EXEC_PAGESIZE, ...
.load_shlib = load_elf_library, .core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE, }; 在这里,它定义load_lef_binary为解析器load_binary的具体实现(其实就是一种多态),之后将该结构体注册到解析器的链表中,从此再遇到ELF文件,搜索解析器链表,就可以找到专门解析这种文件的解析器了。
.load_shlib = load_elf_library, .core_dump = elf_core_dump, .min_coredump = ELF_EXEC_PAGESIZE, }; 1. 2. 3. 4. 5. 6. 7. ELF可执行文件类型对应的linux_binfmt如上,其中其.load_binary函数指针为load_elf_binary()函数。当我们运行ELF文件时就是由load_elf_binary()加载并启动此ELF文件。
可见,ELF在解析完binary的section之后,会尽量运行interpreter。所以,binary中使用的interpreter就可以有很大的操作空间,可以让程序共享一部分代码(就是各个so),在运行前进行链接。注意,在pc上,一般是使用ld;而在Android上,使用Google自己实现的linker。 7,LD_LIBRARY_PATH 这个环境变量用来告诉ld可以去哪些目录下搜索so。