在文件linux/fs/binfmt_elf.c中开始了ELF可执行文件的内核之旅–注册
注册二进制文件格式的函数register_binfmt是将一个struct linux_binfmt结构体添加到linux系统总的文件格式链表中,实现如,链表头为formats。
注册的文件格式结构体如下:
第一个成员就是该结构体的链表头。
core_dump函数在程序收到“dump”信号时调用,产生core dump文件。
load_binary和load_shlib是文件格式主要的钩子函数:加载
可以想象当一个程序执行时,系统先会扫描该程序的文件格式,然后根据文件格式去遍历该结构体的链表,匹配到对应的注册结构体,最后就是调用其注册的load_binary或load_shlib函数了。
对于ELF文件格式其对该结构体填充如下:
我们知道当用户层执行execve函数会调用内核层的系统调用函数sys_execve。将文件路径拷贝到内核后执行函数do_execve。其主要使用了执行一个新的程序。
do_execve函数中执行以下初始工作后调用search_binnary_handler函数,从系统文件格式链表format中扫描并调用load binary函数。
参考: