10

如果我这样做--strip-debug--strip-unneeded,我有.ko列出所有函数名称的nm,如果我这样做了,strip foo.ko我有一个拒绝加载的内核模块。

有谁知道快速快捷方式如何删除模块加载不需要的所有符号,以便人们无法轻松地对 API:s 进行逆向工程?

PS:对于所有开源偏执的传教士;这是一般公众在任何情况下都不会使用的东西,因此无需将问题变成 GPL 火焰战。

4

7 回答 7

8

没有回答我之前的问题,这里有一些猜测,也可能是一些线索,以及答案的一步:

据我回忆,.ko 只不过是一个 .o 文件,它是由源模块生成的所有 .o 文件合并而成,并添加了一个 .modinfo 部分。在任何 .ko 构建 Makefile 的末尾,都有一个 LD 调用:据我所知,ld 是用 -r 选项调用的,这就是创建 Makefile 调用 .ko 的那个 .o 文件的原因。此生成的文件不要与存档或对象库(.a 文件)混淆,后者只是将多个 .o 文件存档/打包为一个的格式:合并对象是生成另一个 .o 的链接的结果模块:但是在生成的模块中,所有可以合并的部分都已经存在,并且所有可以解析的公共/外部对都在这些部分中。所以我假设你最终得到了包含所有“本地”外部定义的 .ko 文件:

  • 那些是外部的,因为它们用于跨 .ko 中的 .o 模块调用(但不再需要,因为它们不应该从 .ko 外部调用),以及

  • .ko 模块确实需要与加载程序和内核正确通信的那些。

前者很可能在合并期间已经由 ld 解决,但 ld 无法知道您是否打算让它们也可以从 .ko 外部调用。

因此,您看到的无关符号是每个 .o 文件的外部符号,但不需要作为生成的 .ko 的外部符号。你正在寻找的是一种只剥离那些的方法。

最后一段是否正确描述了您想要摆脱的符号?

于 2010-06-04T09:35:07.207 回答
7

我认为这正是我们在这里谈论的内容。

好的,那么看起来一种解决方案是“手动”删除无关符号。“strip”实用程序似乎允许单独剥离(或保留)符号,因此您必须使用一个--strip-all和一小束--keep-symbol=。请注意,--wildcard也可能会有所帮助。当然,您可以做相反的事情,保留所有并单独剥离,这取决于最方便的方法。

一个好的开始可能是删除在模块中为跨模块链接明确定义并且不想出现的所有符号 - 只留下明显有用的符号,例如 init 和 exit。并且不要触及那些由/属于内核开发软件基础设施的内容。然后反复试验,直到找到正确的配方......事实上,我认为除了你明确定义自己为 EXPORT_SYMBOL 的那些符号(当然还有 init / exit)之外,你自己的所有符号都可能是可移除的。

祝你好运!:)

PS:

事实上,似乎所有 .ko 项目中都存在所需的源信息以自动执行所需的剥离:除非我遗漏了什么,否则似乎任何不是 EXPORT_SYMBOL 或由构建软件显式插入的东西理论上都可以默认被剥离在结束 .ko 构建的“ld -r”时间结束时。只是我认为工具链(编译器/链接器)没有提供/指令/选项来单独指定可重定位链接/合并的“剥离或保留”符号。否则,EXPORT_SYMBOL 宏和其他一些地方的一些修改可能会达到您所追求的结果,并从任何 Linux 系统中的大多数 .ko 文件中删除一些字节。

于 2010-06-05T17:33:41.697 回答
7

我刚刚构建了一个内核,没有意识到内核配置启用了调试符号,因此生成的模块的大小非常大。这对我有用:

# du -sh /lib/modules/3.1.0/
1.9G    /lib/modules/3.1.0/
# find /lib/modules/3.1.0/ -iname "*.ko" -exec strip --strip-debug {} \;
# du -sh /lib/modules/3.1.0/
134M    /lib/modules/3.1.0/

查找/lib/modules/3.1.0命名的所有文件*.ko并在每个文件上执行strip --strip-debug

于 2011-10-26T14:16:12.663 回答
3

我不确定我是否理解真正的问题:在开发 .ko 时,如果我没有明确添加类似

ccflags-y += -ggdb -O0 -Wall

在我的 Makefile 中,除了我自己发布的那些或外部参考之外,我没有得到任何符号。我确信我没有得到任何其他符号有几个很好的理由:

  • 生成的 .ko 文件要小得多,
  • 转储文件并分析 ELF 显示表不存在,
  • 我看不到也无法访问 kgdb 中的符号。

所以我对你的问题有点困惑,实际上?......你在你的 .ko 中看到的那些符号是什么(并且不想看到)?它们是如何在您的源文件中声明的?它们最终会出现在哪些 ELF 部分?而且(对不起,前面的愚蠢问题):您是否定义了所有不需要在自己的模块之外看到的东西?

于 2010-05-27T09:20:28.063 回答
1

除了 filofel 的帖子:

剥离用户空间共享库使它们保持运行的原因是因为它们导出的符号位于.dynsym从未剥离的部分中。.ko但是文件不使用 dynsym。

于 2010-11-21T14:11:57.737 回答
1

人们报告成功

strip --strip-unneeded 
于 2011-07-14T20:24:45.307 回答
0

strip -g XXX.

我以前的问题就像你发生的事情一样被这个命令在嵌入式设备中解决了Linux Kernel 3.0.8

于 2016-04-10T08:45:23.570 回答