* elfcode.h (map_program_segments): Add sorted_hdrs parameter.
authorIan Lance Taylor <ian@airs.com>
Tue, 31 Jan 1995 20:55:25 +0000 (20:55 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 31 Jan 1995 20:55:25 +0000 (20:55 +0000)
Search through it rather than through unsorted section headers.
(assign_file_positions_except_relocs): Pass sorted_hdrs to
map_program_segments.

bfd/ChangeLog
bfd/elfcode.h

index bf8fc4fc41fc2ffd6b330e120d27baf6a70a9804..f007ca15d9a24a1903a1e60132dd417084515426 100644 (file)
@@ -1,3 +1,10 @@
+Tue Jan 31 15:27:53 1995  Ian Lance Taylor  <ian@cygnus.com>
+
+       * elfcode.h (map_program_segments): Add sorted_hdrs parameter.
+       Search through it rather than through unsorted section headers.
+       (assign_file_positions_except_relocs): Pass sorted_hdrs to
+       map_program_segments.
+
 Mon Jan 30 22:04:53 1995  Ken Raeburn  <raeburn@cujo.cygnus.com>
 
        * ecoff.c (_bfd_ecoff_find_nearest_line): Fix problems in range
index a6c547816df3c8cb05007fb8ed0e5b38bcb605db..2edd5a8f5efa499465c9341f37fd13b463866e73 100644 (file)
@@ -165,7 +165,8 @@ static int elf_sort_hdrs PARAMS ((const PTR, const PTR));
 static void assign_file_positions_for_relocs PARAMS ((bfd *));
 static bfd_size_type get_program_header_size PARAMS ((bfd *));
 static file_ptr map_program_segments
-  PARAMS ((bfd *, file_ptr, Elf_Internal_Shdr *, bfd_size_type));
+  PARAMS ((bfd *, file_ptr, Elf_Internal_Shdr *, Elf_Internal_Shdr **,
+          bfd_size_type));
 
 static boolean elf_map_symbols PARAMS ((bfd *));
 static boolean swap_out_syms PARAMS ((bfd *, struct bfd_strtab_hash **));
@@ -1754,14 +1755,16 @@ get_program_header_size (abfd)
 
 /* Create the program header.  OFF is the file offset where the
    program header should be written.  FIRST is the first loadable ELF
-   section.  PHDR_SIZE is the size of the program header as returned
+   section.  SORTED_HDRS is the ELF sections sorted by section
+   address.  PHDR_SIZE is the size of the program header as returned
    by get_program_header_size.  */
 
 static file_ptr
-map_program_segments (abfd, off, first, phdr_size)
+map_program_segments (abfd, off, first, sorted_hdrs, phdr_size)
      bfd *abfd;
      file_ptr off;
      Elf_Internal_Shdr *first;
+     Elf_Internal_Shdr **sorted_hdrs;
      bfd_size_type phdr_size;
 {
   Elf_Internal_Phdr phdrs[10];
@@ -1840,7 +1843,7 @@ map_program_segments (abfd, off, first, phdr_size)
      sh_addr for this to work correctly.  */
   phdr->p_type = PT_NULL;
   last_type = SHT_PROGBITS;
-  for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
+  for (i = 1, hdrpp = sorted_hdrs;
        i < elf_elfheader (abfd)->e_shnum;
        i++, hdrpp++)
     {
@@ -2113,7 +2116,8 @@ assign_file_positions_except_relocs (abfd, dosyms)
          off = assign_file_position_for_section (hdr, off, false);
        }
 
-      phdr_map = map_program_segments (abfd, phdr_off, first, phdr_size);
+      phdr_map = map_program_segments (abfd, phdr_off, first, sorted_hdrs,
+                                      phdr_size);
       if (phdr_map == (file_ptr) -1)
        return false;
       BFD_ASSERT ((bfd_size_type) phdr_map <= (bfd_size_type) phdr_off + phdr_size);
@@ -4827,6 +4831,9 @@ NAME(bfd_elf,record_link_assignment) (output_bfd, info, name)
 {
   struct elf_link_hash_entry *h;
 
+  if (info->hash->creator->flavour != bfd_target_elf_flavour)
+    return true;
+
   h = elf_link_hash_lookup (elf_hash_table (info), name, true, true, false);
   if (h == NULL)
     return false;
@@ -4891,6 +4898,9 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
 
   *sinterpptr = NULL;
 
+  if (info->hash->creator->flavour != bfd_target_elf_flavour)
+    return true;
+
   dynobj = elf_hash_table (info)->dynobj;
 
   /* If there were no dynamic objects in the link, there is nothing to