aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-09-12 17:25:46 +0930
committerAlan Modra <amodra@gmail.com>2019-09-12 21:45:25 +0930
commita19826f4c41219be6fb1adb528fe5fd3a3dc4130 (patch)
tree54d271f0240e4e63ff52e57fa87dc8b12e5b0246 /ld
parent7a28970742a8a1509917d409af14c84e1f666baa (diff)
downloadgdb-a19826f4c41219be6fb1adb528fe5fd3a3dc4130.zip
gdb-a19826f4c41219be6fb1adb528fe5fd3a3dc4130.tar.gz
gdb-a19826f4c41219be6fb1adb528fe5fd3a3dc4130.tar.bz2
PR24981, Hit assertion failure in ld/ldlang.c:7504
This fixes a problem with commit 128bf1fe608, a patch I made 2019-08-06. Apparently it is possible to trigger the assertion I added during an LTO bootstrap, something I haven't reproduced. However, I did find a case triggered by an odd linker script feature that allows a file to be loaded from the script without specifying that file on the command line. Regarding input sections: "When you use a file name which is not an archive:file specifier and does not contain any wild card characters, the linker will first see if you also specified the file name on the linker command line or in an INPUT command. If you did not, the linker will attempt to open the file as an input file, as though it appeared on the command line." So putting .foo : { foo.a(*) } into a script supposedly extracts foo.a into .foo. Except it doesn't, since this feature is meant for object files only. Well anyway, assuming --whole-archive was given on the command line, foo.a contains a -flto object and no other objects involved were -flto then we'll hit the assert due to files added like foo.a here *not* having their input statement put on the general statement list. Why these are not put on the statement list isn't obvious but it has been that way since commit 193c5f93a17 in 1994. PR 24981 * ldlang.c (lang_process): Remove assertion. Comment.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/ldlang.c5
2 files changed, 8 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index ca12975..b3207cc 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-12 Alan Modra <amodra@gmail.com>
+
+ PR 24981
+ * ldlang.c (lang_process): Remove assertion. Comment.
+
2019-09-11 Alan Modra <amodra@gmail.com>
* emultempl/elf32.em: Remove "misnamed" comment. Rename to..
diff --git a/ld/ldlang.c b/ld/ldlang.c
index d5a2b49..5a34e5c 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -7502,8 +7502,9 @@ lang_process (void)
prev = find_next_input_statement (prev);
if (*prev != (void *) plugin_insert->next_real_file)
{
- /* Huh? We didn't find the expected input statement. */
- ASSERT (0);
+ /* We didn't find the expected input statement.
+ This can happen due to lookup_name creating input
+ statements not linked into the statement list. */
prev = &plugin_insert->header.next;
}
}