使用 clang 与 gcc 的弱符号和 dlopen()

Posted

技术标签:

【中文标题】使用 clang 与 gcc 的弱符号和 dlopen()【英文标题】:Weak symbols and dlopen() with clang vs. gcc 【发布时间】:2017-03-02 15:46:31 【问题描述】:

我有一个定义如下内容的库:

    //singleton.hpp
    class Singleton
    
    public:
      static Singleton* getInstance()
      
        static Singleton* mInstance=0;
        if (!mInstance)
        
            mInstance=new Singleton();
        
        return mInstance;
      
    ;

我在构建几个共享对象库时包含了这个头文件。当我使用 gcc (Ubuntu) 构建这些共享对象库时,静态被标记为唯一: (纳米输出)

0000000000045780 u Singleton::mInstance

当我使用 clang 构建共享库时,相同的符号被标记为弱:

0000000000045780 V 单例::mInstance

当我对 gcc 构建的共享对象进行 dlopen(..., RT_NOW) 时,动态链接器会修复所有内容,并且似乎生成了一个 mInstance 符号。但是,当我 dlopen(..., RT_NOW) 使用 clang 构建的共享对象时,我会为每个库获得一个单独的符号,这使得单例不是单例。这是预期的行为吗?有什么方法可以强制动态链接器表现得好像符号被标记为唯一一样,就像它们在 gcc 编译中一样?

【问题讨论】:

【参考方案1】:

看起来像https://llvm.org/bugs/show_bug.cgi?id=22281 但是,它没有标记为已解决,也没有提供解决方法。

【讨论】:

以上是关于使用 clang 与 gcc 的弱符号和 dlopen()的主要内容,如果未能解决你的问题,请参考以下文章

为啥 gcc -O3 处理 avx256 的内在比较与 gcc -O0 和 clang 不同?

mac 使用gcc 为啥编译错误是clang 提示

matlab mex clang C++11线程->未定义符号错误

OS X 上的 LLVM 与 clang

使用 Clang 作为编译器构建 Android 项目时从静态库中隐藏符号

Visual Studio 中的 GCC 样式弱链接?