Extend linker-script workaround to work with musl libc
authorSamuel Holland <samuel@sholland.org>
Mon, 21 Jan 2019 02:20:16 +0000 (20:20 -0600)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Mon, 21 Jan 2019 23:28:38 +0000 (18:28 -0500)
commit64ce6afa21fadd751e1700af145ab77059abadc6
tree54b48b266c178e3f4ca949dcaaa927f5b7e69817
parent7262a81585a52e019a7d85bc66fc906a629413ec
Extend linker-script workaround to work with musl libc

GHC has code to handle unsuffixed .so files that are linker scripts
pointing to the real shared library. The detection is done by parsing
the result of `dlerror()` after calling `dlopen()` and looking for
certain error strings. On musl libc, the error message is "Exec format
error", which happens to be `strerror(ENOEXEC)`:

```
$ cat tmp.c
#include <dlfcn.h>
#include <stdio.h>

int main(void) {
        dlopen("libz.so", RTLD_NOW | RTLD_GLOBAL);
        puts(dlerror());
        return 0;
}
$ gcc -o tmp tmp.c
$ ./tmp
Error loading shared library libz.so: Exec format error
$
```

This change fixes the workaround to also work on musl libc.

Link: https://phabricator.haskell.org/D5474
rts/Linker.c