[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