我需要修改ELF加载器的Ubuntu14.04发行版的内核实现。下载了以下来源:
sudo apt-get source linux-image-$(uname -r)
我运行了配置脚本:
make config
在根源树中。在一连串看似没完没了的输入请求之后,脚本创建了构建内核(或一组模块)所需的.config文件。我使用的内核版本是Linux3.13.0,具有以下源代码树布局:
$ ls
arch COPYING crypto Documentation dropped.txt FileSystemMakefile fs init Kbuild kernel MAINTAINERS mm README samples security sound ubuntu virt
block CREDITS debian.master drivers elf.dat firmware include ipc Kconfig lib Makefile net REPORTING-BUGS scripts shortcuts tools usr
ELF加载程序位于/path/to/source/fs/binfmt_elf.c.中。下面是这问题,要编译单个模块,只需运行
make /path/to/module/directory.
在这种情况下,将是:
make ./path/to/source/fs
编译相当长,大约需要20分钟(在虚拟机上),输出(默认情况下)写在模块所在的同一个目录中。我通过运行以下命令找到了对象文件:
find . -name "*.o"
在/path/to/source/fs中。可以通过运行以下命令来查找ELF加载程序的名称过滤:
find . -name "*elf*.o"
在当前源中,它(默认情况下)写在:
/path/to/source/fs/binfmt_elf.o
在阅读了module_name.ko教程之后,我注意到内核模块具有命名约定这,以便将它们与用户空间对象文件区分开来。
我的问题是,在当前ELF加载程序存在的情况下,如何将新的(修改的) ELF加载程序插入内核(因为卸载它可能会阻止执行二进制文件)?
发布于 2015-03-10 14:21:09
您所描述的并不是像通常所提到的那样真正编译“内核模块”。您已经构建了一个静态链接到内核中的对象,并且不可能只将该对象加载到正在运行的内核中。
“内核模块”通常指“可加载内核模块”(LKM)。构建fs并将其作为LKM加载是您需要/想要的。看看下面的操作方法。接下来,将所需的fs构建为LKM。然后您只需替换那个LKM (.ko)文件并重新启动(通常您可以动态删除和插入LKM,但不确定这将如何影响一些基本的东西,比如ELF -您可以先尝试rmmod/ you探测,而不需要重新引导)。
https://stackoverflow.com/questions/28973146
复制相似问题