7

我在 Ada 中编写了一些内核模块,但遇到了一些问题。许可证被定义为 ac 宏,我无法弄清楚它实际上是什么。如果 c 和 ada 模块都具有 GPL 兼容许可证,那么简单地让一些 c 重新导出所有需要 GPL 的 c 函数是一个合适的解决方案吗?有一个更好的方法吗?

4

4 回答 4

6

我不确定这个问题是否是个玩笑,但如果你真的想在 Ada 中编写内核模块,那么我无法想象与你必须拥有的其他一切相比,设置模块许可证是一个很大的障碍打。

在任何情况下,模块许可证只是 .ko 文件的 .modinfo 部分中的“license=GPL”之类的字符串。在 C 代码中,它是由 from 的__MODULE_INFO()宏构建的<linux/moduleparam.h>,它只是创建一个数组,该数组char设置为上面的字符串,标记为__attribute__((section(".modinfo")))

我猜想在 Ada 中可能有一些类似的方法可以做到这一点;如果没有,在最坏的情况下,应该可以使用链接描述文件。大概,无论如何,您已经有某种处理方法,可以设置 .modinfo 部分的“vermagic=XXX”部分。

于 2012-08-13T09:35:29.013 回答
6

处理 C 宏是一个皇家 PITA。我有一个梦想,有一天 C 程序员会帮世界其他人一个忙并停止使用它们。

如果是我,我会运行宏来查看它输出的内容,然后编写一些 Ada 代码来输出等价的内容。

通过阅读 Roland 的回答,在我看来,可能需要实现定义的编译指示 linker_section 。

pragma Linker_Section ( [Entity =>] LOCAL_NAME, [Section =>] static_string_EXPRESSION);

LOCAL_NAME 必须引用在库级别声明的对象。此编译指示指定给定实体的链接器部分的名称。它等效__attribute__((section))于 GNU C 并导致 LOCAL_NAME 放置在可执行文件的 static_string_EXPRESSION 部分(假设链接器不重命名该部分)。

于 2012-08-13T14:38:22.583 回答
3

作为回避问题的一种方法,您能否将许可证部分保留在 C 中并使用附件 B(与其他语言的接口)功能来访问它?

这至少应该包含问题,并允许您继续使用其他模块。

充其量它可能允许您在 Ada 中检查许可证的外观并以这种方式对其进行逆向工程。

于 2012-08-14T08:20:34.343 回答
2

由于您可能正在使用 GNAT,因此您可以使用pragma License “允许针对标准和修改后的 GPL 自动检查适当的许可条件”。

于 2012-08-13T11:04:48.523 回答