[Reproducible-builds] Bug#757629: kfreebsd-10: build path compiled into kernel modules

Steven Chamberlain steven at pyro.eu.org
Sun Aug 10 00:01:24 UTC 2014


Package: src:kfreebsd-10
Version: 10.0-6
Severity: wishlist
Tags: patch
User: reproducible-builds at lists.alioth.debian.org
Usertags: toolchain

Hi,

Some of kfreebsd's .ko module files contain the build path of the
Debian package, for example:

aac.ko:
/build/kfreebsd-10-Odh4L_/kfreebsd-10-10.0/flavor-10.0-1-686/sys/modules/aac/../../dev/aac/aac.c
/build/kfreebsd-10-Odh4L_/kfreebsd-10-10.0/flavor-10.0-1-686/sys/modules/aac/../../dev/aac/aac_disk.c
/build/kfreebsd-10-Odh4L_/kfreebsd-10-10.0/flavor-10.0-1-686/sys/modules/aac/../../dev/aac/aac_cam.c

aacraid.ko:
/build/kfreebsd-10-Odh4L_/kfreebsd-10-10.0/flavor-10.0-1-686/sys/modules/aacraid/../../dev/aacraid/aacraid.c
/build/kfreebsd-10-Odh4L_/kfreebsd-10-10.0/flavor-10.0-1-686/sys/modules/aacraid/../../dev/aacraid/aacraid_cam.c

These are _not_ DWARF debugging symbols, but appear in the ELF .text
sections.

Having the absolute (rather than relative) path here is:
* not helpful, it conveys no useful information
* wastes disk space and memory
* often different for each build, and thus a problem in terms of the
 Reproducible Builds effort:  https://wiki.debian.org/ReproducibleBuilds

In most cases it seems because:
* modules are built with -DKLD_MODULE
* KLD_MODULE causes LOCK_DEBUG to be defined (sys/lock.h)
* LOCK_DEBUG causes mtx_assert() to use __FILE__ in debug messages
 (sys/mutex.h)

And:
* __FILE__ contains what was literally given to the compiler as the
 source file argument
* freebsd-make compiles many source files giving the full path
* this seems to come from $(.PATH) in the Makefiles
* most Makefiles set .PATH: $(.CURDIR)/foo/bar
* $(.CURDIR) returns an absolute path

But that seems to be unnecessary -- $(.CURDIR)/ is already implied if
you give a relative path (should be true because Make targets are not
supposed to change working directory) -- so when I tried removing it
like this, it seems to have just worked:

$ find sys/modules/ \( -name Makefile -o -name Makefile.inc \) \
   -exec sed -i 's@${.CURDIR}/@@' \{\} \;

The whole build succeeded, the build log is somewhat cleaner, and the
strings in the _text sections now look like this, which is clean enough
for our purposes:

aac.ko:
.../../dev/aac/aac.c
.../../dev/aac/aac_disk.c
.../../dev/aac/aac_cam.c

aacraid.ko:
.../../dev/aacraid/aacraid.c
.../../dev/aacraid/aacraid_cam.c

I wanted to document all of this because:
* I've been trying for weeks to figure this out, and many hours today
* I wouldn't want to forget
* I'd like to be able to point to this bug as a full explanation, if I
 commit something odd like this to our debian/rules
* someone else may like to give some input or opinions before I do that

Thanks!

-- System Information:
Debian Release: jessie/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'stable')
Architecture: kfreebsd-amd64 (x86_64)

Kernel: kFreeBSD 9.0-2-amd64-xenhvm-ipsec
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash



More information about the Reproducible-builds mailing list