[Ns-developers] GCC 4 -fvisibility=hidden

Gustavo Carneiro gjcarneiro at gmail.com
Sun Jan 25 11:51:07 PST 2009


2009/1/25 Mathieu Lacage <mathieu.lacage at sophia.inria.fr>

> On Sun, 2009-01-25 at 19:29 +0000, Gustavo Carneiro wrote:
>
> >         1) a large fraction of performance-sensitive code is also
> >         'public' so
> >         you can't mark it 'hidden' so, you lose all the performance
> >         gain of this
> >         marking (there are 3 big items: the packet.h, simulator.h and
> >         object.h
> >         code).
> >
> > IIRC, I think what GTK+ and friends are doing these days is actually
> > maintain a duplicate set of symbols.  For each API function, it is
> > declared as both a hidden and public, and Gtk+ itself ends up calling
> > only the hidden symbols, bypassing the GOT indirection, although a
> > public version of the function symbol is also exported.
>
> It's been a while since I did not look at this, so how do they do it ?
>

They generate gtkalias.h and gtkaliasdef.c from gtk.symbols.

gtk.symbols contains:
[...]
gtk_window_unfullscreen
[...]

gtkalias.h contains:
[...]
extern __typeof (gtk_window_unfullscreen) IA__gtk_window_unfullscreen
__attribute((visibility("hidden")));
#define gtk_window_unfullscreen IA__gtk_window_unfullscreen
[...]

gtkaliasdef.c contains:
[...]
#undef gtk_window_unfullscreen
extern __typeof (gtk_window_unfullscreen) gtk_window_unfullscreen
__attribute((alias("IA__gtk_window_unfullscreen"), visibility("default")));
[...]

gtkwindow.c contains:
[...]
#include "gtkalias.h"
[...]
void
gtk_window_unfullscreen (GtkWindow *window)
{
[...]

The gtk_window_unfullscreen definition in gtkwindow.c expands (because of a
#define) to IA__gtk_window_unfullscreen, which was previously declared with
hidden visibility.  gtkaliasdef.c provides an alias symbol to
IA__gtk_window_unfullscreen called gtk_window_unfullscreen with public
visibility.  But internally gtk+'s own code only ends up calling the
functions with private visibility and no GOT lookups.

-- 
Gustavo J. A. M. Carneiro
INESC Porto, Telecommunications and Multimedia Unit
"The universe is always one step beyond logic." -- Frank Herbert


More information about the Ns-developers mailing list