]> code.ossystems Code Review - openembedded-core.git/commitdiff
ovmf: Improve reproducibility by enabling prefix mapping
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Sun, 9 May 2021 15:53:07 +0000 (16:53 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Tue, 11 May 2021 10:53:23 +0000 (11:53 +0100)
We want to pass ${DEBUG_PREFIX_MAP} to gcc commands and also pass in
--debug-prefix-map to nasm (we carry a patch to nasm for this). The
tools definitions are built by ovmf-native so we need to pass this in
at target build time when we know the right values.

By using determininistc file paths in the ovmf build, it removes the
opportunitity for gcc/ld to change the output binaries due to path
lengths overflowing section sizes and causing small changes in the
binary output.

This also means that if builds have reproducibility issues in future, it
becomes much easier to compare intermediate build artefacts.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-core/ovmf/ovmf/debug_prefix_map.patch [new file with mode: 0644]
meta/recipes-core/ovmf/ovmf_git.bb

diff --git a/meta/recipes-core/ovmf/ovmf/debug_prefix_map.patch b/meta/recipes-core/ovmf/ovmf/debug_prefix_map.patch
new file mode 100644 (file)
index 0000000..0165fae
--- /dev/null
@@ -0,0 +1,93 @@
+We want to pass ${DEBUG_PREFIX_MAP} to gcc commands and also pass in
+ --debug-prefix-map to nasm (we carry a patch to nasm for this). The
+tools definitions file is built by ovmf-native so we need to pass this in
+at target build time when we know the right values so we use the environment.
+
+By using determininistc file paths during the ovmf build, it removes the 
+opportunitity for gcc/ld to change the output binaries due to path lengths 
+overflowing section sizes and causing small changes in the binary output. 
+Previously we relied on the stripped output being the same which isn't always
+the case if the size of the debug symbols varies.
+
+Upstream-Status: Pending [gcc parts may be upstreamable, nasm patch isn't upstream yet]
+Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
+
+
+Index: git/BaseTools/Conf/tools_def.template
+===================================================================
+--- git.orig/BaseTools/Conf/tools_def.template
++++ git/BaseTools/Conf/tools_def.template
+@@ -1918,7 +1918,7 @@ NOOPT_*_*_OBJCOPY_ADDDEBUGFLAG     = --a
+ *_*_*_DTCPP_PATH                   = DEF(DTCPP_BIN)\r
+ *_*_*_DTC_PATH                     = DEF(DTC_BIN)\r
\r
+-DEFINE GCC_ALL_CC_FLAGS            = -g -Os -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common\r
++DEFINE GCC_ALL_CC_FLAGS            = -g -Os -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common ENV(GCC_PREFIX_MAP)\r
+ DEFINE GCC_IA32_CC_FLAGS           = DEF(GCC_ALL_CC_FLAGS) -m32 -malign-double -freorder-blocks -freorder-blocks-and-partition -O2 -mno-stack-arg-probe\r
+ DEFINE GCC_X64_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mno-red-zone -Wno-address -mno-stack-arg-probe\r
+ DEFINE GCC_ARM_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -mabi=aapcs -fno-short-enums -funsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address -mthumb -mfloat-abi=soft -fno-pic -fno-pie\r
+@@ -1936,8 +1936,8 @@ DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = -fu
+ DEFINE GCC_ARM_ASLDLINK_FLAGS      = DEF(GCC_ARM_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)\r
+ DEFINE GCC_AARCH64_ASLDLINK_FLAGS  = DEF(GCC_AARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS)\r
+ DEFINE GCC_IA32_X64_DLINK_FLAGS    = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map\r
+-DEFINE GCC_ASM_FLAGS               = -c -x assembler -imacros AutoGen.h\r
+-DEFINE GCC_PP_FLAGS                = -E -x assembler-with-cpp -include AutoGen.h\r
++DEFINE GCC_ASM_FLAGS               = -c -x assembler -imacros AutoGen.h ENV(GCC_PREFIX_MAP)\r
++DEFINE GCC_PP_FLAGS                = -E -x assembler-with-cpp -include AutoGen.h ENV(GCC_PREFIX_MAP)\r
+ DEFINE GCC_VFRPP_FLAGS             = -x c -E -P -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h\r
+ DEFINE GCC_ASLPP_FLAGS             = -x c -E -include AutoGen.h\r
+ DEFINE GCC_ASLCC_FLAGS             = -x c\r
+@@ -2082,7 +2082,7 @@ DEFINE GCC_PP_FLAGS
+ *_GCC48_IA32_DLINK2_FLAGS         = DEF(GCC48_IA32_DLINK2_FLAGS)\r
+ *_GCC48_IA32_RC_FLAGS             = DEF(GCC_IA32_RC_FLAGS)\r
+ *_GCC48_IA32_OBJCOPY_FLAGS        =\r
+-*_GCC48_IA32_NASM_FLAGS           = -f elf32\r
++*_GCC48_IA32_NASM_FLAGS           = -f elf32 ENV(NASM_PREFIX_MAP)\r
\r
+   DEBUG_GCC48_IA32_CC_FLAGS       = DEF(GCC48_IA32_CC_FLAGS) -Os\r
+ RELEASE_GCC48_IA32_CC_FLAGS       = DEF(GCC48_IA32_CC_FLAGS) -Os -Wno-unused-but-set-variable\r
+@@ -2110,7 +2110,7 @@ RELEASE_GCC48_IA32_CC_FLAGS       = DEF(
+ *_GCC48_X64_DLINK2_FLAGS         = DEF(GCC48_X64_DLINK2_FLAGS)\r
+ *_GCC48_X64_RC_FLAGS             = DEF(GCC_X64_RC_FLAGS)\r
+ *_GCC48_X64_OBJCOPY_FLAGS        =\r
+-*_GCC48_X64_NASM_FLAGS           = -f elf64\r
++*_GCC48_X64_NASM_FLAGS           = -f elf64 ENV(NASM_PREFIX_MAP)\r
\r
+   DEBUG_GCC48_X64_CC_FLAGS       = DEF(GCC48_X64_CC_FLAGS) -Os\r
+ RELEASE_GCC48_X64_CC_FLAGS       = DEF(GCC48_X64_CC_FLAGS) -Os -Wno-unused-but-set-variable\r
+@@ -2222,7 +2222,7 @@ RELEASE_GCC48_AARCH64_CC_FLAGS   = DEF(G
+ *_GCC49_IA32_DLINK2_FLAGS         = DEF(GCC49_IA32_DLINK2_FLAGS)\r
+ *_GCC49_IA32_RC_FLAGS             = DEF(GCC_IA32_RC_FLAGS)\r
+ *_GCC49_IA32_OBJCOPY_FLAGS        =\r
+-*_GCC49_IA32_NASM_FLAGS           = -f elf32\r
++*_GCC49_IA32_NASM_FLAGS           = -f elf32 ENV(NASM_PREFIX_MAP)\r
\r
+   DEBUG_GCC49_IA32_CC_FLAGS       = DEF(GCC49_IA32_CC_FLAGS) -Os\r
+ RELEASE_GCC49_IA32_CC_FLAGS       = DEF(GCC49_IA32_CC_FLAGS) -Os -Wno-unused-but-set-variable -Wno-unused-const-variable\r
+@@ -2250,7 +2250,7 @@ RELEASE_GCC49_IA32_CC_FLAGS       = DEF(
+ *_GCC49_X64_DLINK2_FLAGS         = DEF(GCC49_X64_DLINK2_FLAGS)\r
+ *_GCC49_X64_RC_FLAGS             = DEF(GCC_X64_RC_FLAGS)\r
+ *_GCC49_X64_OBJCOPY_FLAGS        =\r
+-*_GCC49_X64_NASM_FLAGS           = -f elf64\r
++*_GCC49_X64_NASM_FLAGS           = -f elf64 ENV(NASM_PREFIX_MAP)\r
\r
+   DEBUG_GCC49_X64_CC_FLAGS       = DEF(GCC49_X64_CC_FLAGS) -Os\r
+ RELEASE_GCC49_X64_CC_FLAGS       = DEF(GCC49_X64_CC_FLAGS) -Os -Wno-unused-but-set-variable -Wno-unused-const-variable\r
+@@ -2368,7 +2368,7 @@ RELEASE_GCC49_AARCH64_DLINK_XIPFLAGS = -
+ *_GCC5_IA32_DLINK2_FLAGS         = DEF(GCC5_IA32_DLINK2_FLAGS) -no-pie\r
+ *_GCC5_IA32_RC_FLAGS             = DEF(GCC_IA32_RC_FLAGS)\r
+ *_GCC5_IA32_OBJCOPY_FLAGS        =\r
+-*_GCC5_IA32_NASM_FLAGS           = -f elf32\r
++*_GCC5_IA32_NASM_FLAGS           = -f elf32 ENV(NASM_PREFIX_MAP)\r
\r
+   DEBUG_GCC5_IA32_CC_FLAGS       = DEF(GCC5_IA32_CC_FLAGS) -flto -Os\r
+   DEBUG_GCC5_IA32_DLINK_FLAGS    = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Os -Wl,-m,elf_i386,--oformat=elf32-i386\r
+@@ -2400,7 +2400,7 @@ RELEASE_GCC5_IA32_DLINK_FLAGS    = DEF(G
+ *_GCC5_X64_DLINK2_FLAGS          = DEF(GCC5_X64_DLINK2_FLAGS)\r
+ *_GCC5_X64_RC_FLAGS              = DEF(GCC_X64_RC_FLAGS)\r
+ *_GCC5_X64_OBJCOPY_FLAGS         =\r
+-*_GCC5_X64_NASM_FLAGS            = -f elf64\r
++*_GCC5_X64_NASM_FLAGS            = -f elf64 ENV(NASM_PREFIX_MAP)\r
\r
+   DEBUG_GCC5_X64_CC_FLAGS        = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -Os\r
+   DEBUG_GCC5_X64_DLINK_FLAGS     = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os\r
index 896b3b63202dbf986ce54fb101b44014f4326ded..1fe01146d6b8dac666d1fbd86ba8aade478d87ed 100644 (file)
@@ -17,6 +17,7 @@ SRC_URI = "gitsm://github.com/tianocore/edk2.git;branch=master;protocol=https \
            file://0002-BaseTools-makefile-adjust-to-build-in-under-bitbake.patch \
            file://0004-ovmf-Update-to-latest.patch \
            file://zero.patch \
+           file://debug_prefix_map.patch \
            "
 
 PV = "edk2-stable202102"
@@ -104,6 +105,13 @@ fix_toolchain_append_class-native() {
         ${S}/BaseTools/Conf/tools_def.template
 }
 
+# We want to pass ${DEBUG_PREFIX_MAP} to gcc commands and also pass in
+# --debug-prefix-map to nasm (we carry a patch to nasm for this). The
+# tools definitions are built by ovmf-native so we need to pass this in
+# at target build time when we know the right values.
+export NASM_PREFIX_MAP = "--debug-prefix-map=${WORKDIR}=/usr/src/debug/ovmf/${EXTENDPE}${PV}-${PR}"
+export GCC_PREFIX_MAP = "${DEBUG_PREFIX_MAP}"
+
 GCC_VER="$(${CC} -v 2>&1 | tail -n1 | awk '{print $3}')"
 
 fixup_target_tools() {