From: Daniel Jacobowitz Date: Mon, 6 Aug 2007 18:35:18 +0000 (+0000) Subject: * elf.c (rewrite_elf_program_header): Handle sections not sorted X-Git-Tag: insight_6_8-branchpoint~1272 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9559de0116d429fa538b8b091287b8671bb6505e;p=pf3gnuchains%2Fpf3gnuchains4x.git * elf.c (rewrite_elf_program_header): Handle sections not sorted by address. (copy_elf_program_header): Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9ad32c480f..50ce8c0aff 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2007-08-06 Daniel Jacobowitz + + * elf.c (rewrite_elf_program_header): Handle sections not sorted + by address. + (copy_elf_program_header): Likewise. + 2007-08-04 H.J. Lu * elf-bfd.h (xvec_get_elf_backend_data): Add const. diff --git a/bfd/elf.c b/bfd/elf.c index 39678f6be1..4bc5a78ff4 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -5286,7 +5286,7 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd) || (bed->want_p_paddr_set_to_zero && IS_CONTAINED_BY_VMA (output_section, segment))) { - if (matching_lma == 0) + if (matching_lma == 0 || output_section->lma < matching_lma) matching_lma = output_section->lma; /* We assume that if the section fits within the segment @@ -5539,6 +5539,7 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd) bfd_size_type amt; Elf_Internal_Shdr *this_hdr; asection *first_section = NULL; + asection *lowest_section = NULL; /* FIXME: Do we need to copy PT_NULL segment? */ if (segment->p_type == PT_NULL) @@ -5553,7 +5554,9 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd) if (ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, segment)) { if (!first_section) - first_section = section; + first_section = lowest_section = section; + if (section->lma < lowest_section->lma) + lowest_section = section; section_count++; } } @@ -5599,7 +5602,7 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd) if (!map->includes_phdrs && !map->includes_filehdr) /* There is some other padding before the first section. */ - map->p_vaddr_offset = ((first_section ? first_section->lma : 0) + map->p_vaddr_offset = ((lowest_section ? lowest_section->lma : 0) - segment->p_paddr); if (section_count != 0)