Re: [OE-core] [master][PATCH 0/4] Reproducible LTO builds
From: Tony Battersby <hidden>
Date: 2021-08-05 21:54:51
Also in:
openembedded-devel
On 8/5/21 6:21 AM, Richard Purdie wrote:
On Wed, 2021-08-04 at 20:13 -0400, Randy MacLeod wrote:quoted
On 2021-07-27 9:34 a.m., Tony Battersby wrote:quoted
Currently, enabling Link Time Optimization via: require conf/distro/include/lto.inc DISTRO_FEATURES_append = " lto" makes the build non-reproducible (as in https://reproducible-builds.org/). This patch set fixes some of the problems, but is not yet a complete solution. This patch set addresses the following bugs: https://bugzilla.yoctoproject.org/show_bug.cgi?id=14481 https://bugzilla.yoctoproject.org/show_bug.cgi?id=14490 openembedded-core patches 1/4: lto.inc: disable LTO for grub 2/4: gcc: Backport patch to make LTO builds more reproducible 3/4: bitbake.conf: add DEBUG_PREFIX_MAP to TARGET_LDFLAGS openembedded-devel patches 4/4: net-snmp: fix QA Issue after LDFLAGS change Patch 3 adds DEBUG_PREFIX_MAP to TARGET_LDFLAGS (it was already in TARGET_CFLAGS). This could possibly be done differently, such as by removing it from TARGET_CFLAGS and adding it to TOOLCHAIN_OPTIONS, TARGET_CC_ARCH, or TUNE_CCARGS, but I haven't tested those. Let me know if there is a better/preferred way to do it. The TARGET_LDFLAGS change broke net-snmp from meta-networking, so I have included a patch to fix that. Other packages might have been broken as well, although I haven't found any others. With all these patches, there are still many shared libraries in /lib and /usr/lib that are still not reproducible with LTO enabled because x86_64-poky-linux-libtool filters out the -f*-prefix-map flags added by patch 3 when linking shared libraries. /usr/lib/libbz2.so.1.0.6 from the libbz2 package from the bzip2 recipe is a good example. I do not have a patch for that problem. I will leave that to someone else. So this is what we need to achieve reproducible LTO builds: *) This patch set *) A fix for libtool *) Add LTO to reproducible builds testing if appropriate (e.g. meta/lib/oeqa/selftest/cases/reproducible.py, CI on Autobuilder) *) Fixes for individual packages, if needed *) Once everything works, update the documentation again (I previously requested a documentation change for this bug, which will eventually show up at http://docs.yoctoproject.org/test-manual/reproducible-builds.html).This is certainly a few steps in the right direction with a good outline of what's next. I suspect that Richard has been busy with other things like overrides and the update to glibc-2.34. Do you have any suggestions or questions about what we should do with this patch series Richard?Thanks for the reminder, I've been meaning to queue/test this which I will do. The gcc version has been bumped but I ported the patch forward to it and the patches are in master-next for testing. It is great to see this support moving forward. Much as it pains me to admit having any libtool knowledge, I may be able to help with that bit. There is an untested patch below which may address that issue, or at least give a good hint on how to do it if it doesn't work. I don't have an environment to test easily right now. Cheers, Richard
I tested your libtool patch in master-next with the bzip2 recipe. It works as intended; libbz2.so.1.0.6 and all the other output files are now reproducible with LTO enabled. I also verified that libtool is passing the -f*-prefix-map flags to the link command in log.do_compile as intended. I also verified that core-image-minimal builds successfully with the libtool patch. Tony Battersby
quoted hunk ↗ jump to hunk
quoted
From 7681b0a1461f22034e1f70328a060db34474c60f Mon Sep 17 00:00:00 2001From: Richard Purdie <redacted> Date: Thu, 5 Aug 2021 11:18:20 +0100 Subject: libtool: Fix lto option passing? Signed-off-by: Richard Purdie <redacted> --- meta/recipes-devtools/libtool/libtool-2.4.6.inc | 1 + meta/recipes-devtools/libtool/libtool/lto-prefix.patch | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 meta/recipes-devtools/libtool/libtool/lto-prefix.patchdiff --git a/meta/recipes-devtools/libtool/libtool-2.4.6.inc b/meta/recipes-devtools/libtool/libtool-2.4.6.inc index c1cbceb51f..6748d7468e 100644 --- a/meta/recipes-devtools/libtool/libtool-2.4.6.inc +++ b/meta/recipes-devtools/libtool/libtool-2.4.6.inc@@ -23,6 +23,7 @@ SRC_URI = "${GNU_MIRROR}/libtool/libtool-${PV}.tar.gz \ file://0001-libtool-Check-for-static-libs-for-internal-compiler-.patch \ file://0001-Makefile.am-make-sure-autoheader-run-before-autoconf.patch \ file://0001-Makefile.am-make-sure-autoheader-run-before-automake.patch \ + file://lto-prefix.patch \ " SRC_URI[md5sum] = "addf44b646ddb4e3919805aa88fa7c5e"diff --git a/meta/recipes-devtools/libtool/libtool/lto-prefix.patch b/meta/recipes-devtools/libtool/libtool/lto-prefix.patch new file mode 100644 index 0000000000..f788b3fc27--- /dev/null +++ b/meta/recipes-devtools/libtool/libtool/lto-prefix.patch@@ -0,0 +1,16 @@ +Index: libtool-2.4.6/build-aux/ltmain.in +=================================================================== +--- libtool-2.4.6.orig/build-aux/ltmain.in ++++ libtool-2.4.6/build-aux/ltmain.in +@@ -5424,9 +5424,10 @@ func_mode_link () + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang ++ # -f*-prefix-map* needed for lto linking + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ +- -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) ++ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*|-f*-prefix-map*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg"