]> git.proxmox.com Git - mirror_edk2.git/commit
BaseTools GCC: avoid the use of COMMON symbols
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 8 Dec 2015 07:40:12 +0000 (07:40 +0000)
committerabiesheuvel <abiesheuvel@Edk2>
Tue, 8 Dec 2015 07:40:12 +0000 (07:40 +0000)
commit214a3b79417f64bf2faae74af42c1b9d23f50dc8
tree4f16fc7653d14678e4ac0df35cae8ffe30b2b850
parent7945b29c51f35e5fd8a6434bb6adde3cdb2d8b1c
BaseTools GCC: avoid the use of COMMON symbols

The default behavior of the GCC compiler is to emit uninitialized globals
with external linkage into a COMMON section, where duplicate definitions
are merged. This may result in unexpected behavior, since global variables
defined under the same name in different C files may not refer to the same
logical data item.

For instance, the definitions of EFI_EVENT mVirtualAddressChangeEvent that
[used to] appear in the following files:

  CryptoPkg/Library/BaseCryptLib/SysCall/RuntimeMemAllocation.c
  MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c

will be folded into a single instance of the variable when the latter
module includes the former library, which can lead to unexpected results.

Even if some may argue that there are legal uses for COMMON allocation, the
high modularity of EDK2 combined with the low level of awareness of the
intracicies surrounding common allocation and the generally poor EDK2
developer discipline regarding the use of the STATIC keyword* make a strong
case for disabling it by default, and re-enabling it explicitly for packages
that depend on it.

So prevent GCC from emitting variables into the COMMON section, by passing
-fno-common to the compiler, and discarding the section in the GNU ld linker
script.

* Any function or variable that is only referenced from the translation unit
  that defines it could be made STATIC. This does not only prevent issues
  like the above, it also allows the compiler to generate better code, e.g.,
  drop out of line function definitions after inlining all invocations or
  perform constant propagation on variables.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19164 6f19259b-4bc3-4df7-8a09-765794883524
BaseTools/Conf/tools_def.template
BaseTools/Scripts/GccBase.lds