防止外部调用 lib 文件中的函数
Prevent external calls to functions inside lib file
是否有可靠的方法来防止外部代码调用从 C 代码编译的库的内部函数?
我想提供一个带有 API 头文件的静态库。该库有不同的模块,由 .c 和 .h 文件组成。我想阻止接收者使用内部 .h 文件中声明的函数。
这可能吗?
谢谢!
Is there a reliable way to prevent external code from calling inner functions of a lib ?
不,不可能(阅读 Rice's theorem;静态检测此类重要属性是不可判定的)。库或代码可能使用函数指针。恶意用户可以使用函数指针和指针算法来调用一些私有函数(可能在对您的代码进行逆向工程之后),即使它是 static
.
在 Linux 你可能会玩 visibility 把戏。
或者您可以将您的库组织为一个翻译单元(有点像 sqlite is doing its amalgamation)并且所有内部函数都是 static
...
一般来说,库应该有关于其内部功能的命名约定(例如,所有的后缀都带有 _
)。这可能会有实际帮助(但不能针对恶意用户)。
最重要的是,一个库应该很好记录(命名约定也被记录),一个认真的用户只会按照记录的方式使用记录的函数 有用。
(所以我认为您不应该关心被调用的内部函数;您确实需要记录可以调用哪些 public 函数,以及如何以及何时... ; 调用其他任何东西的用户应该期待 undefined behavior, that is very bad 东西)
I would like to deliver a static library with an APIheader file, and would like to prevent the recepients from using the structs I define and the inner functions.
我不确定(至少在 Linux 上)提供 static 库是否明智。我建议提供一个共享库,阅读 Drepper 的 How to Write Shared Libraries.
并且您无法阻止收件人(假设是一个恶意、聪明且坚定的人)使用内部函数和内部 struct
-s。您应该在文档中阻止它们,并记录您的 public 函数和数据类型。
I would like to prevent the recepients from using functions declared in the inner .h files. Is this possible?
不,那是不可能的。
您似乎在寻求社会问题的技术解决方案。你需要信任你的用户(他们也需要信任你),所以你应该记录可以使用哪些功能(你甚至可以添加在您的文档中有一句话说直接使用任何未记录的函数会产生 undefined behavior)。你不能做更多。也许(特别是如果您将图书馆作为专有软件出售)您需要一位律师来写一份好的合同。
您可以考虑编写自己的 GCC plugin (or GCC MELT 扩展)来检测此类调用。这可能会花费您数周的时间,而且不值得这么麻烦(并且会保持不完美)。
我无法猜测您的动机和用例(它是驱动核反应堆、医用药物注射器、自动驾驶汽车、导弹的生命关键软件吗?)。请解释如果某些(恶意但聪明的)用户调用内部未记录的函数,对您会发生什么。那位用户会发生什么事?
是否有可靠的方法来防止外部代码调用从 C 代码编译的库的内部函数?
我想提供一个带有 API 头文件的静态库。该库有不同的模块,由 .c 和 .h 文件组成。我想阻止接收者使用内部 .h 文件中声明的函数。 这可能吗?
谢谢!
Is there a reliable way to prevent external code from calling inner functions of a lib ?
不,不可能(阅读 Rice's theorem;静态检测此类重要属性是不可判定的)。库或代码可能使用函数指针。恶意用户可以使用函数指针和指针算法来调用一些私有函数(可能在对您的代码进行逆向工程之后),即使它是 static
.
在 Linux 你可能会玩 visibility 把戏。
或者您可以将您的库组织为一个翻译单元(有点像 sqlite is doing its amalgamation)并且所有内部函数都是 static
...
一般来说,库应该有关于其内部功能的命名约定(例如,所有的后缀都带有 _
)。这可能会有实际帮助(但不能针对恶意用户)。
最重要的是,一个库应该很好记录(命名约定也被记录),一个认真的用户只会按照记录的方式使用记录的函数 有用。
(所以我认为您不应该关心被调用的内部函数;您确实需要记录可以调用哪些 public 函数,以及如何以及何时... ; 调用其他任何东西的用户应该期待 undefined behavior, that is very bad 东西)
I would like to deliver a static library with an APIheader file, and would like to prevent the recepients from using the structs I define and the inner functions.
我不确定(至少在 Linux 上)提供 static 库是否明智。我建议提供一个共享库,阅读 Drepper 的 How to Write Shared Libraries.
并且您无法阻止收件人(假设是一个恶意、聪明且坚定的人)使用内部函数和内部 struct
-s。您应该在文档中阻止它们,并记录您的 public 函数和数据类型。
I would like to prevent the recepients from using functions declared in the inner .h files. Is this possible?
不,那是不可能的。
您似乎在寻求社会问题的技术解决方案。你需要信任你的用户(他们也需要信任你),所以你应该记录可以使用哪些功能(你甚至可以添加在您的文档中有一句话说直接使用任何未记录的函数会产生 undefined behavior)。你不能做更多。也许(特别是如果您将图书馆作为专有软件出售)您需要一位律师来写一份好的合同。
您可以考虑编写自己的 GCC plugin (or GCC MELT 扩展)来检测此类调用。这可能会花费您数周的时间,而且不值得这么麻烦(并且会保持不完美)。
我无法猜测您的动机和用例(它是驱动核反应堆、医用药物注射器、自动驾驶汽车、导弹的生命关键软件吗?)。请解释如果某些(恶意但聪明的)用户调用内部未记录的函数,对您会发生什么。那位用户会发生什么事?