如何获得在Linux下运行的可执行二进制文件?
如何将文件加载到内存以及如何开始执行代码?
发布于 2018-01-02 13:15:57
Linux 4.0系统调用
fs/exec.c
定义了系统调用 SYSCALL_DEFINE3(execve
简单地转发给do_execve
。do_execve
前进到do_execveat_common
。do_execveat_common
要查找下一个主要功能,请跟踪返回值retval
的上次修改时间。
开始构建一个struct linux_binprm *bprm
描述程序,并将其传递exec_binprm
给执行。exec_binprm
再次,按照返回值找到下一个主要的call。search_binary_handler
#!
magic)和ELF(\x7fELFmagic
)的处理程序,但还有其他内置的内核,例如a.out
。用户也可以通过/ proc / sys / fs / binfmt_misc注册
ELF处理程序定义在fs/binfmt_elf.c
。formats
列表包含所有的处理程序。
每个处理程序文件包含如下所示
static int __init init_elf_binfmt(void) { register_binfmt(&elf_format); return 0; }
和elf_format
是一个struct linux_binfmt
在该文件中定义。
__init
把这个代码放到一个magic部分,在内核启动时被调用:__init在Linux内核代码中意味着什么?
链接器级别的依赖注入!echo '#!/tmp/a' > /tmp/a chmod +x /tmp/a /tmp/a
retval = fmt->load_binary(bprm);
fs/binfmt_elf.c:load_binary
是否实际工作:
struct linux_binprm
,注册成a struct pt_regs
)设置进程初始化的程序状态,start_thread
,开始运行的地方待办事项:进一步继续进行来源分析。我期望接下来会发生什么:
/lib64/ld-linux-x86-64.so.2
)。dlopen
在他们身上dlopen
使用可配置的搜索路径来查找这些库,将它们映射到内存,并以某种方式通知ELF在哪里找到其丢失的符号_start
ELFhttps://stackoverflow.com/questions/-100001302
复制相似问题