* emultempl/elf32.em (output_rel_find): Prefer .rel script sections
authorAlan Modra <amodra@gmail.com>
Thu, 10 Oct 2002 02:52:27 +0000 (02:52 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 10 Oct 2002 02:52:27 +0000 (02:52 +0000)
when orphan is .rel, .rela when orphan is .rela.
(gld${EMULATION_NAME}_place_orphan): Handle combreloc .rel* case
first.  Remove outsecname var.

ld/ChangeLog
ld/emultempl/elf32.em

index e4ffc360c73b0d7358bb1672801795978419da77..7d783ff146d66d2063ba403eaa2c756857dba2da 100644 (file)
@@ -1,3 +1,10 @@
+2002-10-10  Alan Modra  <amodra@bigpond.net.au>
+
+       * emultempl/elf32.em (output_rel_find): Prefer .rel script sections
+       when orphan is .rel, .rela when orphan is .rela.
+       (gld${EMULATION_NAME}_place_orphan): Handle combreloc .rel* case
+       first.  Remove outsecname var.
+
 2002-10-09  Richard Shann <richard.shann@superh.com>
            Stephen Clarke <stephen.clarke@superh.com>
 
index 7f8637483bd78897c72e796b8e33d308bc872088..62c39f442afb70b9396996b44ce75eaca927c42a 100644 (file)
@@ -75,7 +75,7 @@ static void gld${EMULATION_NAME}_before_allocation
 static boolean gld${EMULATION_NAME}_open_dynamic_archive
   PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
 static lang_output_section_statement_type *output_rel_find
-  PARAMS ((void));
+  PARAMS ((asection *));
 static asection *output_prev_sec_find
   PARAMS ((lang_output_section_statement_type *));
 static boolean gld${EMULATION_NAME}_place_orphan
@@ -996,13 +996,15 @@ cat >>e${EMULATION_NAME}.c <<EOF
 /* A variant of lang_output_section_find.  Used by place_orphan.  */
 
 static lang_output_section_statement_type *
-output_rel_find ()
+output_rel_find (sec)
+     asection *sec;
 {
   lang_statement_union_type *u;
   lang_output_section_statement_type *lookup;
   lang_output_section_statement_type *last = NULL;
   lang_output_section_statement_type *last_rel = NULL;
   lang_output_section_statement_type *last_rel_alloc = NULL;
+  int rela = sec->name[4] == 'a';
 
   for (u = lang_output_section_statement.head; u; u = lookup->next)
     {
@@ -1012,18 +1014,19 @@ output_rel_find ()
          /* Don't place after .rel.plt as doing so results in wrong
             dynamic tags.  Also, place allocated reloc sections before
             non-allocated.  */
-         int rela = lookup->name[4] == 'a';
+         int lookrela = lookup->name[4] == 'a';
 
-         if (strcmp (".plt", lookup->name + 4 + rela) == 0
+         if (strcmp (".plt", lookup->name + 4 + lookrela) == 0
              || (lookup->bfd_section != NULL
                  && (lookup->bfd_section->flags & SEC_ALLOC) == 0))
            break;
-         last_rel = lookup;
+         last = lookup;
+         if (rela == lookrela)
+           last_rel = lookup;
          if (lookup->bfd_section != NULL
              && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
            last_rel_alloc = lookup;
        }
-      last = lookup;
     }
 
   if (last_rel_alloc)
@@ -1088,13 +1091,23 @@ gld${EMULATION_NAME}_place_orphan (file, s)
   lang_statement_list_type add;
   etree_type *address;
   const char *secname;
-  const char *outsecname;
   const char *ps = NULL;
   lang_output_section_statement_type *os;
+  int isdyn = 0;
 
   secname = bfd_get_section_name (s->owner, s);
+  if (! link_info.relocateable
+      && link_info.combreloc
+      && strncmp (secname, ".rel", 4) == 0)
+    {
+      if (secname[4] == 'a')
+       secname = ".rela.dyn";
+      else
+       secname = ".rel.dyn";
+      isdyn = 1;
+    }
 
-  if (! config.unique_orphan_sections && ! unique_section_p (secname))
+  if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname)))
     {
       /* Look through the script to see where to place this section.  */
       os = lang_output_section_find (secname);
@@ -1159,7 +1172,7 @@ gld${EMULATION_NAME}_place_orphan (file, s)
   else if (strncmp (secname, ".rel", 4) == 0
           && (s->flags & SEC_LOAD) != 0
           && (hold_rel.os != NULL
-              || (hold_rel.os = output_rel_find ()) != NULL))
+              || (hold_rel.os = output_rel_find (s)) != NULL))
     place = &hold_rel;
   else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
           && HAVE_SECTION (hold_rodata, ".rodata"))
@@ -1173,13 +1186,10 @@ gld${EMULATION_NAME}_place_orphan (file, s)
   /* Choose a unique name for the section.  This will be needed if the
      same section name appears in the input file with different
      loadable or allocatable characteristics.  */
-  outsecname = secname;
-  if (bfd_get_section_by_name (output_bfd, outsecname) != NULL)
+  if (bfd_get_section_by_name (output_bfd, secname) != NULL)
     {
-      outsecname = bfd_get_unique_section_name (output_bfd,
-                                               outsecname,
-                                               &count);
-      if (outsecname == NULL)
+      secname = bfd_get_unique_section_name (output_bfd, secname, &count);
+      if (secname == NULL)
        einfo ("%F%P: place_orphan failed: %E\n");
     }
 
@@ -1200,7 +1210,7 @@ gld${EMULATION_NAME}_place_orphan (file, s)
     {
       /* If the name of the section is representable in C, then create
         symbols to mark the start and the end of the section.  */
-      for (ps = outsecname; *ps != '\0'; ps++)
+      for (ps = secname; *ps != '\0'; ps++)
        if (! ISALNUM (*ps) && *ps != '_')
          break;
       if (*ps == '\0')
@@ -1208,8 +1218,8 @@ gld${EMULATION_NAME}_place_orphan (file, s)
          char *symname;
          etree_type *e_align;
 
-         symname = (char *) xmalloc (ps - outsecname + sizeof "__start_");
-         sprintf (symname, "__start_%s", outsecname);
+         symname = (char *) xmalloc (ps - secname + sizeof "__start_");
+         sprintf (symname, "__start_%s", secname);
          e_align = exp_unop (ALIGN_K,
                              exp_intop ((bfd_vma) 1 << s->alignment_power));
          lang_add_assignment (exp_assop ('=', symname, e_align));
@@ -1221,7 +1231,7 @@ gld${EMULATION_NAME}_place_orphan (file, s)
   else
     address = NULL;
 
-  os = lang_enter_output_section_statement (outsecname, address, 0,
+  os = lang_enter_output_section_statement (secname, address, 0,
                                            (bfd_vma) 0,
                                            (etree_type *) NULL,
                                            (etree_type *) NULL,
@@ -1242,8 +1252,8 @@ gld${EMULATION_NAME}_place_orphan (file, s)
       if (place != NULL)
        stat_ptr = &add;
 
-      symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_");
-      sprintf (symname, "__stop_%s", outsecname);
+      symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
+      sprintf (symname, "__stop_%s", secname);
       lang_add_assignment (exp_assop ('=', symname,
                                      exp_nameop (NAME, ".")));
     }