我需要修改 Ubuntu 14.04 发行版的 ELF 加载程序的内核实现。使用以下方式下载源:
sudo apt-get source linux-image-$(uname -r)
我运行了配置脚本:
make config
在根源树中。在看似无穷无尽的输入请求序列之后,脚本创建了.config
构建内核(或一组模块)所需的文件。我使用的内核版本是linux-3.13.0
,它具有以下源树布局:
$ ls
arch Documentation fs kernel README sound
block drivers include lib REPORTING-BUGS tools
COPYING dropped.txt init MAINTAINERS samples ubuntu
CREDITS elf.dat ipc Makefile scripts usr
crypto FileSystemMake Kbuild mm security virt
debian.master firmware Kconfig net shortcuts
ELF 加载器位于/path/to/source/fs/binfmt_elf.c
.下列的这个问题,为了编译单个模块,运行就足够了
make /path/to/module/directory
在这种情况下,将是:
make /path/to/source/fs
编译相当冗长;大约需要二十分钟(在虚拟机上),并且输出(默认情况下)写入模块所在的同一目录中。我通过运行找到了目标文件:
find . -name "*.o"
在/path/to/source/fs
。按名称过滤,可以通过运行以下命令找到 ELF 加载程序:
find . -name "*elf*.o"
在当前的源代码中,它被写入(默认):
/path/to/source/fs/binfmt_elf.o
经历过本教程,我注意到内核模块具有命名约定,module_name.ko
以便将它们与用户空间对象文件区分开来。
考虑到当前的 ELF 加载器存在(并且卸载它可能会阻止二进制文件的执行),如何将新的(修改后的)ELF 加载器插入内核?