Good fix. How do you find this issue? Reviewed-by: Liming Gao <[email protected]>
-----Original Message----- From: Ard Biesheuvel [mailto:[email protected]] Sent: Thursday, December 03, 2015 8:54 PM To: [email protected]; Justen, Jordan L; Gao, Liming; Zhu, Yonghong Cc: Ard Biesheuvel Subject: [PATCH] BaseTools GCC: avoid the use of COMMON symbols The default behavior of the GCC compiler is to emit uninitialized globals into a COMMON section, where duplicate definitions are merged. This may result in unexpected behavior, since global variables appearing by the same name in different C files typically do not refer to the same conceptual data item. For instance, the definitions of EFI_EVENT mVirtualAddressChangeEvent in that 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. So prevent GCC from emitting variables into the COMMON section, by passing -fno-common to the compiler, and discarding the COMMON section in the GNU ld linker script. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <[email protected]> --- NOTE: this patch will result in build failures until we fix the code to make at least some instances of mVirtualAddressChangeEvent STATIC BaseTools/Conf/tools_def.template | 2 +- BaseTools/Scripts/GccBase.lds | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 564d1336650c..2216e747c02d 100644 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -4318,7 +4318,7 @@ NOOPT_DDK3790xASL_IPF_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /LTCG /DLL /OPT:REF DEBUG_*_*_OBJCOPY_ADDDEBUGFLAG = --add-gnu-debuglink=$(DEBUG_DIR)/$(MODULE_NAME).debug RELEASE_*_*_OBJCOPY_ADDDEBUGFLAG = -DEFINE GCC_ALL_CC_FLAGS = -g -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -c -include AutoGen.h +DEFINE GCC_ALL_CC_FLAGS = -g -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -c -include AutoGen.h -fno-common DEFINE GCC_IA32_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -m32 -malign-double -freorder-blocks -freorder-blocks-and-partition -O2 -mno-stack-arg-probe DEFINE GCC_X64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mno-red-zone -Wno-address -mno-stack-arg-probe DEFINE GCC_IPF_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency diff --git a/BaseTools/Scripts/GccBase.lds b/BaseTools/Scripts/GccBase.lds index 4ee6d998532c..32310bc75dcc 100644 --- a/BaseTools/Scripts/GccBase.lds +++ b/BaseTools/Scripts/GccBase.lds @@ -46,7 +46,7 @@ SECTIONS { */ .data ALIGN(ALIGNOF(.text)) : ALIGN(CONSTANT(COMMONPAGESIZE)) { *(.data .data.* .gnu.linkonce.d.*) - *(.bss .bss.* *COM*) + *(.bss .bss.*) } .eh_frame ALIGN(CONSTANT(COMMONPAGESIZE)) : { @@ -66,5 +66,6 @@ SECTIONS { *(.dynamic) *(.hash) *(.comment) + *(COMMON) } } -- 1.9.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

