Andrew
Andrew

Reputation: 646

Weak symbols and dlopen() with clang vs. gcc

I've got a library that defines something like this:

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

I include this header when building a couple of shared object libraries. When I build these shared object libraries with gcc (Ubuntu), the static gets marked as unique: (nm output)

0000000000045780 u Singleton::mInstance

When I build the shared libraries with clang the same symbol gets marked as weak:

0000000000045780 V Singleton::mInstance

When I dlopen(..., RT_NOW) the gcc-built shared objects, the dynamic linker fixes everything up and seems to make a single mInstance symbol. However, when I dlopen(..., RT_NOW) the clang-built shared objects, I get a separate symbol for each library, which makes the singleton not a singleton. Is this expected behavior? Is there some way I can force the dynamic linker to behave as if the symbols were marked as unique, as they are with the gcc compilation?

Upvotes: 4

Views: 992

Answers (1)

Godin
Godin

Reputation: 10564

Looks like https://llvm.org/bugs/show_bug.cgi?id=22281 However it is not marked as resolved and doesn't provide workarounds.

Upvotes: 1

Related Questions