* elf.c (assign_file_positions_for_segments): Sort the sections in
authorIan Lance Taylor <ian@airs.com>
Fri, 1 Dec 1995 21:44:38 +0000 (21:44 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 1 Dec 1995 21:44:38 +0000 (21:44 +0000)
each segment.
(get_program_header_size): Return the right size if segment_map is
not NULL.
(copy_private_bfd_data): Don't bother to sort the sections.

bfd/elf.c

index 87eaa943595d4268f95ea39eb0455abf6167c371..9da5010334942ed256177eae35fb00b6dd77d857 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1797,6 +1797,12 @@ assign_file_positions_for_segments (abfd)
       unsigned int i;
       asection **secpp;
 
+      /* If elf_segment_map is not from map_sections_to_segments, the
+         sections may not be correctly ordered.  */
+      if (m->count > 0)
+       qsort (m->sections, (size_t) m->count, sizeof (asection *),
+              elf_sort_sections);
+
       p->p_type = m->p_type;
 
       if (m->p_flags_valid)
@@ -2019,6 +2025,17 @@ get_program_header_size (abfd)
   if (elf_tdata (abfd)->program_header_size != 0)
     return elf_tdata (abfd)->program_header_size;
 
+  if (elf_tdata (abfd)->segment_map != NULL)
+    {
+      struct elf_segment_map *m;
+
+      segs = 0;
+      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
+       ++segs;
+      elf_tdata (abfd)->program_header_size = segs * bed->s->sizeof_phdr;
+      return elf_tdata (abfd)->program_header_size;
+    }
+
   /* Assume we will need exactly two PT_LOAD segments: one for text
      and one for data.  */
   segs = 2;
@@ -2539,9 +2556,6 @@ copy_private_bfd_data (ibfd, obfd)
            }
        }
       BFD_ASSERT (isec == csecs);
-      if (csecs > 0)
-       qsort (m->sections, (size_t) csecs, sizeof (asection *),
-              elf_sort_sections);
       m->count = csecs;
 
       *pm = m;