【发布时间】:2021-12-08 19:22:02
【问题描述】:
所以我的主程序使用 dlsym 从 dylib 中查找 2 个函数和一个变量的符号,并且我有一个不想导出的变量。
我的问题是,无论我是否将extern "C" 用于变量dlsym,如果我从dlsym 在程序,但无论如何它总能找到变量。
dylib 的代码:
export "C" char exported_var[2] = { 'a', '\0' };
extern "C" void dylib_quit()
{
...
}
extern "C" void dylib_main()
{
...
}
char hidden_var1[2] = { 'b', '\0' }; // dlsym will still find this
char hidden_var2[2] = { 'b', '\0' }; // dlsym will still find this
程序代码:
// I want to find all these and I can
dylib_main_fn m_main_fn = (dylib_main_fn)dlsym(handle, "dylib_main");
dylib_quit_fn m_quit_fn = (dylib_quit_fn)dlsym(handle, "dylib_quit");
const char* exported_var = (const char*)dlsym(m_handle, "exported_var");
// And when I do this it will find the "hidden_var1" variable which I don't want happening
// same with "hidden_var2"
const char* hidden_var1 = (const char*)dlsym(m_handle, "hidden_var1");
那么我怎样才能隐藏变量呢?
我在 MacOS 10.14.6 上使用 Xcode 11.3.1。
【问题讨论】:
-
extern "C"不控制是否导出函数和变量。无论如何,它们都会被导出。它只是控制符号是使用 C 名称还是 C++ 名称。后者包括类型信息(也称为 C++ 名称修饰)。 -
另见Dynamic Library Design Guidelines,特别是符号导出策略部分。这是旧文档,但可能仍然有效。
-
@Codo 啊谢谢,我看看,我看的东西给人的印象是
extern "C"是用来导出符号的 -
修复它,必须使用
extern "C"和可见性属性 -
@Codo 添加了我的答案