From 64ce6afa21fadd751e1700af145ab77059abadc6 Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Sun, 20 Jan 2019 20:20:16 -0600 Subject: 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 #include 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rts/Linker.c') diff --git a/rts/Linker.c b/rts/Linker.c index 5b10b798ec..ac030af837 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -483,7 +483,7 @@ initLinker_ (int retain_cafs) # endif /* RTLD_DEFAULT */ compileResult = regcomp(&re_invalid, - "(([^ \t()])+\\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)", + "(([^ \t()])+\\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format|Exec format error)", REG_EXTENDED); if (compileResult != 0) { barf("Compiling re_invalid failed"); -- cgit v1.2.1