如何阻止变量符号被导出 macOS
Posted
技术标签:
【中文标题】如何阻止变量符号被导出 macOS【英文标题】:How to stop variable symbols from being exported macOS 【发布时间】: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 添加了我的答案
【参考方案1】:
使用 -fvisibility=hidden 隐藏符号
导出
dylib 的代码:
#define EXPORT extern "C" __attribute__((visibility("default")))
EXPORT char exported_var[2] = 'a', '\0' ;
EXPORT void dylib_quit()
...
EXPORT void dylib_main()
...
char hidden_var1[2] = 'b', '\0' ;
char hidden_var2[2] = 'b', '\0' ;
【讨论】:
您具体在哪里指定-fvisibility=hidden
?在众多 Xcode 设置之一中?
@Codo 使用 XCode,项目目标 -> 构建阶段 -> 编译源 -> 编译器标志以上是关于如何阻止变量符号被导出 macOS的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Maple 中的符号变量导出到文本文件(Matlab 格式)?
如何在 MacOS 上设置环境变量? zsh:没有这样的文件或目录
如何阻止 MacOS 更新覆盖我的 auto_master 文件? [关闭]