首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >编译单个内核模块(Debian/Ubuntu)

编译单个内核模块(Debian/Ubuntu)
EN

Stack Overflow用户
提问于 2015-03-10 12:07:51
回答 1查看 1.1K关注 0票数 0

我需要修改ELF加载器的Ubuntu14.04发行版的内核实现。下载了以下来源:

代码语言:javascript
运行
AI代码解释
复制
sudo apt-get source linux-image-$(uname -r)

我运行了配置脚本:

代码语言:javascript
运行
AI代码解释
复制
make config

在根源树中。在一连串看似没完没了的输入请求之后,脚本创建了构建内核(或一组模块)所需的.config文件。我使用的内核版本是Linux3.13.0,具有以下源代码树布局:

代码语言:javascript
运行
AI代码解释
复制
$ 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.中。下面是问题,要编译单个模块,只需运行

代码语言:javascript
运行
AI代码解释
复制
make /path/to/module/directory. 

在这种情况下,将是:

代码语言:javascript
运行
AI代码解释
复制
make ./path/to/source/fs

编译相当长,大约需要20分钟(在虚拟机上),输出(默认情况下)写在模块所在的同一个目录中。我通过运行以下命令找到了对象文件:

代码语言:javascript
运行
AI代码解释
复制
find . -name "*.o"

在/path/to/source/fs中。可以通过运行以下命令来查找ELF加载程序的名称过滤:

代码语言:javascript
运行
AI代码解释
复制
find . -name "*elf*.o"

在当前源中,它(默认情况下)写在:

代码语言:javascript
运行
AI代码解释
复制
/path/to/source/fs/binfmt_elf.o

在阅读了module_name.ko教程之后,我注意到内核模块具有命名约定,以便将它们与用户空间对象文件区分开来。

我的问题是,在当前ELF加载程序存在的情况下,如何将新的(修改的) ELF加载程序插入内核(因为卸载它可能会阻止执行二进制文件)?

EN

回答 1

Stack Overflow用户

发布于 2015-03-10 14:21:09

您所描述的并不是像通常所提到的那样真正编译“内核模块”。您已经构建了一个静态链接到内核中的对象,并且不可能只将该对象加载到正在运行的内核中。

“内核模块”通常指“可加载内核模块”(LKM)。构建fs并将其作为LKM加载是您需要/想要的。看看下面的操作方法。接下来,将所需的fs构建为LKM。然后您只需替换那个LKM (.ko)文件并重新启动(通常您可以动态删除和插入LKM,但不确定这将如何影响一些基本的东西,比如ELF -您可以先尝试rmmod/ you探测,而不需要重新引导)。

http://www.tldp.org/HOWTO/Module-HOWTO/x73.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28973146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文