是否有可靠的方法来防止外部代码调用从 C 代码编译的库的内部函数?
我想提供一个带有 API 头文件的静态库。该库具有不同的模块,由 .c 和 .h 文件组成。我想阻止收件人使用内部 .h 文件中声明的函数。 这可能吗?
是否有可靠的方法来防止外部代码调用库的内部函数?
不,不可能存在(阅读赖斯定理;静态检测此类非平凡属性是不可判定的)。库或代码可能使用函数指针。恶意用户可以使用函数指针和指针算术来调用某些私有函数(可能是在对代码进行逆向工程之后),即使它是
static
。
在 Linux 上,您可能会使用 visibility 技巧。
或者您可以将您的库组织为单个翻译单元(有点像sqlite正在进行合并),并让所有内部函数为
static
...
一般来说,库应该有关于其内部函数的命名约定(例如,所有函数都带有
_
后缀)。这实际上可能会有帮助(但不能针对恶意用户)。
最重要的是,一个库应该有良好记录(命名约定也被记录),并且认真的用户只会按照记录的方式使用记录的函数才有用。
(所以我认为你不应该关心被调用的内部函数;你确实需要记录可以调用哪些公共函数,以及如何调用、何时调用……;调用其他任何函数的用户应该期待未定义的行为 ,那是非常坏的事情)
我想提供一个带有API头文件的静态库,并希望防止接收者使用我定义的结构和内部函数。
我不确定(至少在 Linux 上)提供“静态”库是否明智。我建议提供一个共享库,请阅读 Drepper 的如何编写共享库。 并且您无法阻止接收者(假设是恶意的、聪明的且坚定的人)使用内部函数和内部
struct
-s。您应该在文档中阻止它们,并记录好您的公共函数和数据类型。
我想阻止接收者使用内部 .h 文件中声明的函数。这可能吗?
不,那是不可能的。
看起来您正在寻求社会问题的技术解决方案。您需要
信任您的用户(他们需要信任您),因此您应该记录可以使用哪些函数(您甚至可以在文档中添加一些句子,说明直接使用任何未记录的函数会产生未定义的行为)。你不能做更多的事情。也许(特别是如果您将库作为专有软件出售)您需要律师来撰写一份好的合同。 您可以考虑编写自己的 GCC
plugin(或 GCC MELT 扩展)来检测此类调用。这可能会花费您数周的时间,而且不值得这么麻烦(并且仍然不完美)。
我无法猜测你的动机和用例(是一些驱动核反应堆、医用药物注射器、自动驾驶车辆、导弹的生命攸关的软件吗?)。请解释一下,如果某些(恶意但聪明的)用户调用内部未记录的函数,对您来说会发生什么。该用户会发生什么?