[rb-general] [PATCH] gcc: read -fdebug-prefix-map OLD from environment (improved reproducibility)
Thomas Klausner
wiz at NetBSD.org
Tue Dec 22 13:15:56 CET 2015
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
> + at 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 at lists.reproducible-builds.org mailing list
>
> To unsubscribe or change your options, please visit:
> https://lists.reproducible-builds.org/listinfo/rb-general
>
More information about the rb-general
mailing list