MdePkg: move to 'hidden' visibility for all symbols under GCC/X64
authorArd Biesheuvel <>
Mon, 1 Aug 2016 06:48:02 +0000 (08:48 +0200)
committerArd Biesheuvel <>
Tue, 2 Aug 2016 06:20:08 +0000 (08:20 +0200)
When using GCC to build for X64, we switched to the position independent
small code model, which is much more efficient in terms of code generation
and runtime relocation footprint, and produces binaries that can execute
correctly from any offset.

However, the PIC routines are by default geared towards hosted binaries
containing symbol references that may resolve to definitions in other
dynamic objects, and for this reason, most symbol references are indirected
via a GOT entry (which also results in a .reloc fixup entry) unless we
annotate them.

For this reason, we introduced the 'protected' visibility annotation for
all symbol definitions and references, by setting the GCC visibility
pragma. However, as it turns out, this is not sufficient for all versions
of GCC, and in some cases (GCC 5.x using the GCC49 toolchain tag), may
still result in GOT based relocations.

So switch to 'hidden' visibility instead, which is slightly stronger, and
fixes this issue for the versions of GCC that exhibit the problem.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <>
Reviewed-by: Liming Gao <>

index a4aad3e524e8e52497be50b2bc1d277368687206..666cc8e8bd165c3eb35ad82783fd6a41932ac36d 100644 (file)
 #if defined(__GNUC__) && defined(__pic__)\r
-// Mark all symbol declarations and references as protected, meaning they will\r
+// Mark all symbol declarations and references as hidden, meaning they will\r
 // not be subject to symbol preemption. This allows the compiler to refer to\r
 // symbols directly using relative references rather than via the GOT, which\r
 // contains absolute symbol addresses that are subject to runtime relocation.\r
-#pragma GCC visibility push (protected)\r
+#pragma GCC visibility push (hidden)\r
 #if defined(__INTEL_COMPILER)\r