我在Ada中编写了一些内核模块,我遇到了一些问题。许可证定义为c宏,我无法弄清楚它实际是什么。如果c和ada模块都具有GPL兼容许可证,是否只需要重新导出所有需要GPL的c函数?有更好的方法吗?
答案 0 :(得分:6)
处理C宏是皇家PITA。我梦想有一天C程序员会帮助世界其他地方一个忙,并放弃使用它们。
如果是我,我会运行宏来查看输出的内容,然后编写一些Ada代码来输出等效值。
从阅读Roland的回答中,我认为可能需要实现定义的pragma linker_section。
pragma Linker_Section([Entity =>] LOCAL_NAME,[Section =>] static_string_EXPRESSION);
LOCAL_NAME必须引用在库中声明的对象 水平。该pragma指定了链接器部分的名称 给定实体。它相当于GNU C中的
__attribute__((section))
并导致LOCAL_NAME被放置在static_string_EXPRESSION中 可执行文件的一部分(假设链接器没有重命名 部分)。
答案 1 :(得分:5)
我不确定这个问题是不是开玩笑,但是如果你真的想在Ada中编写内核模块,那么我无法想象设置模块许可证与其他一切相比都是一个障碍你一定是打了。
在任何情况下,模块许可证只是.ko文件的.modinfo部分中的“license = GPL”字符串。在C代码中,它由__MODULE_INFO()
中的<linux/moduleparam.h>
宏构建,它只创建一个char
数组,该数组设置为上面的字符串,标记为__attribute__((section(".modinfo")))
。< / p>
我猜想在Ada中可能会有类似的方法;如果不是,在最坏的情况下,应该可以使用链接描述文件。据推测,无论如何,你已经有了一些处理方法,设置.modinfo部分的“vermagic = XXX”部分。
答案 2 :(得分:3)
作为回避问题的方法,您是否可以将许可证部分保留在C中并使用Annex B(与其他语言接口)功能来访问它?
这应该至少包含问题,并允许您继续使用其他模块。
充其量它可能允许您在Ada中检查许可证的样子并以这种方式对其进行逆向工程。
答案 3 :(得分:1)
由于您可能正在使用GNAT,因此您可以使用pragma License“来自动检查标准和修改后的GPL的相应许可条件。”