Skip 64-bit symbol tables
authorSylvain HENRY <hsyl20@gmail.com>
Mon, 14 Nov 2016 22:16:27 +0000 (17:16 -0500)
committerBen Gamari <ben@smart-cactus.org>
Mon, 14 Nov 2016 22:16:28 +0000 (17:16 -0500)
This patch makes the RTS linker skip 64-bit symbol table entries.  See
https://mail.haskell.org/pipermail/ghc-devs/2016-November/013210.html

Test Plan: validate

Reviewers: austin, erikd, simonmar, bgamari

Reviewed By: bgamari

Subscribers: osa1, thomie

Differential Revision: https://phabricator.haskell.org/D2697

GHC Trac Issues: #12827

rts/linker/LoadArchive.c

index 1aa4daa..04bd455 100644 (file)
@@ -288,12 +288,14 @@ static HsInt loadArchive_ (pathchar *path)
                 memcpy(fileName, gnuFileIndex + n, thisFileNameSize);
                 fileName[thisFileNameSize] = '\0';
             }
-            else if (fileName[1] == ' ') {
+            /* Skip 32-bit symbol table ("/" + 15 blank characters)
+               and  64-bit symbol table ("/SYM64/" + 9 blank characters) */
+            else if (fileName[1] == ' ' || (0 == strncmp(&fileName[1], "SYM64/", 6))) {
                 fileName[0] = '\0';
                 thisFileNameSize = 0;
             }
             else {
-                barf("loadArchive: GNU-variant filename offset not found while reading filename from `%s'", path);
+                barf("loadArchive: invalid GNU-variant filename `%.16s' while reading filename from `%s'", fileName, path);
             }
         }
         /* Finally, the case where the filename field actually contains