]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Allow stubs without associated input section in ARM backend
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Tue, 29 Mar 2016 17:54:14 +0000 (18:54 +0100)
committerThomas Preud'homme <thomas.preudhomme@arm.com>
Tue, 29 Mar 2016 19:31:40 +0000 (20:31 +0100)
2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>

bfd/
* bfd-in.h (elf32_arm_size_stubs): Add an output section parameter.
* bfd-in2.h: Regenerated.
* elf32-arm.c (struct elf32_arm_link_hash_table): Add an output section
parameter to add_stub_section callback.
(elf32_arm_create_or_find_stub_sec): Get output section from link_sec
and pass it down to add_stub_section.
(elf32_arm_add_stub): Set section to stub_sec if NULL before using it
for error message.
(elf32_arm_size_stubs): Add output section parameter to
add_stub_section function pointer parameter.

ld/
        * emultempl/armelf.em (elf32_arm_add_stub_section): Add output_section
        parameter and rename input_section parameter to after_input_section.
        Append input stub section to the output section if after_input_section
        is NULL.

bfd/ChangeLog.arm
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elf32-arm.c
ld/ChangeLog.arm [new file with mode: 0644]
ld/emultempl/armelf.em

index 06d2d50bce2da6a50a451d3e0559953ddebb758d..d468f1e44ab77a1fee5a2c7d9a6dc902a2af405c 100644 (file)
@@ -1,3 +1,16 @@
+2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * bfd-in.h (elf32_arm_size_stubs): Add an output section parameter.
+       * bfd-in2.h: Regenerated.
+       * elf32-arm.c (struct elf32_arm_link_hash_table): Add an output section
+       parameter to add_stub_section callback.
+       (elf32_arm_create_or_find_stub_sec): Get output section from link_sec
+       and pass it down to add_stub_section.
+       (elf32_arm_add_stub): Set section to stub_sec if NULL before using it
+       for error message.
+       (elf32_arm_size_stubs): Add output section parameter to
+       add_stub_section function pointer parameter.
+
 2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * elf32-arm.c (elf32_arm_create_stub): New function.
index 1721ce7003d4a76953793b002583997e438e3cb0..7abc05878789788bc9d5a9329dc92d80a0346935 100644 (file)
@@ -934,7 +934,8 @@ extern void elf32_arm_next_input_section
   (struct bfd_link_info *, struct bfd_section *);
 extern bfd_boolean elf32_arm_size_stubs
   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
-   struct bfd_section * (*) (const char *, struct bfd_section *, unsigned int),
+   struct bfd_section * (*) (const char *, struct bfd_section *,
+                            struct bfd_section *, unsigned int),
    void (*) (void));
 extern bfd_boolean elf32_arm_build_stubs
   (struct bfd_link_info *);
index 779ffbfcc2ecedccb911963dda8db9d66456896a..3a1c486605b05957d7c6bdba86f0e4f6c3a2c231 100644 (file)
@@ -941,7 +941,8 @@ extern void elf32_arm_next_input_section
   (struct bfd_link_info *, struct bfd_section *);
 extern bfd_boolean elf32_arm_size_stubs
   (bfd *, bfd *, struct bfd_link_info *, bfd_signed_vma,
-   struct bfd_section * (*) (const char *, struct bfd_section *, unsigned int),
+   struct bfd_section * (*) (const char *, struct bfd_section *,
+                            struct bfd_section *, unsigned int),
    void (*) (void));
 extern bfd_boolean elf32_arm_build_stubs
   (struct bfd_link_info *);
index 18a1afefdb065e0db34564602508f321b2fc19ac..f1dd54b0d60a49223ac2ef0dff512e903a7ac8df 100644 (file)
@@ -3103,7 +3103,8 @@ struct elf32_arm_link_hash_table
   bfd *stub_bfd;
 
   /* Linker call-backs.  */
-  asection * (*add_stub_section) (const char *, asection *, unsigned int);
+  asection * (*add_stub_section) (const char *, asection *, asection *,
+                                 unsigned int);
   void (*layout_sections_again) (void);
 
   /* Array to keep track of which stub sections have been created, and
@@ -4081,6 +4082,7 @@ elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
 {
   asection *link_sec;
   asection *stub_sec;
+  asection *out_sec;
 
   link_sec = htab->stub_group[section->id].link_sec;
   BFD_ASSERT (link_sec != NULL);
@@ -4103,7 +4105,8 @@ elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
 
          memcpy (s_name, link_sec->name, namelen);
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
-         stub_sec = (*htab->add_stub_section) (s_name, link_sec,
+         out_sec = link_sec->output_section;
+         stub_sec = (*htab->add_stub_section) (s_name, out_sec, link_sec,
                                                htab->nacl_p ? 4 : 3);
          if (stub_sec == NULL)
            return NULL;
@@ -4139,6 +4142,8 @@ elf32_arm_add_stub (const char *stub_name,
                                     TRUE, FALSE);
   if (stub_entry == NULL)
     {
+      if (section == NULL)
+       section = stub_sec;
       (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
                             section->owner,
                             stub_name);
@@ -5153,6 +5158,7 @@ elf32_arm_size_stubs (bfd *output_bfd,
                      struct bfd_link_info *info,
                      bfd_signed_vma group_size,
                      asection * (*add_stub_section) (const char *, asection *,
+                                                     asection *,
                                                      unsigned int),
                      void (*layout_sections_again) (void))
 {
diff --git a/ld/ChangeLog.arm b/ld/ChangeLog.arm
new file mode 100644 (file)
index 0000000..ec4557e
--- /dev/null
@@ -0,0 +1,6 @@
+2016-03-29  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       * emultempl/armelf.em (elf32_arm_add_stub_section): Add output_section
+       parameter and rename input_section parameter to after_input_section.
+       Append input stub section to the output section if after_input_section
+       is NULL.
index b03aed40bf9fbd2c7b590464cbbf214b226bc02f..b6a02405efc6cba8c723be2a7b901d6b719c813c 100644 (file)
@@ -190,12 +190,12 @@ hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp)
 
 static asection *
 elf32_arm_add_stub_section (const char * stub_sec_name,
-                           asection *   input_section,
+                           asection *   output_section,
+                           asection *   after_input_section,
                            unsigned int alignment_power)
 {
   asection *stub_sec;
   flagword flags;
-  asection *output_section;
   lang_output_section_statement_type *os;
   struct hook_stub_info info;
 
@@ -208,18 +208,34 @@ elf32_arm_add_stub_section (const char * stub_sec_name,
 
   bfd_set_section_alignment (stub_file->the_bfd, stub_sec, alignment_power);
 
-  output_section = input_section->output_section;
   os = lang_output_section_get (output_section);
 
-  info.input_section = input_section;
+  info.input_section = after_input_section;
   lang_list_init (&info.add);
   lang_add_section (&info.add, stub_sec, NULL, os);
 
   if (info.add.head == NULL)
     goto err_ret;
 
-  if (hook_in_stub (&info, &os->children.head))
-    return stub_sec;
+  if (after_input_section == NULL)
+    {
+      lang_statement_union_type **lp = &os->children.head;
+      lang_statement_union_type *l, *lprev = NULL;
+
+      for (; (l = *lp) != NULL; lp = &l->header.next, lprev = l);
+
+      if (lprev)
+       lprev->header.next = info.add.head;
+      else
+       os->children.head = info.add.head;
+
+      return stub_sec;
+    }
+  else
+    {
+      if (hook_in_stub (&info, &os->children.head))
+       return stub_sec;
+    }
 
  err_ret:
   einfo ("%X%P: can not make stub section: %E\n");