mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-15 14:34:38 +00:00
69 lines
2.5 KiB
Plaintext
69 lines
2.5 KiB
Plaintext
|
PLEASE READ ALL OF THIS FILE, ESPECIALLY IF YOU ARE DEFINING A NEW
|
||
|
PUBLIC HEADER IN LIBABIGAIL.
|
||
|
|
||
|
How symbols that are exported are controlled in libabigail
|
||
|
==========================================================
|
||
|
|
||
|
We try to limit the number of ELF symbols that are exported by the
|
||
|
libabigail.so shared library. We call this symbols visibility
|
||
|
control.
|
||
|
|
||
|
As GNU/Linux is our development platform, we control symbol visibility
|
||
|
by using the visibility support of the G++ compiler.
|
||
|
|
||
|
How to do so is properly explained at https://gcc.gnu.org/wiki/Visibility.
|
||
|
|
||
|
All symbols are hidden by default
|
||
|
=================================
|
||
|
|
||
|
When building translation units that make up the libabigail.so shared
|
||
|
library, G++ is invoked with the -fvisibility=hidden directive. Which
|
||
|
instructs it to make symbols of functions and global variables
|
||
|
*locally* defined in the shared library, *NOT* exported (or global).
|
||
|
|
||
|
Exporting symbols of entities declared in public headers
|
||
|
========================================================
|
||
|
|
||
|
In a translation unit that is part of the libabigail.so shared
|
||
|
library, before including a header file that is a public libabigail
|
||
|
header (e.g, abg-ir.h), one need to declare:
|
||
|
|
||
|
#include "abg-internal.h"
|
||
|
ABG_BEGIN_EXPORT_DECLARATIONS
|
||
|
|
||
|
then all the public header files inclusion (using #include directives)
|
||
|
follow. At the end of these public header files inclusion, one need
|
||
|
to declare:
|
||
|
|
||
|
ABG_END_EXPORT_DECLARATIONS
|
||
|
|
||
|
|
||
|
The ABG_BEGIN_EXPORT_DECLARATIONS is a macro defined in abg-internal.h
|
||
|
which expands to:
|
||
|
|
||
|
#pragma GCC visibility push(default)
|
||
|
|
||
|
This instructs G++ to export the symbol of all global functions and
|
||
|
variables definitions that are declared from that point on.
|
||
|
|
||
|
The ABG_END_EXPORT_DECLARATIONS is a macro defined in abg-internal.h
|
||
|
which expands to:
|
||
|
|
||
|
#pragma GCC visibility pop
|
||
|
|
||
|
It instructs G++ to stop exporting symbols of global functions and
|
||
|
variable definition from that point on.
|
||
|
|
||
|
In practice, the pair ABG_BEGIN_EXPORT_DECLARATIONS,
|
||
|
ABG_END_EXPORT_DECLARATIONS allows us to only export symbols of
|
||
|
global functions and variables declared in the block denoted by these
|
||
|
two macros. Symbols of anything else that is declared outside of that block
|
||
|
are going to be hidden, thanks to the -fvisibility=hidden option
|
||
|
passed to G++.
|
||
|
|
||
|
So whenever you are defining a new header file with declarations that
|
||
|
ought to be part of the API of libabigail, the *definition* file which
|
||
|
defines the declarations of the header file must use
|
||
|
the ABG_BEGIN_EXPORT_DECLARATIONS and ABG_END_EXPORT_DECLARATIONS
|
||
|
macro to include the public header.
|