From 1ed89aa92ed7b3fc5a12f8d670392e5ce67c31b4 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 6 Jun 2002 10:03:38 +0000 Subject: Do not include empty sections in loadable segments. --- bfd/ChangeLog | 8 +++++++- bfd/elf.c | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 51f9a90..107403d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2002-06-06 David Heine + + * elf.c (assign_file_positions_for_segments): Remove unallocated + sections from the section to segment mapping for PT_LOAD segments. + Update comment about empty loadable segments. + 2002-06-06 Richard Sandiford * stabs.c (_bfd_link_section_stabs): Check that the symbol offset @@ -44,7 +50,7 @@ * elf64-sh64.c (sh_elf64_get_relocated_section_contents): Likewise. * elfxx-ia64.c (elfNN_ia64_relax_section): Likewise. -Wed Jun 5 20:43:27 2002 J"orn Rennecke +2002-06-05 J"orn Rennecke * config.bfd (sh64l*-*-elf*, shl*-*-elf*): New configurations. diff --git a/bfd/elf.c b/bfd/elf.c index 36cbb76..fd9aa4b 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -3455,6 +3455,37 @@ assign_file_positions_for_segments (abfd) if (! map_sections_to_segments (abfd)) return false; } + else + { + /* The placement algorithm assumes that non allocated sections are + not in PT_LOAD segments. We ensure this here by removing such + sections from the segment map. */ + for (m = elf_tdata (abfd)->segment_map; + m != NULL; + m = m->next) + { + unsigned int new_count; + unsigned int i; + + if (m->p_type != PT_LOAD) + continue; + + new_count = 0; + for (i = 0; i < m->count; i ++) + { + if ((m->sections[i]->flags & SEC_ALLOC) != 0) + { + if (i != new_count) + m->sections[new_count] = m->sections[i]; + + new_count ++; + } + } + + if (new_count != m->count) + m->count = new_count; + } + } if (bed->elf_backend_modify_segment_map) { @@ -4610,10 +4641,11 @@ copy_private_bfd_data (ibfd, obfd) { /* Special segments, such as the PT_PHDR segment, may contain no sections, but ordinary, loadable segments should contain - something. */ + something. They are allowed by the ELF spec however, so only + a warning is produced. */ if (segment->p_type == PT_LOAD) (*_bfd_error_handler) - (_("%s: warning: Empty loadable segment detected\n"), + (_("%s: warning: Empty loadable segment detected, is this intentional ?\n"), bfd_archive_filename (ibfd)); map->count = 0; -- cgit v1.1