防止对lib文件中的函数进行外部调用

时间:2017-10-17 17:21:55

标签: c lib

是否有一种可靠的方法来阻止外部代码调用从C代码编译的lib的内部函数?

我想提供一个带有API头文件的静态库。该库有不同的模块,包括.c和.h文件。我想阻止接收者使用内部.h文件中声明的函数。 这可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

是否有可靠的方法来阻止外部代码调用lib的内部函数?

不,不可能(阅读Rice's theorem;静态检测这些非平凡的属性是不可判定的)。库或代码可能使用函数指针。恶意用户可以使用函数指针和指针算法来调用某些私有函数(可能在对代码进行反向工程之后),即使它是static

在Linux上,您可以使用visibility技巧。

或者您可以将您的图书馆整理为一个翻译单元(有点像sqlite正在执行其amalgamation)并且所有内部函数都是static ...

通常,库应该具有关于其内部函数的命名约定(例如,后缀全部为_)。这可能实际上有用(但不是针对恶意用户)。

最重要的是,一个库应该记录(还会记录命名约定),严肃的用户只会使用记录的函数。记录是有用的。

(所以我认为你不应该关心被调用的内部函数;你需要记录可以调用哪些公共函数,以及如何以及何时...;用户调用其他任何东西都应该期待undefined behavior,非常bad件事

  

我想提供一个带有APIheader文件的静态库,并希望阻止接收者使用我定义的结构和内部函数。

我不确定(至少在Linux上)提供静态库是明智的。我建议提供一个共享库,阅读Drepper的How to Write Shared Libraries

并且你不能阻止收件人(假设一个恶意,聪明和坚定的人)使用内部函数和内部struct - s。您应该在文档中阻止它们,并且很好地记录您的公共函数和数据类型。

  

我想阻止接收者使用内部.h文件中声明的函数。这可能吗?

不,那是不可能的。

看起来您正在寻求社会问题的技术解决方案。您需要信任您的用户(并且他们需要信任您),因此您应该记录可以使用哪些功能(您甚至可以在文档中添加一些句子说直接使用任何未记录的函数会产生undefined behavior)。你做不了多少。也许(特别是如果你将图书馆作为专有软件出售),你需要律师写一份好合同。

您可以考虑编写自己的GCC plugin(或GCC MELT扩展程序)来检测此类调用。这可能需要你几个星期的工作,并不值得的麻烦(并将保持不完美)。

我无法猜测你的动机和用例(它是一些生命关键的软件驱动核反应堆,医疗药物注射器,自主车辆,导弹?)。如果某些(恶意但聪明的)用户调用内部未记录的函数,请解释给您发生什么。那个用户可能会发生什么?