Kim*_*ais 7 strip kernel-module linux-kernel
如果我这样做,--strip-debug或者--strip-unneeded我有.ko列出所有函数名称nm,如果我这样做,strip foo.ko我有一个拒绝加载的内核模块.
有没有人知道如何删除模块加载不需要的所有符号的快捷方式,以便人们无法对API进行反向工程设计?
PS:对于所有开源bigots传教士; 这是一般公众在任何情况下都不会使用的东西,因此不需要将问题变成GPL火焰战争.
由于没有回答我以前的问题,这里有一些猜测,也可能是一些线索,以及回答的一步:
根据我的记忆,.ko只是一个.o文件,它源于源模块生成的所有.o文件的合并,以及.modinfo部分的添加.在任何.ko构建Makefile的末尾,都有一个LD调用:从我记得,使用-r选项调用ld,这就是创建Makefile调用.ko文件的.o文件.这个结果文件不要与存档或对象库(.a文件)混淆,这只是一个格式存档/打包多个.o文件为一个:合并对象是一个链接的结果,产生另一个.o module:但是在结果模块中,所有可以合并的部分都是,并且可以解析的所有公共/外部对都在这些部分中.因此,我假设您最终得到包含所有"本地"外部定义的.ko文件:
那些是extern的,因为他们习惯于调用.ko中的.o模块(但不再需要,因为它们不应该从.ko外部调用),以及
那些.ko模块需要与加载器和内核正确通信的那些.
合并期间前者很可能已经被ld解决了,但是ld无法知道你是否打算让它们也可以从.ko之外调用.
因此,您看到的无关符号是每个.o文件的外部符号,但不需要作为结果.ko的外部符号.而你正在寻找的只是剥夺那些.
这最后一段是否恰当地描述了你要摆脱的符号?
我想这正是我们在这里谈论的内容.
好的,那么看起来一个解决方案是"手动"删除无关的符号."strip"实用程序似乎允许单独剥离(或保留)符号,因此您必须使用一个--strip-all和一小组--keep-symbol =.请注意, - wildcard也可能有所帮助.你可以做相反的事情,当然,保持所有和单独剥离,取决于什么是最方便的.
一个好的开始可能是删除您在模块中明确定义的用于跨模块链接的所有符号,并且不希望出现 - 只留下明显有用的符号,例如init和exit.并且不要触摸那些由内核开发软件基础架构生成的内容.然后试错,直到你找到合适的食谱......事实上,我认为除了你自己明确定义为EXPORT_SYMBOL(当然还有init/exit)的那些符号之外,所有符号都可以删除.
祝好运!:)
PS:
实际上,似乎所有.ko项目中都存在所需的源信息以自动执行所需的剥离:除非我遗漏了某些东西,否则理论上可以删除任何不是EXPORT_SYMBOL或由构建软件显式插入的内容在结束.ko构建的"ld -r"时间结束时.我只是觉得工具链(编译器/链接器)没有配置/指令/选项来为可重定位链接/合并单独指定"剥离或保留"syms.否则,EXPORT_SYMBOL宏和其他一些地方的一些修改可能会达到您所追求的结果,并且可以从任何Linux系统中的大多数.ko文件中删除一些字节.
我刚刚构建了一个内核而没有意识到内核配置启用了调试符号,因此生成的模块的大小非常大.这对我有用:
# 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/
Run Code Online (Sandbox Code Playgroud)
查找/lib/modules/3.1.0named中的所有文件*.ko并strip --strip-debug在每个文件上执行.