如何阻止变量符号被导出 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 文件? [关闭]

如何找出从共享对象导出的所有符号?

如何阻止 Jetbrains Rider 在 macOS 上的 ALT-9 上打开侧面板

第八章