在C语言中隐藏函数

9

我有一个应用程序,其中有一个函数f1 void f1 ()

此外,我使用LD_PRELOAD加载一个库。

该库有几个代码文件和几个头文件,并编译为.so文件。

其中一个头文件还使用了一个名为f1的函数,具有与上述相同的签名。 最新的f1仅在库中使用。(我无法将其更改为静态方法)

问题是当我加载库(使用LD_PRELOAD)时,库中的f1会覆盖应用程序的f1

是否有一种方法可以配置库中的f1仅对库可见?


2
你为什么不能只重命名一个函数声明呢?我猜这是在一个现有的代码库中,这可能就是你不能这样做的原因。 - Bojangles
2个回答

6

如果您可以修改头文件,可以将函数设置为static,以使其仅在该编译单元中可见,或使用__attribute__ ((visibility ("hidden")))(仅适用于GCC)标记它以使其仅在该库中可见:

__attribute__ ((visibility ("hidden"))) void f1();

__attribute__ ((visibility ("hidden"))) 是一个宏,它替换了静态关键字吗?或者它是如何工作的? - Grijesh Chauhan
1
@GrijeshChauhan:不,该属性标记符号具有隐藏可见性。它仅在共享库内部可见(有点像Win32 DLLEXPORT的相反)。隐藏可见性属性被传递给链接器并被其理解(与static相反,后者使符号基本上对链接器不可见)。 - nneonneo

3

您也可以使用 -fvisibility = hidden 编译库,并对需要可见的几个函数显式使用__attribute__ ((visibility ("default")))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接