PATCH: ld/2411: ELF linker fails to create executable with more than 64k sections

H. J. Lu hjl@lucon.org
Thu Mar 2 23:21:00 GMT 2006
The ELF gABI doesn't support more than 64k sections in DSO and
executable when there are dynamic symbols. This patch checks that.


H.J.
---
2006-03-02  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/2411
	* elflink.c (map_sections_to_segments): Check if the number
	of output sections are allowed.
	(assign_file_positions_for_segments): Updated.

--- bfd/elf.c.64k	2006-03-01 06:19:54.000000000 -0800
+++ bfd/elf.c	2006-03-02 15:17:19.000000000 -0800
@@ -3585,7 +3585,7 @@ _bfd_elf_make_dynamic_segment (bfd *abfd
 /* Set up a mapping from BFD sections to program segments.  */
 
 static bfd_boolean
-map_sections_to_segments (bfd *abfd)
+map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
 {
   asection **sections = NULL;
   asection *s;
@@ -3612,6 +3612,18 @@ map_sections_to_segments (bfd *abfd)
   if (bfd_count_sections (abfd) == 0)
     return TRUE;
 
+  if (elf_hash_table (info)->dynsymcount != 0
+      && bfd_count_sections (abfd) >= SHN_LORESERVE)
+    {
+      /* The gABI doesn't support dynamic symbols and more than 64K
+         output sections at the same time.  */
+      (*_bfd_error_handler)
+	(_("%B: Too many sections: %d (< %d)"),
+	 abfd, bfd_count_sections (abfd), SHN_LORESERVE);
+      bfd_set_error (bfd_error_nonrepresentable_section);
+      return FALSE;
+    }
+
   /* Select the allocated sections, and sort them.  */
 
   sections = bfd_malloc2 (bfd_count_sections (abfd), sizeof (asection *));
@@ -4085,7 +4097,7 @@ assign_file_positions_for_segments (bfd 
 
   if (elf_tdata (abfd)->segment_map == NULL)
     {
-      if (! map_sections_to_segments (abfd))
+      if (! map_sections_to_segments (abfd, link_info))
 	return FALSE;
     }
   else



More information about the Binutils mailing list