Bug 68848 - allow -fdebug-prefix-map to read OLD prefix from environment (improve reproducibility)
Summary: allow -fdebug-prefix-map to read OLD prefix from environment (improve reprodu...
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: debug (show other bugs)
Version: unknown
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-12-10 21:54 UTC by Daniel Kahn Gillmor
Modified: 2016-09-06 19:48 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
allow reading OLD argument to -fdebug-prefix-map from environment (1.85 KB, application/mbox)
2015-12-10 21:54 UTC, Daniel Kahn Gillmor
Details
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix) (1.97 KB, patch)
2015-12-11 16:47 UTC, Daniel Kahn Gillmor
Details | Diff
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix) (1.98 KB, patch)
2015-12-11 18:24 UTC, Daniel Kahn Gillmor
Details | Diff
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix) (1.98 KB, application/mbox)
2015-12-11 18:27 UTC, Daniel Kahn Gillmor
Details
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix) (1.98 KB, patch)
2015-12-11 18:27 UTC, Daniel Kahn Gillmor
Details | Diff
ignore -fdebug-prefix-map when generating DW_AT_producer (944 bytes, patch)
2015-12-11 19:07 UTC, Daniel Kahn Gillmor
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Daniel Kahn Gillmor 2015-12-10 21:54:23 UTC
Created attachment 36989 [details]
allow reading OLD argument to -fdebug-prefix-map from environment

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


https://gcc.gnu.org/ml/gcc-patches/2015-12/msg01168.html
Comment 1 Daniel Kahn Gillmor 2015-12-11 16:47:00 UTC
Created attachment 37001 [details]
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix)

I'm attaching an updated patch that uses an "ENV:" prefix instead of a literal "$", because the "$" is messy to pass through a complex build chain without a lot of escaping.

So the reproducible use case would be something like:

  export SOURCE_BUILD_DIR="$(pwd)"
  gcc -fdebug-prefix-map=ENV:SOURCE_BUILD_DIR=/usr/src
Comment 2 Daniel Kahn Gillmor 2015-12-11 18:24:42 UTC
Created attachment 37003 [details]
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix)

the v3 patch fixes coding conventions (thanks, Bernd Schmidt!)
Comment 3 Daniel Kahn Gillmor 2015-12-11 18:27:03 UTC
Created attachment 37004 [details]
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix)
Comment 4 Daniel Kahn Gillmor 2015-12-11 18:27:31 UTC
Created attachment 37005 [details]
allow reading OLD argument to -fdebug-prefix-map from environment (using ENV: prefix)
Comment 5 Daniel Kahn Gillmor 2015-12-11 19:07:46 UTC
Created attachment 37007 [details]
ignore -fdebug-prefix-map when generating DW_AT_producer

Here is an alternate approach (suggested by Bernd Schmidt): just avoid writing -fdebug-prefix-map to the DW_AT_producer field entirely.