我有点惊讶Linux内核的模块是如此“脆弱”,需要经常重新编译。在两台不同的机器上使用相同的源树(例如,不同版本的gcc)会生成不与内核一起使用的模块(机器A)(机器B)。
如果我不想要臭名昭着的no symbol version for module_layout
错误消息,添加虚拟系统调用显然也需要重新编译。
更令我惊讶的是,在kernel /中添加了一个纯粹的.c文件,它不会触及任何ABI(即一个独立的函数,不会导出,使用或更新任何内部结构)。
在新的.c文件中添加虚拟文本字符串,让所有模块都不受影响。
那么规则和理由到底是什么? (我专注于x86,32位架构,如果重要的话)
答案 0 :(得分:1)
您似乎过分关注重建内核和(可加载)模块的编译方面,而忽略了链接。我怀疑当你声明需要“重新编译”时,你可能会夸大其词。
令我更惊讶的是,在kernel /中添加了一个纯粹的.c文件,它不会触及任何ABI(即一个独立的函数,不会导出,使用或更新任何内部结构)
将 .c 文件(也称为源模块)添加到内核时,新编译的目标文件将需要使用链接器构建新的内核映像。由于没有评估哪些全局内核符号移动或未移动,因此必须使用新符号映射重建所有(可加载的)模块(实际上仅重新链接)。不需要对所有内核模块进行“重新编译”;只需使用新的内核符号映射将 .o 目标文件重建为可加载模块。
确保(可加载的)模块正在执行其匹配的内核&加载内核模块时验证符号映射,版本控制和构建信息。您所谓的“脆弱”实际上是一种安全措施,用于确保在特权模式下执行的代码的完整性。