Re: Weak symbols and inline

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2014-02-28 at 08:54 +0100, Marc Glisse wrote:
> > Do you have a reference to the standard on this?
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59894#c1

I found a reference yesterday too, thanks.  It's odd that virtually all
the examples I've found online for replacing global operator new/delete
show using inline.  And, it definitely doesn't fail on any of the
compilers I have access to.  But good to know nonetheless!


On Thu, 2014-02-27 at 21:02 +0000, Jonathan Wakely wrote:
> > The function I'm inlining is actually global operator new.  It's not
> > legal to declare it static or in a namespace.
> 
> You're asking how to violate the One Definition Rule, which isn't
> legal either :-)

Yeah... it wasn't clear to me how the global operator new exception to
the ODR applied (allowing the user to override global operator
new/delete).  I guess I'm allowed to override, but only with one
definition.

Can I move out of the clouds of standards-compliance and into the mud of
implementations? :-).  Speaking specifically about GCC/binutils on
GNU/Linux, although at some point I'll need to address Windows MSVC and
MacOSX Clang/LLVM as well (not here, although I welcome pointers).

I'm creating a shared library from a large existing C++ codebase.  The
interface to the shared library is well-designed using abstract classes
and factories, and correct handling of memory.

In my shared library I want to use an alternate memory manager, and so I
want to override global operator new/delete.

However, I don't want my memory manager to "leak out" into the
executable using the shared library; I want the executable (also written
in C++) to be able to define its own memory management (or get the
system new/delete by default) without impacting my library and vice
versa.


I build all my code with -fvisibility=hidden, then mark the factory
functions as __attribute__((visibility("default"))).  Of course I didn't
mark the global operator new/delete as "default".

However, even though I didn't mark them that way, running nm on the .so
shows them as public symbols ("T").  I'm assuming that these functions
are handled specially so that the visibility=hidden default doesn't
apply to them?  I get a compiler error if I try to force them with
__attribute__.

So then I tried to use inline versions of global new/delete.  If I
further add __attribute__((force_inline)) then it APPEARS to do what I'd
like: none of my objects are exporting global new/delete.

Of course this is a bit hackish, and more concerning it means that if I
forget to include the header with the inline definitions into any of my
translation units then I silently get the wrong ones.


Is there a better supported, more "approved" way to handle this
requirement?

Would the standard-conforming answer be modifying all classes to declare
their own new/delete instead of relying on global new/delete, maybe by
introducing a common base class for everything?  That's just not
feasible for me at the moment: there are thousands of classes,
templates, etc. etc.  I need something less invasive.

Cheers!





[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux