【问题标题】:How to stop variable symbols from being exported macOS如何阻止变量符号被导出 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 添加了我的答案

标签: c++ xcode macos unix


【解决方案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,项目目标 -> 构建阶段 -> 编译源 -> 编译器标志
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多