[GHC] #10093: Library configure scripts should not clobber CPPFLAGS nor LDFLAGS
GHC
ghc-devs at haskell.org
Mon Feb 16 06:28:40 UTC 2015
#10093: Library configure scripts should not clobber CPPFLAGS nor LDFLAGS
-------------------------------------+-------------------------------------
Reporter: PHO | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Build | Version: 7.11
System | Operating System: Unknown/Multiple
Keywords: | Type of failure: Runtime crash
Architecture: | Blocked By:
Unknown/Multiple | Related Tickets:
Test Case: |
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
`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.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10093>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list