* ldlang.c (load_symbols): Close file and set flags.loaded
authorAlan Modra <amodra@gmail.com>
Mon, 25 Jun 2012 01:49:08 +0000 (01:49 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 25 Jun 2012 01:49:08 +0000 (01:49 +0000)
after parsing script file.
(open_input_bfds): Don't segv on closed script.

ld/ChangeLog
ld/ldlang.c

index 58b6beb249ceb620d04116ee386ed844786253ec..b9b325efa92ccd0c1b4e7e62d0bedc776234c869 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-25  Alan Modra  <amodra@gmail.com>
+
+       * ldlang.c (load_symbols): Close file and set flags.loaded
+       after parsing script file.
+       (open_input_bfds): Don't segv on closed script.
+
 2012-06-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        * configure.tgt: Enable elf_k1om for x86_64-*-linux-gnux32.
index ddf3be22eb2ac837f59312b6f2724942caadc323..7dd2fa4f50afdc7b2a27102a07228d4592c0c2a2 100644 (file)
@@ -2668,6 +2668,7 @@ load_symbols (lang_input_statement_type *entry,
     {
       bfd_error_type err;
       struct lang_input_statement_flags save_flags;
+      extern FILE *yyin;
 
       err = bfd_get_error ();
 
@@ -2715,6 +2716,9 @@ load_symbols (lang_input_statement_type *entry,
       save_flags.missing_file |= input_flags.missing_file;
       input_flags = save_flags;
       pop_stat_ptr ();
+      fclose (yyin);
+      yyin = NULL;
+      entry->flags.loaded = TRUE;
 
       return TRUE;
     }
@@ -3224,6 +3228,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
 #endif
                  && !s->input_statement.flags.whole_archive
                  && s->input_statement.flags.loaded
+                 && s->input_statement.the_bfd != NULL
                  && bfd_check_format (s->input_statement.the_bfd,
                                       bfd_archive))
                s->input_statement.flags.loaded = FALSE;
@@ -3233,6 +3238,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
                       && plugin_insert == NULL
                       && s->input_statement.flags.loaded
                       && s->input_statement.flags.add_DT_NEEDED_for_regular
+                      && s->input_statement.the_bfd != NULL
                       && ((s->input_statement.the_bfd->flags) & DYNAMIC) != 0
                       && plugin_should_reload (s->input_statement.the_bfd))
                {