From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 104159 invoked by alias); 22 Dec 2015 12:16:03 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 104115 invoked by uid 89); 22 Dec 2015 12:16:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=no version=3.3.2 spammy=variation, Kahn, kahn, welcome! X-HELO: danbala.ifoer.tuwien.ac.at Received: from danbala.ifoer.tuwien.ac.at (HELO danbala.ifoer.tuwien.ac.at) (128.130.168.64) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 22 Dec 2015 12:16:00 +0000 Received: by danbala.ifoer.tuwien.ac.at (Postfix, from userid 116) id 42300A5F5; Tue, 22 Dec 2015 13:15:56 +0100 (CET) Date: Tue, 22 Dec 2015 12:16:00 -0000 From: Thomas Klausner To: General discussions about reproducible builds Cc: gcc-patches@gcc.gnu.org, niels@thykier.net, Daniel Kahn Gillmor , anthraxx@archlinux.org, Joerg Sonnenberger Subject: Re: [rb-general] [PATCH] gcc: read -fdebug-prefix-map OLD from environment (improved reproducibility) Message-ID: <20151222121556.GH11588@danbala.tuwien.ac.at> References: <87egf1mxfl.fsf@alice.fifthhorseman.net> <1449768978-3872-1-git-send-email-dkg@fifthhorseman.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1449768978-3872-1-git-send-email-dkg@fifthhorseman.net> X-SW-Source: 2015-12/txt/msg02030.txt.bz2 I just found a related patch again that we have in NetBSD's gcc that allows fixing __FILE__ references. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47047 No progress since 2010 in getting this included though :( Thomas On Thu, Dec 10, 2015 at 12:36:18PM -0500, Daniel Kahn Gillmor wrote: > Work on the reproducible-builds project [0] has identified that build > paths are one cause of output variation between builds. This > changeset allows users to avoid this variation when building C objects > with debug symbols, while leaving the default behavior unchanged. > > Background > ---------- > > gcc includes the build path in any generated DWARF debugging symbols, > specifically in DW_AT_comp_dir, but allows the embedded path to be > changed via -fdebug-prefix-map. > > When -fdebug-prefix-map is used with the current build path, it > removes the build path from DW_AT_comp_dir but places it instead in > DW_AT_producer, so the reproducibility problem isn't resolved. > > When building software for binary redistribution, the actual build > path on the build machine is irrelevant, and doesn't need to be > exposed in the debug symbols. > > Resolution > ---------- > > This patch extends the first argument to -fdebug-prefix-map ("old") to > be able to read from the environment, which allows a packager to avoid > embedded build paths in the debugging symbols with something like: > > export SOURCE_BUILD_DIR="$(pwd)" > gcc -fdebug-prefix-map=\$SOURCE_BUILD_DIR=/usr/src > > Details > ------- > > Specifically, if the first character of the "old" argument is a > literal $, then gcc will treat it as an environment variable name, and > use the value of the env var for prefix mapping. > > As a result, DW_AT_producer contains the literal envvar name, > DW_AT_comp_dir contains the transformed build path, and the actual > build path is not at all present in the generated object file. > > This has been tested successfully on amd64 machines, and i see no > reason why it would be platform-specific. > > More discussion of alternate approaches considered and discarded in > the development of this change can be found at [1] for those > interested. > > Feedback welcome! > > [0] https://reproducible-builds.org > [1] https://lists.alioth.debian.org/pipermail/reproducible-builds/Week-of-Mon-20151130/004051.html > --- > gcc/doc/invoke.texi | 4 +++- > gcc/final.c | 27 +++++++++++++++++++++++++-- > 2 files changed, 28 insertions(+), 3 deletions(-) > > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi > index 5256031..234432f 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -6440,7 +6440,9 @@ link processing time. Merging is enabled by default. > @item -fdebug-prefix-map=@var{old}=@var{new} > @opindex fdebug-prefix-map > When compiling files in directory @file{@var{old}}, record debugging > -information describing them as in @file{@var{new}} instead. > +information describing them as in @file{@var{new}} instead. If > +@file{@var{old}} starts with a @samp{$}, the corresponding environment > +variable will be dereferenced, and its value will be used instead. > > @item -fno-dwarf2-cfi-asm > @opindex fdwarf2-cfi-asm > diff --git a/gcc/final.c b/gcc/final.c > index 8cb5533..bc43b61 100644 > --- a/gcc/final.c > +++ b/gcc/final.c > @@ -1525,6 +1525,9 @@ add_debug_prefix_map (const char *arg) > { > debug_prefix_map *map; > const char *p; > + char *env; > + const char *old; > + size_t oldlen; > > p = strchr (arg, '='); > if (!p) > @@ -1532,9 +1535,29 @@ add_debug_prefix_map (const char *arg) > error ("invalid argument %qs to -fdebug-prefix-map", arg); > return; > } > + if (*arg == '$') > + { > + env = xstrndup (arg+1, p - (arg+1)); > + old = getenv(env); > + if (!old) > + { > + warning (0, "environment variable %qs not set in argument to " > + "-fdebug-prefix-map", env); > + free(env); > + return; > + } > + oldlen = strlen(old); > + free(env); > + } > + else > + { > + old = xstrndup (arg, p - arg); > + oldlen = p - arg; > + } > + > map = XNEW (debug_prefix_map); > - map->old_prefix = xstrndup (arg, p - arg); > - map->old_len = p - arg; > + map->old_prefix = old; > + map->old_len = oldlen; > p++; > map->new_prefix = xstrdup (p); > map->new_len = strlen (p); > -- > 2.6.2 > > _______________________________________________ > rb-general@lists.reproducible-builds.org mailing list > > To unsubscribe or change your options, please visit: > https://lists.reproducible-builds.org/listinfo/rb-general >