【发布时间】:2013-12-19 05:31:03
【问题描述】:
我正在尝试提供对链接到静态库中的可执行文件的函数的访问。原始静态库定义了没有访问说明符的符号,并且我能够使用定义的方法here 访问该函数,该方法使用 MSVC 可以正常工作,因为链接中的符号默认隐藏。
但是,在使用 GCC 时,我需要在使用 -Wl,--exclude-libs,ALL 时导出函数,这样可以防止所有其他不必要的符号从链接的静态库中明显导出。有问题的符号未从主应用程序本身引用,但是第三方模块可能会尝试在外部动态使用该符号(ffi 等),因此使用 FORCE_UNDEFINED_SYMBOL。
我需要导出的唯一符号是那些从主应用程序中标记为默认可见性的符号,以及从静态库中导入的某些函数(我可能无法修改)。我知道可以使用包装函数,但是我想知道是否还有其他方法。
那么,是否可以从链接的静态库中导出符号(可见),同时使用 -WL、--exclude-libs、ALL,而不使用任何其他(版本列表等)文件,或命令/标志? (并且不修改静态库)
使用以下宏(部分)有效,但原始函数符号仍为 .hidden(将 __MyFunction_fp 导出为可见)。
#define APIEXPORT __attribute__ ((visibility ("default")))
#define FORCE_UNDEFINED_SYMBOL(x) extern APIEXPORT void x(void); APIEXPORT void* __ ## x ## _fp =(void*)&x;
FORCE_UNDEFINED_SYMBOL(MyFunction)
在这种情况下,MyFunction 的实际定义/声明将存在于静态库中,并且无法更改。
编辑:我发现上面的宏 FORCE_UNDEFINED_SYMBOL 在 MSVC 下不会产生所需的符号可见性。似乎唯一可行的解决方案是使用 pragma cmets,即 __pragma(comment (linker, "/export:" #x))。也许 gcc/ld 存在类似的解决方案。
【问题讨论】:
标签: c gcc static-libraries visibility