This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

fix PR 4923


Confusingly, elf32.em functions are called even when not producing ELF
output.  This patch prevents a segfault during build-id processing.

	PR 4923
	* emultempl/elf32.em (after_open): Return immediately when
        non-ELF output.

Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.184
diff -u -p -r1.184 elf32.em
--- ld/emultempl/elf32.em	29 Jul 2007 12:33:38 -0000	1.184
+++ ld/emultempl/elf32.em	15 Aug 2007 01:36:31 -0000
@@ -1032,6 +1032,11 @@ static void
 gld${EMULATION_NAME}_after_open (void)
 {
   struct bfd_link_needed_list *needed, *l;
+  struct elf_link_hash_table *htab;
+
+  htab = elf_hash_table (&link_info);
+  if (!is_elf_hash_table (htab))
+    return;
 
   if (link_info.emit_note_gnu_build_id)
     {
@@ -1076,46 +1081,38 @@ gld${EMULATION_NAME}_after_open (void)
 	}
     }
 
+  if (link_info.relocatable)
+    return;
+
   if (link_info.eh_frame_hdr
-      && ! link_info.traditional_format
-      && ! link_info.relocatable)
+      && !link_info.traditional_format)
     {
-      struct elf_link_hash_table *htab;
+      bfd *abfd;
+      asection *s;
 
-      htab = elf_hash_table (&link_info);
-      if (is_elf_hash_table (htab))
+      for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
 	{
-	  bfd *abfd;
-	  asection *s;
-
-	  for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
-	    {
-	      s = bfd_get_section_by_name (abfd, ".eh_frame");
-	      if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
-		 break;
-	    }
-	  if (abfd)
-	    {
-	      const struct elf_backend_data *bed;
+	  s = bfd_get_section_by_name (abfd, ".eh_frame");
+	  if (s && s->size > 8 && !bfd_is_abs_section (s->output_section))
+	    break;
+	}
+      if (abfd)
+	{
+	  const struct elf_backend_data *bed;
 
-	      bed = get_elf_backend_data (abfd);
-	      s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
-					       bed->dynamic_sec_flags
-					       | SEC_READONLY);
-	      if (s != NULL
-		 && bfd_set_section_alignment (abfd, s, 2))
-		htab->eh_info.hdr_sec = s;
-	      else
-		einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
-		       " --eh-frame-hdr ignored.\n");
-	    }
+	  bed = get_elf_backend_data (abfd);
+	  s = bfd_make_section_with_flags (abfd, ".eh_frame_hdr",
+					   bed->dynamic_sec_flags
+					   | SEC_READONLY);
+	  if (s != NULL
+	      && bfd_set_section_alignment (abfd, s, 2))
+	    htab->eh_info.hdr_sec = s;
+	  else
+	    einfo ("%P: warning: Cannot create .eh_frame_hdr section,"
+		   " --eh-frame-hdr ignored.\n");
 	}
     }
 
-  /* We only need to worry about this when doing a final link.  */
-  if (link_info.relocatable || !link_info.executable)
-    return;
-
   /* Get the list of files which appear in DT_NEEDED entries in
      dynamic objects included in the link (often there will be none).
      For each such file, we want to track down the corresponding
@@ -1125,6 +1122,8 @@ gld${EMULATION_NAME}_after_open (void)
      special action by the person doing the link.  Note that the
      needed list can actually grow while we are stepping through this
      loop.  */
+  if (!link_info.executable)
+    return;
   needed = bfd_elf_get_needed_list (output_bfd, &link_info);
   for (l = needed; l != NULL; l = l->next)
     {

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]