Skip to content

Library configure scripts should not clobber CPPFLAGS nor LDFLAGS

libraries/base/configure currently clobbers CPPFLAGS and LDFLAGS when --with-iconv-includes and --with-iconv-libraries are given, but really it shouldn't.

I will soon submit a patch for this.

Here's what I stumbled upon (TL;DR):

This is somewhat related to #2933. I have libiconv installed in /usr/pkg, which is a non-standard path that ld.so normally doesn't search libraries for. So I built GHC with CONF_GCC_LINKER_OPTS_STAGE{0,1,2} set to -Wl,-rpath,/usr/pkg/lib so that GHC links executables with RPATH pointing to /usr/pkg/lib.

The build went fine until it started using ghc-stage2 and haddock: they were causing segfaults in evacuate() with a probability of about 70%, which suggested a heap corruption occuring somewhere. I tried rebuilding RTS with -O0 -g, changed various parameters for GC, etc. Nothing changed.

Then I suddenly realized that libraries/base/configure was the root cause of the problem. Those configure scripts are executed with LDFLAGS being set to the value of CONF_GCC_LINKER_OPTS_STAGE2, which is -Wl,-rpath,/usr/pkg/lib in my case, but libraries/base/configure overwrites it to -L/usr/pkg/lib when --with-iconv-libraries=/usr/pkg/lib is given. On the other hand, FP_SEARCH_LIBS_PROTO(iconv) appends -liconv to $LIBS so it will be linked to any conftest executables that follow, including one which will be generated by AC_CHECK_SIZEOF().

The problem is that if libraries listed in $LIBS are in a non-standard path while rpath flags are missing (due to LDFLAGS being clobbered in this case), conftest executables cannot run even if they can be linked. And if anything goes wrong during AC_CHECK_SIZEOF(T), it considers sizeof(T) as 0 unless T is known to be an existing type:

  ...
  checking for library containing iconv... -liconv
  checking for library containing locale_charset... none required
  checking size of struct MD5Context... 0
  ...

This means SIZEOF_STRUCT_MD5CONTEXT gets defined to 0, GHC.Fingerprint.fingerprintData allocates 0 bytes on the heap, MD5Init/Update/Final corrupts the heap and then Bad Things will happen.

I have found the problem on NetBSD/amd64 but I'm sure the same thing happens on every ELF platform.

Trac metadata
Trac field Value
Version 7.11
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Build System
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information