防止外部调用lib文件内的函数

问题描述 投票:0回答:1

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

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

c static-libraries
1个回答
1
投票

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

不,不可能存在(阅读赖斯定理;静态检测此类非平凡属性是不可判定的)。库或代码可能使用函数指针。恶意用户可以使用函数指针和指针算术来调用某些私有函数(可能是在对代码进行逆向工程之后),即使它是

static

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

或者您可以将您的库组织为单个翻译单元(有点像sqlite正在进行合并),并让所有内部函数为

static
...

一般来说,库应该有关于其内部函数的命名约定(例如,所有函数都带有

_
后缀)。这实际上可能会有帮助(但不能针对恶意用户)。

最重要的是,一个库应该有良好记录(命名约定也被记录),并且认真的用户只会按照记录的方式使用记录的函数才有用。

(所以我认为你不应该关心被调用的内部函数;你确实需要记录可以调用哪些公共函数,以及如何调用、何时调用……;调用其他任何函数的用户应该期待未定义的行为 ,那是非常的事情)

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

我不确定(至少在 Linux 上)提供“静态”库是否明智。我建议提供一个共享库,请阅读 Drepper 的如何编写共享库 并且您无法阻止接收者(假设是恶意的、聪明的且坚定的人)使用内部函数和内部

struct

-s。您应该在文档中阻止它们,并记录好您的公共函数和数据类型。


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

不,那是不可能的。

看起来您正在寻求社会问题的技术解决方案。您需要

信任您的用户

(他们需要信任您),因此您应该记录可以使用哪些函数(您甚至可以在文档中添加一些句子,说明直接使用任何未记录的函数会产生未定义的行为)。你不能做更多的事情。也许(特别是如果您将库作为专有软件出售)您需要律师来撰写一份好的合同。 您可以考虑编写自己的 GCC

plugin

(或 GCC MELT 扩展)来检测此类调用。这可能会花费您数周的时间,而且不值得这么麻烦(并且仍然不完美)。

我无法猜测你的动机和用例(是一些驱动核反应堆、医用药物注射器、自动驾驶车辆、导弹的生命攸关的软件吗?)。请解释一下,如果某些(恶意但聪明的)用户调用内部未记录的函数,

对您来说会发生什么。该用户会发生什么?

© www.soinside.com 2019 - 2024. All rights reserved.