我有一个应用程序,其中有一个函数f1 void f1 ()
此外,我使用LD_PRELOAD
加载一个库。
该库有几个代码文件和几个头文件,并编译为.so文件。
其中一个头文件还使用了一个名为f1
的函数,具有与上述相同的签名。
最新的f1
仅在库中使用。(我无法将其更改为静态方法)
问题是当我加载库(使用LD_PRELOAD
)时,库中的f1
会覆盖应用程序的f1
。
是否有一种方法可以配置库中的f1
仅对库可见?
我有一个应用程序,其中有一个函数f1 void f1 ()
此外,我使用LD_PRELOAD
加载一个库。
该库有几个代码文件和几个头文件,并编译为.so文件。
其中一个头文件还使用了一个名为f1
的函数,具有与上述相同的签名。
最新的f1
仅在库中使用。(我无法将其更改为静态方法)
问题是当我加载库(使用LD_PRELOAD
)时,库中的f1
会覆盖应用程序的f1
。
是否有一种方法可以配置库中的f1
仅对库可见?
如果您可以修改头文件,可以将函数设置为static
,以使其仅在该编译单元中可见,或使用__attribute__ ((visibility ("hidden")))
(仅适用于GCC)标记它以使其仅在该库中可见:
__attribute__ ((visibility ("hidden"))) void f1();
__attribute__ ((visibility ("hidden")))
是一个宏,它替换了静态关键字吗?或者它是如何工作的? - Grijesh ChauhanDLLEXPORT
的相反)。隐藏可见性属性被传递给链接器并被其理解(与static
相反,后者使符号基本上对链接器不可见)。 - nneonneo您也可以使用 -fvisibility = hidden 编译库,并对需要可见的几个函数显式使用__attribute__ ((visibility ("default")))
。