最近需要看一下Linux是如何加载PIC的, 为此我查找了内核中相关代码。
大致流程似乎是:
- 用户态程序调用execve系统调用, 对应内核的sys_execve函数。
- 一通操作后, 会调用内核中的__do_execve_file函数。
- 其中会调用exec_binprm函数, 这是关键。
- 上述函数简单操作后, 会调用到search_binary_handler。该函数能够找到合适的binary formats handler, 然后调用这个handler的load_binary, 这是一个虚函数的指针。
- 以ELF格式为例, 最终调用的是load_elf_binary, 在这个文件中: https://elixir.bootlin.com/linux/latest/source/fs/binfmt_elf.c#L685
- load_elf_binary做了很多脏活累活。特别地, 如果这个ELF需要解释器的话(即有INTERP类型的程序头), 还要(递归地)加载解释器。
发表评论