This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: ld/2411: ELF linker fails to create executable with more than 64k sections
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Thu, 2 Mar 2006 15:21:25 -0800
- Subject: PATCH: ld/2411: ELF linker fails to create executable with more than 64k sections
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