bfd/
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 23 Oct 2012 09:33:56 +0000 (09:33 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Tue, 23 Oct 2012 09:33:56 +0000 (09:33 +0000)
* bfd-in.h (bfd_elf_stack_segment_size): Declare.
* bfd-in2.h: Rebuilt.
* elfxx-target.h (elf_backend_stack_align): New.
(elfNN_bed): Add it.
* elf-bfd.h (struct elf_backend_data): Add stack_align field.
* elf.c (bfd_elf_map_sections_to_segments): Pay attention to
stack_align and stacksize for PT_GNU_STACK segment.
(assign_file_positions_for_non_load_sections): Set p_memsz for
PT_GNU_STACK segment.
(copy_elf_program_header): Copy PT_GNU_STACK size.
* elflink.c (bfd_elf_stack_segment_size): New function, taken from
uclinux backends.
(bfd_elf_size_dynamic_sections): Determine
PT_GNU_STACK requirements after calling backend.  Pay attention to
stacksize.
* elf32-bfin.c (elf32_bfinfdpic_always_size_sections): Call
bfd_elf_stack_segment_size.
(elf32_bfinfdpic_modify_program_headers): Delete.
(elf32_bfingfdpic_copy_private_bfd_data): Don't copy PT_GNU_STACK
here.
(elf_backend_stack_align): Override.
(elf_backend_modify_program_headers): Don't override.
* elf32-frv.c (frvfdpic_always_size_sections): Call
bfd_elf_stack_segment_size.
(elf32_frvfdpic_modify_program_headers): Delete.
(elf32_frvfdpic_copy_private_bfd_data): Don't copy PT_GNU_STACK
here.
(elf_backend_stack_align): Override.
(elf_backend_modify_program_headers): Don't override.
* elf32-lm32.c (lm32_elf_always_size_sections): Leave
PT_GNU_STACK creation to underlying elf support.  Check
__stacksize here for backwards compatibility, and set it if
needed.
(lm32_elf_modify_segment_map): Delete.
(lm32_elf_modify_program_headers): Delete.
(elf_backend_stack_align): Override.
(elf_backend_modify_segment_map): Don't override.
(elf_backend_modify_program_headers): Don't override.
* elf32-sh.c (sh_elf_always_size_sections): Call
bfd_elf_stack_segment_size.
(sh_elf_modify_program_headers): Delete.
(sh_elf_copy_private_data): Don't copy PT_GNU_STACK
here.
(elf_backend_stack_align): Override.
(elf_backend_modify_program_headers): Don't override.
* elf32-tic6x.c (elf32_tic6x_always_size_sections): Call
bfd_elf_stack_segment_size.
(elf32_tic6x_modify_program_headers): Delete.
(elf32_tic6x_copy_private_data): Delete.
(elf_backend_stack_align): Override.
(bfd_elf32_bfd_copy_private_bfd_data): Don't override.
(elf_backend_modify_program_headers): Don't override.

include/
* bfdlink.h (struct bfd_link_info): Add stacksize option.

ld/
* ld.texinfo (stack-size): New option.
* emultempl/elf32.em: Add stack-size option.

ld/testsuite/
* ld-elf/binutils.exp: Add -z stack-size=0.
* ld-elf/elf.exp: Add stack-exec and stack-size tests.
* ld-elf/orphan-region.d: Add stack-size option. Remove xfail.
* ld-elf/stack-exec.rd: New.
* ld-elf/stack-size.rd: New.
* ld-elf/stack.s: New.
* ld-scripts/empty-aligned.d: Add stack-size option.
* ld-sh/fdpic-stack-set.d: New.
* ld-tic6x/shlib-1.rd: Remove __stacksize symbol.
* ld-tic6x/shlib-1b.rd: Likewise.
* ld-tic6x/shlib-1r.rd: Likewise.
* ld-tic6x/shlib-1rb.rd: Likewise.
* ld-tic6x/shlib-app-1.rd: Likewise.
* ld-tic6x/shlib-app-1b.rd: Likewise.
* ld-tic6x/shlib-app-1r.rd: Likewise.
* ld-tic6x/shlib-app-1rb.rd: Likewise.
* ld-tic6x/shlib-noindex.rd: Likewise.
* ld-tic6x/static-app-1.rd: Likewise.
* ld-tic6x/static-app-1b.rd: Likewise.
* ld-tic6x/static-app-1r.rd: Likewise.
* ld-tic6x/static-app-1rb.rd: Likewise.

39 files changed:
bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-bfin.c
bfd/elf32-frv.c
bfd/elf32-lm32.c
bfd/elf32-sh.c
bfd/elf32-tic6x.c
bfd/elflink.c
bfd/elfxx-target.h
include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/emultempl/elf32.em
ld/ld.texinfo
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/binutils.exp
ld/testsuite/ld-elf/elf.exp
ld/testsuite/ld-elf/orphan-region.d
ld/testsuite/ld-elf/stack-exec.rd [new file with mode: 0644]
ld/testsuite/ld-elf/stack-size.rd [new file with mode: 0644]
ld/testsuite/ld-elf/stack.s [new file with mode: 0644]
ld/testsuite/ld-scripts/empty-aligned.d
ld/testsuite/ld-sh/fdpic-stack-set.d [new file with mode: 0644]
ld/testsuite/ld-tic6x/shlib-1.rd
ld/testsuite/ld-tic6x/shlib-1b.rd
ld/testsuite/ld-tic6x/shlib-1r.rd
ld/testsuite/ld-tic6x/shlib-1rb.rd
ld/testsuite/ld-tic6x/shlib-app-1.rd
ld/testsuite/ld-tic6x/shlib-app-1b.rd
ld/testsuite/ld-tic6x/shlib-app-1r.rd
ld/testsuite/ld-tic6x/shlib-app-1rb.rd
ld/testsuite/ld-tic6x/shlib-noindex.rd
ld/testsuite/ld-tic6x/static-app-1.rd
ld/testsuite/ld-tic6x/static-app-1b.rd
ld/testsuite/ld-tic6x/static-app-1r.rd
ld/testsuite/ld-tic6x/static-app-1rb.rd

index 4bb6d539380b5e97d852fe6f771a4926997ae09a..599e0bf969b218d59f27cce3d514da0e05022ee0 100644 (file)
@@ -1,3 +1,58 @@
+2012-10-23  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * bfd-in.h (bfd_elf_stack_segment_size): Declare.
+       * bfd-in2.h: Rebuilt.
+       * elfxx-target.h (elf_backend_stack_align): New.
+       (elfNN_bed): Add it.
+       * elf-bfd.h (struct elf_backend_data): Add stack_align field.
+       * elf.c (bfd_elf_map_sections_to_segments): Pay attention to
+       stack_align and stacksize for PT_GNU_STACK segment.
+       (assign_file_positions_for_non_load_sections): Set p_memsz for
+       PT_GNU_STACK segment.
+       (copy_elf_program_header): Copy PT_GNU_STACK size.
+       * elflink.c (bfd_elf_stack_segment_size): New function, taken from
+       uclinux backends.
+       (bfd_elf_size_dynamic_sections): Determine
+       PT_GNU_STACK requirements after calling backend.  Pay attention to
+       stacksize.
+       * elf32-bfin.c (elf32_bfinfdpic_always_size_sections): Call
+       bfd_elf_stack_segment_size.
+       (elf32_bfinfdpic_modify_program_headers): Delete.
+       (elf32_bfingfdpic_copy_private_bfd_data): Don't copy PT_GNU_STACK
+       here.
+       (elf_backend_stack_align): Override.
+       (elf_backend_modify_program_headers): Don't override.
+       * elf32-frv.c (frvfdpic_always_size_sections): Call
+       bfd_elf_stack_segment_size.
+       (elf32_frvfdpic_modify_program_headers): Delete.
+       (elf32_frvfdpic_copy_private_bfd_data): Don't copy PT_GNU_STACK
+       here.
+       (elf_backend_stack_align): Override.
+       (elf_backend_modify_program_headers): Don't override.
+       * elf32-lm32.c (lm32_elf_always_size_sections): Leave
+       PT_GNU_STACK creation to underlying elf support.  Check
+       __stacksize here for backwards compatibility, and set it if
+       needed.
+       (lm32_elf_modify_segment_map): Delete.
+       (lm32_elf_modify_program_headers): Delete.
+       (elf_backend_stack_align): Override.
+       (elf_backend_modify_segment_map): Don't override.
+       (elf_backend_modify_program_headers): Don't override.
+       * elf32-sh.c (sh_elf_always_size_sections): Call
+       bfd_elf_stack_segment_size.
+       (sh_elf_modify_program_headers): Delete.
+       (sh_elf_copy_private_data): Don't copy PT_GNU_STACK
+       here.
+       (elf_backend_stack_align): Override.
+       (elf_backend_modify_program_headers): Don't override.
+       * elf32-tic6x.c (elf32_tic6x_always_size_sections): Call
+       bfd_elf_stack_segment_size.
+       (elf32_tic6x_modify_program_headers): Delete.
+       (elf32_tic6x_copy_private_data): Delete.
+       (elf_backend_stack_align): Override.
+       (bfd_elf32_bfd_copy_private_bfd_data): Don't override.
+       (elf_backend_modify_program_headers): Don't override.
+
 2012-10-22  Alan Modra  <amodra@gmail.com>
 
        * cache.c (cache_bmmap): Don't use void* arithmetic.
index a8c2db1daab323c7d6572668a41b09be0e646e0a..968b72c816a77fe467abb79ac8e224f105bd1be0 100644 (file)
@@ -648,6 +648,8 @@ extern struct bfd_link_needed_list *bfd_elf_get_needed_list
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean bfd_elf_get_bfd_needed_list
   (bfd *, struct bfd_link_needed_list **);
+extern bfd_boolean bfd_elf_stack_segment_size (bfd *, struct bfd_link_info *,
+                                              const char *, bfd_vma);
 extern bfd_boolean bfd_elf_size_dynamic_sections
   (bfd *, const char *, const char *, const char *, const char *, const char *,
    const char * const *, struct bfd_link_info *, struct bfd_section **);
index 919f51a2e9fb82f26814e0be464863ee1a5ac88c..e94e3c849d9f4a232e874557590a02122973c740 100644 (file)
@@ -655,6 +655,8 @@ extern struct bfd_link_needed_list *bfd_elf_get_needed_list
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean bfd_elf_get_bfd_needed_list
   (bfd *, struct bfd_link_needed_list **);
+extern bfd_boolean bfd_elf_stack_segment_size (bfd *, struct bfd_link_info *,
+                                              const char *, bfd_vma);
 extern bfd_boolean bfd_elf_size_dynamic_sections
   (bfd *, const char *, const char *, const char *, const char *, const char *,
    const char * const *, struct bfd_link_info *, struct bfd_section **);
index 3709af9f9c9674fc1e1b0acf2759e4ba58055828..b8d82b1b7f9b96aacf6c714f41b7249166989fd6 100644 (file)
@@ -1285,6 +1285,9 @@ struct elf_backend_data
   /* This is non-zero if static TLS segments require a special alignment.  */
   unsigned static_tls_alignment;
 
+  /* Alignment for the PT_GNU_STACK segment. */
+  unsigned stack_align;
+
   /* This is TRUE if the linker should act like collect and gather
      global constructors and destructors by name.  This is TRUE for
      MIPS ELF because the Irix 5 tools can not handle the .init
index f01480bf836f25d3a5078a2c6b51e78bc72aaf15..cab1cc74c784c2e89d014ff6e68946bd4101dba4 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4140,7 +4140,14 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
          m->next = NULL;
          m->p_type = PT_GNU_STACK;
          m->p_flags = elf_tdata (abfd)->stack_flags;
+         m->p_align = bed->stack_align;
          m->p_flags_valid = 1;
+         m->p_align_valid = m->p_align != 0;
+         if (info->stacksize > 0)
+           {
+             m->p_size = info->stacksize;
+             m->p_size_valid = 1;
+           }
 
          *pm = m;
          pm = &m->next;
@@ -5022,6 +5029,11 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
              p->p_type = PT_NULL;
            }
        }
+      else if (p->p_type == PT_GNU_STACK)
+       {
+         if (m->p_size_valid)
+           p->p_memsz = m->p_size;
+       }
       else if (m->count != 0)
        {
          if (p->p_type != PT_LOAD
@@ -6166,12 +6178,15 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
       map->p_align_valid = 1;
       map->p_vaddr_offset = 0;
 
-      if (map->p_type == PT_GNU_RELRO)
+      if (map->p_type == PT_GNU_RELRO
+         || map->p_type == PT_GNU_STACK)
        {
          /* The PT_GNU_RELRO segment may contain the first a few
             bytes in the .got.plt section even if the whole .got.plt
             section isn't in the PT_GNU_RELRO segment.  We won't
-            change the size of the PT_GNU_RELRO segment.  */
+            change the size of the PT_GNU_RELRO segment.
+            Similarly, PT_GNU_STACK size is significant on uclinux
+            systems.    */
          map->p_size = segment->p_memsz;
          map->p_size_valid = 1;
        }
index 61734332a7c274b2073cb897cfa845b468760dc6..c8e089b7f0aee298c6ce01be8d520d6e823918c9 100644 (file)
@@ -4311,35 +4311,10 @@ static bfd_boolean
 elf32_bfinfdpic_always_size_sections (bfd *output_bfd,
                                     struct bfd_link_info *info)
 {
-  if (!info->relocatable)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Force a PT_GNU_STACK segment to be created.  */
-      if (! elf_tdata (output_bfd)->stack_flags)
-       elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
-
-      /* Define __stacksize if it's not defined yet.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (! h || h->root.type != bfd_link_hash_defined
-         || h->type != STT_OBJECT
-         || !h->def_regular)
-       {
-         struct bfd_link_hash_entry *bh = NULL;
-
-         if (!(_bfd_generic_link_add_one_symbol
-               (info, output_bfd, "__stacksize",
-                BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
-                (const char *) NULL, FALSE,
-                get_elf_backend_data (output_bfd)->collect, &bh)))
-           return FALSE;
-
-         h = (struct elf_link_hash_entry *) bh;
-         h->def_regular = 1;
-         h->type = STT_OBJECT;
-       }
-    }
+  if (!info->relocatable
+      && !bfd_elf_stack_segment_size (output_bfd, info,
+                                     "__stacksize", DEFAULT_STACK_SIZE))
+    return FALSE;
 
   return TRUE;
 }
@@ -4459,51 +4434,6 @@ bfinfdpic_elf_discard_info (bfd *ibfd,
   return TRUE;
 }
 
-static bfd_boolean
-elf32_bfinfdpic_modify_program_headers (bfd *output_bfd,
-                                       struct bfd_link_info *info)
-{
-  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
-  struct elf_segment_map *m;
-  Elf_Internal_Phdr *p;
-
-  /* objcopy and strip preserve what's already there using
-     elf32_bfinfdpic_copy_private_bfd_data ().  */
-  if (! info)
-    return TRUE;
-
-  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
-    if (m->p_type == PT_GNU_STACK)
-      break;
-
-  if (m)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Obtain the pointer to the __stacksize symbol.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (h)
-       {
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *) h->root.u.i.link;
-         BFD_ASSERT (h->root.type == bfd_link_hash_defined);
-       }
-
-      /* Set the header p_memsz from the symbol value.  We
-        intentionally ignore the symbol section.  */
-      if (h && h->root.type == bfd_link_hash_defined)
-       p->p_memsz = h->root.u.def.value;
-      else
-       p->p_memsz = DEFAULT_STACK_SIZE;
-
-      p->p_align = 8;
-    }
-
-  return TRUE;
-}
-
 static bfd_boolean
 elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd,
                                        struct bfd_link_info *info)
@@ -5017,8 +4947,6 @@ bfin_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 static bfd_boolean
 elf32_bfinfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
-  unsigned i;
-
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
@@ -5030,31 +4958,6 @@ elf32_bfinfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
       || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
     return TRUE;
 
-  /* Copy the stack size.  */
-  for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
-    if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
-      {
-       Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
-
-       for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
-         if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
-           {
-             memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
-
-             /* Rewrite the phdrs, since we're only called after they
-                were first written.  */
-             if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
-                           ->s->sizeof_ehdr, SEEK_SET) != 0
-                 || get_elf_backend_data (obfd)->s
-                 ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
-                                    elf_elfheader (obfd)->e_phnum) != 0)
-               return FALSE;
-             break;
-           }
-
-       break;
-      }
-
   return TRUE;
 }
 
@@ -5802,6 +5705,7 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #define elf_backend_final_write_processing \
                                         elf32_bfin_final_write_processing
 #define elf_backend_reloc_type_class    elf32_bfin_reloc_type_class
+#define elf_backend_stack_align                8
 #define elf_backend_can_gc_sections 1
 #define elf_backend_special_sections   elf32_bfin_special_sections
 #define elf_backend_can_refcount 1
@@ -5837,9 +5741,6 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #undef elf_backend_always_size_sections
 #define elf_backend_always_size_sections \
                elf32_bfinfdpic_always_size_sections
-#undef elf_backend_modify_program_headers
-#define elf_backend_modify_program_headers \
-               elf32_bfinfdpic_modify_program_headers
 #undef bfd_elf32_bfd_copy_private_bfd_data
 #define bfd_elf32_bfd_copy_private_bfd_data \
                elf32_bfinfdpic_copy_private_bfd_data
index 271ec024b50c04655f3da907c59d4bd8b2729e78..148173308d70d49d81778c8b4844ee9fcc7f0a6f 100644 (file)
@@ -5494,36 +5494,10 @@ static bfd_boolean
 elf32_frvfdpic_always_size_sections (bfd *output_bfd,
                                     struct bfd_link_info *info)
 {
-  if (!info->relocatable)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Force a PT_GNU_STACK segment to be created.  */
-      if (! elf_tdata (output_bfd)->stack_flags)
-       elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
-
-      /* Define __stacksize if it's not defined yet.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (! h || h->root.type != bfd_link_hash_defined
-         || h->type != STT_OBJECT
-         || !h->def_regular)
-       {
-         struct bfd_link_hash_entry *bh = NULL;
-
-         if (!(_bfd_generic_link_add_one_symbol
-               (info, output_bfd, "__stacksize",
-                BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
-                (const char *) NULL, FALSE,
-                get_elf_backend_data (output_bfd)->collect, &bh)))
-           return FALSE;
-
-         h = (struct elf_link_hash_entry *) bh;
-         h->def_regular = 1;
-         h->type = STT_OBJECT;
-         /* This one must NOT be hidden.  */
-       }
-    }
+  if (!info->relocatable
+      && !bfd_elf_stack_segment_size (output_bfd, info,
+                                     "__stacksize", DEFAULT_STACK_SIZE))
+    return FALSE;
 
   return TRUE;
 }
@@ -5720,51 +5694,6 @@ elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
   return TRUE;
 }
 
-static bfd_boolean
-elf32_frvfdpic_modify_program_headers (bfd *output_bfd,
-                                      struct bfd_link_info *info)
-{
-  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
-  struct elf_segment_map *m;
-  Elf_Internal_Phdr *p;
-
-  /* objcopy and strip preserve what's already there using
-     elf32_frvfdpic_copy_private_bfd_data ().  */
-  if (! info)
-    return TRUE;
-
-  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
-    if (m->p_type == PT_GNU_STACK)
-      break;
-
-  if (m)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Obtain the pointer to the __stacksize symbol.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (h)
-       {
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *) h->root.u.i.link;
-         BFD_ASSERT (h->root.type == bfd_link_hash_defined);
-       }
-
-      /* Set the header p_memsz from the symbol value.  We
-        intentionally ignore the symbol section.  */
-      if (h && h->root.type == bfd_link_hash_defined)
-       p->p_memsz = h->root.u.def.value;
-      else
-       p->p_memsz = DEFAULT_STACK_SIZE;
-
-      p->p_align = 8;
-    }
-
-  return TRUE;
-}
-
 /* Fill in code and data in dynamic sections.  */
 
 static bfd_boolean
@@ -6431,8 +6360,6 @@ frv_elf_arch_extension_p (flagword base, flagword extension)
 static bfd_boolean
 elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
-  unsigned i;
-
   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
     return TRUE;
@@ -6444,31 +6371,6 @@ elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
       || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr)
     return TRUE;
 
-  /* Copy the stack size.  */
-  for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
-    if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
-      {
-       Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
-
-       for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
-         if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
-           {
-             memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
-
-             /* Rewrite the phdrs, since we're only called after they
-                were first written.  */
-             if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd)
-                           ->s->sizeof_ehdr, SEEK_SET) != 0
-                 || get_elf_backend_data (obfd)->s
-                 ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
-                                    elf_elfheader (obfd)->e_phnum) != 0)
-               return FALSE;
-             break;
-           }
-
-       break;
-      }
-
   return TRUE;
 }
 
@@ -6920,6 +6822,7 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define elf_backend_object_p                   elf32_frv_object_p
 #define elf_backend_add_symbol_hook             elf32_frv_add_symbol_hook
 
+#define elf_backend_stack_align                        8
 #define elf_backend_can_gc_sections            1
 #define elf_backend_rela_normal                        1
 
@@ -6964,9 +6867,6 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #undef elf_backend_always_size_sections
 #define elf_backend_always_size_sections \
                elf32_frvfdpic_always_size_sections
-#undef elf_backend_modify_program_headers
-#define elf_backend_modify_program_headers \
-               elf32_frvfdpic_modify_program_headers
 #undef bfd_elf32_bfd_copy_private_bfd_data
 #define bfd_elf32_bfd_copy_private_bfd_data \
                elf32_frvfdpic_copy_private_bfd_data
index f40536c295dedc5ec56c0c0ab98eae0f826e8fd3..2579034dab748dd708a9069a59ea79dad759a3e9 100644 (file)
@@ -2615,135 +2615,22 @@ lm32_elf_copy_indirect_symbol (struct bfd_link_info *info,
 }
 
 static bfd_boolean
-lm32_elf_always_size_sections (bfd *output_bfd,
-                                struct bfd_link_info *info)
+lm32_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   if (!info->relocatable)
     {
-      struct elf_link_hash_entry *h;
-
-      /* Force a PT_GNU_STACK segment to be created.  */
-      if (! elf_tdata (output_bfd)->stack_flags)
-       elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
-
-      /* Define __stacksize if it's not defined yet.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (! h || h->root.type != bfd_link_hash_defined
-         || h->type != STT_OBJECT
-         || !h->def_regular)
-       {
-         struct bfd_link_hash_entry *bh = NULL;
-
-         if (!(_bfd_generic_link_add_one_symbol
-               (info, output_bfd, "__stacksize",
-                BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
-                (const char *) NULL, FALSE,
-                get_elf_backend_data (output_bfd)->collect, &bh)))
-           return FALSE;
-
-         h = (struct elf_link_hash_entry *) bh;
-         h->def_regular = 1;
-         h->type = STT_OBJECT;
-         /* This one must NOT be hidden.  */
-       }
-    }
+      if (!bfd_elf_stack_segment_size (output_bfd, info,
+                                      "__stacksize", DEFAULT_STACK_SIZE))
+       return FALSE;
 
-  return TRUE;
-}
-
-static bfd_boolean
-lm32_elf_modify_segment_map (bfd *output_bfd,
-                            struct bfd_link_info *info)
-{
-  struct elf_segment_map *m;
-
-  /* objcopy and strip preserve what's already there using elf32_lm32fdpic_copy_
-     private_bfd_data ().  */
-  if (! info)
-    return TRUE;
-
-  for (m = elf_tdata (output_bfd)->segment_map; m != NULL; m = m->next)
-    if (m->p_type == PT_GNU_STACK)
-      break;
-
-  if (m)
-    {
       asection *sec = bfd_get_section_by_name (output_bfd, ".stack");
-      struct elf_link_hash_entry *h;
-
       if (sec)
-       {
-         /* Obtain the pointer to the __stacksize symbol.  */
-         h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                                   FALSE, FALSE, FALSE);
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *)h->root.u.i.link;
-         BFD_ASSERT (h->root.type == bfd_link_hash_defined);
-
-         /* Set the section size from the symbol value.  We
-            intentionally ignore the symbol section.  */
-         if (h->root.type == bfd_link_hash_defined)
-           sec->size = h->root.u.def.value;
-         else
-           sec->size = DEFAULT_STACK_SIZE;
-
-         /* Add the stack section to the PT_GNU_STACK segment,
-            such that its size and alignment requirements make it
-            to the segment.  */
-         m->sections[m->count] = sec;
-         m->count++;
-       }
+       sec->size = info->stacksize >= 0 ? info->stacksize : 0;
     }
 
   return TRUE;
 }
 
-static bfd_boolean
-lm32_elf_modify_program_headers (bfd *output_bfd,
-                                      struct bfd_link_info *info)
-{
-  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
-  struct elf_segment_map *m;
-  Elf_Internal_Phdr *p;
-
-  if (! info)
-    return TRUE;
-
-  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
-    if (m->p_type == PT_GNU_STACK)
-      break;
-
-  if (m)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Obtain the pointer to the __stacksize symbol.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (h)
-       {
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *) h->root.u.i.link;
-         BFD_ASSERT (h->root.type == bfd_link_hash_defined);
-       }
-
-      /* Set the header p_memsz from the symbol value.  We
-        intentionally ignore the symbol section.  */
-      if (h && h->root.type == bfd_link_hash_defined)
-       p->p_memsz = h->root.u.def.value;
-      else
-       p->p_memsz = DEFAULT_STACK_SIZE;
-
-      p->p_align = 8;
-    }
-
-  return TRUE;
-}
-
-
 static bfd_boolean
 lm32_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
@@ -2822,6 +2709,7 @@ lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 #define elf_backend_rela_normal                 1
 #define elf_backend_object_p                    lm32_elf_object_p
 #define elf_backend_final_write_processing      lm32_elf_final_write_processing
+#define elf_backend_stack_align                        8
 #define elf_backend_can_gc_sections             1
 #define elf_backend_can_refcount                1
 #define elf_backend_gc_mark_hook                lm32_elf_gc_mark_hook
@@ -2857,10 +2745,6 @@ lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 
 #undef  elf_backend_always_size_sections
 #define elf_backend_always_size_sections        lm32_elf_always_size_sections
-#undef  elf_backend_modify_segment_map
-#define elf_backend_modify_segment_map          lm32_elf_modify_segment_map
-#undef  elf_backend_modify_program_headers
-#define elf_backend_modify_program_headers      lm32_elf_modify_program_headers
 #undef  bfd_elf32_bfd_copy_private_bfd_data
 #define bfd_elf32_bfd_copy_private_bfd_data     lm32_elf_fdpic_copy_private_bfd_data
 
index df4affd682d3beea5c6f7af73b47a44715da4a03..8540f9f0fedee8b91df08077736c3fefae9ef99e 100644 (file)
@@ -3314,86 +3314,13 @@ sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared);
 
-  if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Force a PT_GNU_STACK segment to be created.  */
-      if (! elf_tdata (output_bfd)->stack_flags)
-       elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
-
-      /* Define __stacksize if it's not defined yet.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (! h || h->root.type != bfd_link_hash_defined
-         || h->type != STT_OBJECT
-         || !h->def_regular)
-       {
-         struct bfd_link_hash_entry *bh = NULL;
-
-         if (!(_bfd_generic_link_add_one_symbol
-               (info, output_bfd, "__stacksize",
-                BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
-                (const char *) NULL, FALSE,
-                get_elf_backend_data (output_bfd)->collect, &bh)))
-           return FALSE;
-
-         h = (struct elf_link_hash_entry *) bh;
-         h->def_regular = 1;
-         h->type = STT_OBJECT;
-       }
-    }
-  return TRUE;
-}
-
-#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
-
-static bfd_boolean
-sh_elf_modify_program_headers (bfd *output_bfd, struct bfd_link_info *info)
-{
-  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
-  struct elf_segment_map *m;
-  Elf_Internal_Phdr *p;
-
-  /* objcopy and strip preserve what's already there using
-     sh_elf_copy_private_bfd_data ().  */
-  if (! info)
-    return TRUE;
-
-  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
-    if (m->p_type == PT_GNU_STACK)
-      break;
-
-  if (m)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Obtain the pointer to the __stacksize symbol.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (h)
-       {
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *) h->root.u.i.link;
-         BFD_ASSERT (h->root.type == bfd_link_hash_defined);
-       }
-
-      /* Set the header p_memsz from the symbol value.  We
-        intentionally ignore the symbol section.  */
-      if (h && h->root.type == bfd_link_hash_defined)
-       p->p_memsz = h->root.u.def.value;
-      else
-       p->p_memsz = DEFAULT_STACK_SIZE;
-
-      p->p_align = 8;
-    }
-
+  if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable
+      && !bfd_elf_stack_segment_size (output_bfd, info,
+                                     "__stacksize", DEFAULT_STACK_SIZE))
+    return FALSE;
   return TRUE;
 }
 
-#endif
-
 /* Set the sizes of the dynamic sections.  */
 
 static bfd_boolean
@@ -6683,38 +6610,6 @@ sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
   if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd))
     return TRUE;
 
-  /* Copy the stack size.  */
-  if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
-      && fdpic_object_p (ibfd) && fdpic_object_p (obfd))
-    {
-      unsigned i;
-
-      for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
-       if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
-         {
-           Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
-
-           for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
-             if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
-               {
-                 memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
-
-                 /* Rewrite the phdrs, since we're only called after they
-                    were first written.  */
-                 if (bfd_seek (obfd,
-                               (bfd_signed_vma) get_elf_backend_data (obfd)
-                               ->s->sizeof_ehdr, SEEK_SET) != 0
-                     || get_elf_backend_data (obfd)->s
-                     ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
-                                        elf_elfheader (obfd)->e_phnum) != 0)
-                   return FALSE;
-                 break;
-               }
-
-           break;
-         }
-    }
-
   return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
 }
 #endif /* not sh_elf_copy_private_data */
@@ -7587,6 +7482,7 @@ sh_elf_encode_eh_address (bfd *abfd,
 #define elf_backend_encode_eh_address \
                                        sh_elf_encode_eh_address
 
+#define elf_backend_stack_align                8
 #define elf_backend_can_gc_sections    1
 #define elf_backend_can_refcount       1
 #define elf_backend_want_got_plt       1
@@ -7649,9 +7545,6 @@ sh_elf_encode_eh_address (bfd *abfd,
 #define        TARGET_LITTLE_SYM               bfd_elf32_shfd_vec
 #undef TARGET_LITTLE_NAME
 #define        TARGET_LITTLE_NAME              "elf32-sh-fdpic"
-#undef elf_backend_modify_program_headers
-#define elf_backend_modify_program_headers \
-                                       sh_elf_modify_program_headers
 
 #undef elf32_bed
 #define        elf32_bed                       elf32_sh_fd_bed
index ef0d1555a9976eba0313c649c3c9ddc550d3fb1f..419b269e35d797114772a670678be6ccef34fba4 100644 (file)
@@ -3520,79 +3520,10 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
 static bfd_boolean
 elf32_tic6x_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
-  if (elf32_tic6x_using_dsbt (output_bfd) && !info->relocatable)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Force a PT_GNU_STACK segment to be created.  */
-      if (! elf_tdata (output_bfd)->stack_flags)
-       elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
-
-      /* Define __stacksize if it's not defined yet.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (! h || h->root.type != bfd_link_hash_defined
-         || h->type != STT_OBJECT
-         || !h->def_regular)
-       {
-         struct bfd_link_hash_entry *bh = NULL;
-
-         if (!(_bfd_generic_link_add_one_symbol
-               (info, output_bfd, "__stacksize",
-                BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE,
-                (const char *) NULL, FALSE,
-                get_elf_backend_data (output_bfd)->collect, &bh)))
-           return FALSE;
-
-         h = (struct elf_link_hash_entry *) bh;
-         h->def_regular = 1;
-         h->type = STT_OBJECT;
-       }
-    }
-  return TRUE;
-}
-
-static bfd_boolean
-elf32_tic6x_modify_program_headers (bfd *output_bfd,
-                                   struct bfd_link_info *info)
-{
-  struct elf_obj_tdata *tdata = elf_tdata (output_bfd);
-  struct elf_segment_map *m;
-  Elf_Internal_Phdr *p;
-
-  /* objcopy and strip preserve what's already there using
-     elf32_tic6x_copy_private_bfd_data ().  */
-  if (! info)
-    return TRUE;
-
-  for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++)
-    if (m->p_type == PT_GNU_STACK)
-      break;
-
-  if (m)
-    {
-      struct elf_link_hash_entry *h;
-
-      /* Obtain the pointer to the __stacksize symbol.  */
-      h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize",
-                               FALSE, FALSE, FALSE);
-      if (h)
-       {
-         while (h->root.type == bfd_link_hash_indirect
-                || h->root.type == bfd_link_hash_warning)
-           h = (struct elf_link_hash_entry *) h->root.u.i.link;
-         BFD_ASSERT (h->root.type == bfd_link_hash_defined);
-       }
-
-      /* Set the header p_memsz from the symbol value.  We
-        intentionally ignore the symbol section.  */
-      if (h && h->root.type == bfd_link_hash_defined)
-       p->p_memsz = h->root.u.def.value;
-      else
-       p->p_memsz = DEFAULT_STACK_SIZE;
-
-      p->p_align = 8;
-    }
+  if (elf32_tic6x_using_dsbt (output_bfd) && !info->relocatable
+      && !bfd_elf_stack_segment_size (output_bfd, info,
+                                     "__stacksize", DEFAULT_STACK_SIZE))
+    return FALSE;
 
   return TRUE;
 }
@@ -4020,49 +3951,6 @@ elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   return TRUE;
 }
 
-static bfd_boolean
-elf32_tic6x_copy_private_data (bfd * ibfd, bfd * obfd)
-{
-  _bfd_elf_copy_private_bfd_data (ibfd, obfd);
-
-  if (! is_tic6x_elf (ibfd) || ! is_tic6x_elf (obfd))
-    return TRUE;
-
-  /* Copy the stack size.  */
-  if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr
-      && elf32_tic6x_using_dsbt (ibfd) && elf32_tic6x_using_dsbt (obfd))
-    {
-      unsigned i;
-
-      for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++)
-       if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK)
-         {
-           Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i];
-
-           for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++)
-             if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK)
-               {
-                 memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr));
-
-                 /* Rewrite the phdrs, since we're only called after they
-                    were first written.  */
-                 if (bfd_seek (obfd,
-                               (bfd_signed_vma) get_elf_backend_data (obfd)
-                               ->s->sizeof_ehdr, SEEK_SET) != 0
-                     || get_elf_backend_data (obfd)->s
-                     ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr,
-                                        elf_elfheader (obfd)->e_phnum) != 0)
-                   return FALSE;
-                 break;
-               }
-
-           break;
-         }
-    }
-
-  return TRUE;
-}
-
 /* Add a new unwind edit to the list described by HEAD, TAIL.  If TINDEX is zero,
    adds the edit to the start of the list.  (The list must be built in order of
    ascending TINDEX: the function's callers are primarily responsible for
@@ -4484,12 +4372,12 @@ elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info)
 #define ELF_MAXPAGESIZE                0x1000
 #define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup
 #define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup
-#define bfd_elf32_bfd_copy_private_bfd_data    elf32_tic6x_copy_private_data
 #define bfd_elf32_bfd_merge_private_bfd_data   elf32_tic6x_merge_private_bfd_data
 #define bfd_elf32_mkobject             elf32_tic6x_mkobject
 #define bfd_elf32_bfd_link_hash_table_create  elf32_tic6x_link_hash_table_create
 #define bfd_elf32_bfd_link_hash_table_free    elf32_tic6x_link_hash_table_free
 #define bfd_elf32_new_section_hook     elf32_tic6x_new_section_hook
+#define elf_backend_stack_align                8
 #define elf_backend_can_gc_sections    1
 #define elf_backend_default_use_rela_p 1
 #define elf_backend_may_use_rel_p      1
@@ -4509,8 +4397,6 @@ elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info)
 #define elf_backend_fake_sections       elf32_tic6x_fake_sections
 #define elf_backend_gc_sweep_hook      elf32_tic6x_gc_sweep_hook
 #define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections
-#define elf_backend_modify_program_headers \
-  elf32_tic6x_modify_program_headers
 #define elf_backend_create_dynamic_sections \
   elf32_tic6x_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol \
index 232c0b13c5aacfbd55074098634815f7a0385443..f22e023df88c76b2ca055e2f384d38faa78e64d1 100644 (file)
@@ -5567,6 +5567,65 @@ _bfd_elf_size_group_sections (struct bfd_link_info *info)
   return TRUE;
 }
 
+/* Set a default stack segment size.  The value in INFO wins.  If it
+   is unset, LEGACY_SYMBOL's value is used, and if that symbol is
+   undefined it is initialized.  */
+
+bfd_boolean
+bfd_elf_stack_segment_size (bfd *output_bfd,
+                           struct bfd_link_info *info,
+                           const char *legacy_symbol,
+                           bfd_vma default_size)
+{
+  struct elf_link_hash_entry *h = NULL;
+
+  /* Look for legacy symbol.  */
+  if (legacy_symbol)
+    h = elf_link_hash_lookup (elf_hash_table (info), legacy_symbol,
+                             FALSE, FALSE, FALSE);
+  if (h && (h->root.type == bfd_link_hash_defined
+           || h->root.type == bfd_link_hash_defweak)
+      && h->def_regular
+      && (h->type == STT_NOTYPE || h->type == STT_OBJECT))
+    {
+      /* The symbol has no type if specified on the command line.  */
+      h->type = STT_OBJECT;
+      if (info->stacksize)
+       (*_bfd_error_handler) (_("%B: stack size specified and %s set"),
+                              output_bfd, legacy_symbol);
+      else if (h->root.u.def.section != bfd_abs_section_ptr)
+       (*_bfd_error_handler) (_("%B: %s not absolute"),
+                              output_bfd, legacy_symbol);
+      else
+       info->stacksize = h->root.u.def.value;
+    }
+
+  if (!info->stacksize)
+    /* If the user didn't set a size, or explicitly inhibit the
+       size, set it now.  */
+    info->stacksize = default_size;
+
+  /* Provide the legacy symbol, if it is referenced.  */
+  if (h && (h->root.type == bfd_link_hash_undefined
+           || h->root.type == bfd_link_hash_undefweak))
+    {
+      struct bfd_link_hash_entry *bh = NULL;
+
+      if (!(_bfd_generic_link_add_one_symbol
+           (info, output_bfd, legacy_symbol,
+            BSF_GLOBAL, bfd_abs_section_ptr,
+            info->stacksize >= 0 ? info->stacksize : 0,
+            NULL, FALSE, get_elf_backend_data (output_bfd)->collect, &bh)))
+       return FALSE;
+
+      h = (struct elf_link_hash_entry *) bh;
+      h->def_regular = 1;
+      h->type = STT_OBJECT;
+    }
+
+  return TRUE;
+}
+
 /* Set up the sizes and contents of the ELF dynamic sections.  This is
    called by the ELF linker emulation before_allocation routine.  We
    must set the sizes of the sections before the linker sets the
@@ -5596,6 +5655,26 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
     return TRUE;
 
   bed = get_elf_backend_data (output_bfd);
+
+  /* Any syms created from now on start with -1 in
+     got.refcount/offset and plt.refcount/offset.  */
+  elf_hash_table (info)->init_got_refcount
+    = elf_hash_table (info)->init_got_offset;
+  elf_hash_table (info)->init_plt_refcount
+    = elf_hash_table (info)->init_plt_offset;
+
+  if (info->relocatable
+      && !_bfd_elf_size_group_sections (info))
+    return FALSE;
+
+  /* The backend may have to create some sections regardless of whether
+     we're dynamic or not.  */
+  if (bed->elf_backend_always_size_sections
+      && ! (*bed->elf_backend_always_size_sections) (output_bfd, info))
+    return FALSE;
+
+  /* Determine any GNU_STACK segment requirements, after the backend
+     has had a chance to set a default segment size.  */
   if (info->execstack)
     elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
   else if (info->noexecstack)
@@ -5625,32 +5704,13 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
          else if (bed->default_execstack)
            exec = PF_X;
        }
-      if (notesec)
-       {
-         elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | exec;
-         if (exec && info->relocatable
-             && notesec->output_section != bfd_abs_section_ptr)
-           notesec->output_section->flags |= SEC_CODE;
-       }
+      if (notesec || info->stacksize > 0)
+       elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | exec;
+      if (notesec && exec && info->relocatable
+         && notesec->output_section != bfd_abs_section_ptr)
+       notesec->output_section->flags |= SEC_CODE;
     }
 
-  /* Any syms created from now on start with -1 in
-     got.refcount/offset and plt.refcount/offset.  */
-  elf_hash_table (info)->init_got_refcount
-    = elf_hash_table (info)->init_got_offset;
-  elf_hash_table (info)->init_plt_refcount
-    = elf_hash_table (info)->init_plt_offset;
-
-  if (info->relocatable
-      && !_bfd_elf_size_group_sections (info))
-    return FALSE;
-
-  /* The backend may have to create some sections regardless of whether
-     we're dynamic or not.  */
-  if (bed->elf_backend_always_size_sections
-      && ! (*bed->elf_backend_always_size_sections) (output_bfd, info))
-    return FALSE;
-
   dynobj = elf_hash_table (info)->dynobj;
 
   if (dynobj != NULL && elf_hash_table (info)->dynamic_sections_created)
index 5a6cae02ee3f5eb5370eb8a6cb88e1a5132b370b..241743ab42c7324c2a298d1a1b27999653ff08f7 100644 (file)
 #ifndef elf_backend_default_execstack
 #define elf_backend_default_execstack 1
 #endif
+#ifndef elf_backend_stack_align
+#define elf_backend_stack_align 16
+#endif
 
 #define bfd_elfNN_bfd_debug_info_start bfd_void
 #define bfd_elfNN_bfd_debug_info_end   bfd_void
@@ -770,6 +773,7 @@ static struct elf_backend_data elfNN_bed =
   elf_backend_obj_attrs_order,
   elf_backend_obj_attrs_handle_unknown,
   elf_backend_static_tls_alignment,
+  elf_backend_stack_align,
   elf_backend_collect,
   elf_backend_type_change_ok,
   elf_backend_may_use_rel_p,
index a731efb52244283196d1fa61e7bba467371bac0b..e4b1a2dc53d57f43b9511b2193579494e5f20c9e 100644 (file)
@@ -1,3 +1,7 @@
+2012-10-23  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * bfdlink.h (struct bfd_link_info): Add stacksize option.
+
 2012-10-22  Jan Beich  <jbeich@tormail.org>
 
        PR ld/14426
index aaac24495ff8d5c30efded0b0ee6418a91272866..3ff1c92849c5d33a8a499ecb0eee4534cca67eb7 100644 (file)
@@ -416,6 +416,10 @@ struct bfd_link_info
   /* Separator between archive and filename in linker script filespecs.  */
   char path_separator;
 
+  /* Default stack size.  Zero means default (often zero itself), -1
+     means explicitly zero-sized.  */
+  bfd_signed_vma stacksize;
+
   /* Function callbacks.  */
   const struct bfd_link_callbacks *callbacks;
 
index e390c9e6daf3c5a25e6697922c17b863c438ef55..870fe1a0b31afd347cf5dbedbf6f559c4be159f0 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-23  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld.texinfo (stack-size): New option.
+       * emultempl/elf32.em: Add stack-size option.
+
 2012-10-22  Jan Beich  <jbeich@tormail.org>
            Alan Modra  <amodra@gmail.com>
 
index de51050db5456983ef93d559b7809f6670bdc441..f6d4c44c648d5f3adfa1e0e718246c3900ebff1b 100644 (file)
@@ -2276,6 +2276,17 @@ fragment <<EOF
            einfo (_("%P%F: invalid common page size \`%s'\n"),
                   optarg + 17);
        }
+      else if (CONST_STRNEQ (optarg, "stack-size="))
+       {
+         char *end;
+         link_info.stacksize = strtoul (optarg + 11, &end, 0);
+         if (*end || link_info.stacksize < 0)
+           einfo (_("%P%F: invalid stack size \`%s'\n"), optarg + 11);
+         if (!link_info.stacksize)
+           /* Use -1 for explicit no-stack, because zero means
+              'default'.   */
+           link_info.stacksize = -1;
+       }
       else if (strcmp (optarg, "execstack") == 0)
        {
          link_info.execstack = TRUE;
index 9bd9c7c9157e62e289d11e06eb8fb28c3294e308..4a8118ff873575c7a5c6b3832e49d1c5c733cef5 100644 (file)
@@ -1093,6 +1093,11 @@ Set the emulation maximum page size to @var{value}.
 @item common-page-size=@var{value}
 Set the emulation common page size to @var{value}.
 
+@item stack-size=@var{value}
+Specify a stack size for in an ELF @code{PT_GNU_STACK} segment.
+Specifying zero will override any default non-zero sized
+@code{PT_GNU_STACK} segment creation.
+
 @end table
 
 Other keywords are ignored for Solaris compatibility.
index a27d274426c6c78ea2a7f01d634b27fe5079d364..d0a777c9af5dbb46d0aa9db2e3546c4ec1453252 100644 (file)
@@ -1,3 +1,27 @@
+2012-10-23  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld-elf/binutils.exp: Add -z stack-size=0.
+       * ld-elf/elf.exp: Add stack-exec and stack-size tests.
+       * ld-elf/orphan-region.d: Add stack-size option. Remove xfail.
+       * ld-elf/stack-exec.rd: New.
+       * ld-elf/stack-size.rd: New.
+       * ld-elf/stack.s: New.
+       * ld-scripts/empty-aligned.d: Add stack-size option.
+       * ld-sh/fdpic-stack-set.d: New.
+       * ld-tic6x/shlib-1.rd: Remove __stacksize symbol.
+       * ld-tic6x/shlib-1b.rd: Likewise.
+       * ld-tic6x/shlib-1r.rd: Likewise.
+       * ld-tic6x/shlib-1rb.rd: Likewise.
+       * ld-tic6x/shlib-app-1.rd: Likewise.
+       * ld-tic6x/shlib-app-1b.rd: Likewise.
+       * ld-tic6x/shlib-app-1r.rd: Likewise.
+       * ld-tic6x/shlib-app-1rb.rd: Likewise.
+       * ld-tic6x/shlib-noindex.rd: Likewise.
+       * ld-tic6x/static-app-1.rd: Likewise.
+       * ld-tic6x/static-app-1b.rd: Likewise.
+       * ld-tic6x/static-app-1r.rd: Likewise.
+       * ld-tic6x/static-app-1rb.rd: Likewise.
+
 2012-10-16  Sofiane Naci  <sofiane.naci@arm.com>
 
        * ld-aarch64/tlsle-symbol-offset.s: New file.
index 249fa2a4acdc542780440dcc61e7e2e707db4efe..010151254b84475bfd162d80dd6501158248f727 100644 (file)
@@ -60,7 +60,7 @@ proc binutils_test { prog_name ld_options test {test_name ""}} {
        return
     }
 
-    if { ![ld_simple_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } {
+    if { ![ld_simple_link $ld tmpdir/$test "$ld_options -z stack-size=0 tmpdir/$test.o"] } {
        if { [string match "*not supported*" $link_output]
             || [string match "*unrecognized option*" $link_output]
             || [string match "*-z relro ignored*" $link_output] } {
index a97e3df8e6782f057b9273c2d0c943c72908340d..a33e3b6b9a02bd7a2b84659f45f4c93e861fce10 100644 (file)
@@ -126,6 +126,15 @@ if { [check_gc_sections_available] && ![istarget "v850-*-*"] } {
     }
 }
 
+if { [istarget *-*-*linux*] } {
+    run_ld_link_tests {
+       {"stack exec" "-z execstack" "" {stack.s}
+           {{readelf {-Wl} stack-exec.rd}} "stack-exec.exe"}
+       {"stack size" "-z stack-size=0x123400" "" {stack.s}
+           {{readelf {-Wl} stack-size.rd}} "stack-size.exe"}
+    }
+}
+
 set LDFLAGS $old_ldflags
 
 # The following tests require running the executable generated by ld.
index 9d6c90c279bb2d595984408cd5b100853a18198b..d961a07d0ac99195e00050ef423957e9cd746833 100644 (file)
@@ -1,11 +1,11 @@
 #source: orphan-region.s
-#ld: -T orphan-region.ld -N
+#ld: -T orphan-region.ld -N -z stack-size=0
 #readelf: -S -l --wide
 #xfail: arc-*-* d30v-*-* dlx-*-* fr30-*-* frv-*-elf i860-*-* i960-*-*
 #xfail: iq*-*-* mn10200-*-* moxie-*-* msp*-*-* mt-*-* or32-*-* pj*-*-*
-#xfail: spu-*-* hppa*64*-*-* frv-*-*
+#xfail: spu-*-* hppa*64*-*-*
 # if not using elf32.em, you don't get fancy orphan handling
-# spu twiddles LOAD range, hppa64 adds PHDR, frv-linux adds GNU_STACK
+# spu twiddles LOAD range, hppa64 adds PHDR
 
 #...
   \[[ 0-9]+\] \.text[ \t]+PROGBITS[ \t]+0*40000000[ \t]+.*
diff --git a/ld/testsuite/ld-elf/stack-exec.rd b/ld/testsuite/ld-elf/stack-exec.rd
new file mode 100644 (file)
index 0000000..7f68a6c
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+  GNU_STACK      0x0+00000 0x0+000000 0x0+000000 0x0+000 0x.+0000 RWE 0x[0-9a-f]+
+#pass
diff --git a/ld/testsuite/ld-elf/stack-size.rd b/ld/testsuite/ld-elf/stack-size.rd
new file mode 100644 (file)
index 0000000..413db3a
--- /dev/null
@@ -0,0 +1,3 @@
+#...
+  GNU_STACK      0x0+00000 0x0+000000 0x0+000000 0x0+000 0x123400 RW. 0x[0-9a-f]+
+#pass
diff --git a/ld/testsuite/ld-elf/stack.s b/ld/testsuite/ld-elf/stack.s
new file mode 100644 (file)
index 0000000..b92617b
--- /dev/null
@@ -0,0 +1,10 @@
+       .text
+       .globl start
+       .globl _start
+start:
+_start:
+       nop
+       nop
+       nop
+       nop
+       
index 283ef649366d3dc938d37708ca84d3d01e63cfe1..4a0c87cd18c4ef22ac412ccb457005b20879a5bc 100644 (file)
@@ -1,5 +1,5 @@
 #source: empty-aligned.s
-#ld: -T empty-aligned.t
+#ld: -T empty-aligned.t -z stack-size=0
 #readelf: -l --wide
 #xfail: "hppa64-*-*"
 #notarget: frv-*-*linux*
diff --git a/ld/testsuite/ld-sh/fdpic-stack-set.d b/ld/testsuite/ld-sh/fdpic-stack-set.d
new file mode 100644 (file)
index 0000000..3bdb783
--- /dev/null
@@ -0,0 +1,19 @@
+#source: fdpic-stack.s
+#as: --isa=sh2a -big --fdpic
+#ld: -EB -mshelf_fd -z stack-size=0x40000
+#readelf: -l
+#target: sh*-*-uclinux*
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x400074
+There are 2 program headers, starting at offset 52
+
+Program Headers:
+[ \t]+Type[ \t]+Offset[ \t]+VirtAddr[ \t]+PhysAddr[ \t]+FileSiz MemSiz[ \t]+Flg Align
+[ \t]+LOAD[ \t]+0x000000 0x00400000 0x00400000 0x00076 0x00076 R E 0x10000
+[ \t]+GNU_STACK[ \t]+0x000000 0x00000000 0x00000000 0x00000 0x40000 RWE 0x8
+
+ Section to Segment mapping:
+[ \t]+Segment Sections\.\.\.
+[ \t]+00[ \t]+\.text 
+[ \t]+01[ \t]+
index d3bf087a1fe9f865667c987156e6d18f265f20dd..029bda18ecb55a73b66385ee0822740b1b69c21e 100644 (file)
@@ -117,7 +117,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
 .* 10000100     0 NOTYPE  LOCAL  DEFAULT   10 __c6xabi_DSBT_BASE
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
 .* 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
index d3bf087a1fe9f865667c987156e6d18f265f20dd..029bda18ecb55a73b66385ee0822740b1b69c21e 100644 (file)
@@ -117,7 +117,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
 .* 10000100     0 NOTYPE  LOCAL  DEFAULT   10 __c6xabi_DSBT_BASE
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
 .* 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
index d3bf087a1fe9f865667c987156e6d18f265f20dd..029bda18ecb55a73b66385ee0822740b1b69c21e 100644 (file)
@@ -117,7 +117,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
 .* 10000100     0 NOTYPE  LOCAL  DEFAULT   10 __c6xabi_DSBT_BASE
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
 .* 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
index d3bf087a1fe9f865667c987156e6d18f265f20dd..029bda18ecb55a73b66385ee0822740b1b69c21e 100644 (file)
@@ -117,7 +117,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
 .* 10000100     0 NOTYPE  LOCAL  DEFAULT   10 __c6xabi_DSBT_BASE
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 1000012c     4 OBJECT  GLOBAL DEFAULT   11 g2
 .* 10000088    52 FUNC    GLOBAL DEFAULT    9 sub0
index 6461371c154da75539ef07f525af35302c87eaf3..9c691c9556e0db2cb99d2db2cbd76d27e9d4487f 100644 (file)
@@ -122,7 +122,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000ac     0 OBJECT  LOCAL  DEFAULT   11 _GLOBAL_OFFSET_TABLE_
 .* 100000a0     0 NOTYPE  LOCAL  DEFAULT   11 __c6xabi_DSBT_BASE
 .* 100000c0     4 OBJECT  GLOBAL DEFAULT   12 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 00000000     0 OBJECT  WEAK   DEFAULT  UND g2
 .* 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
index f4e818847ed3946fd1840878db6aaddb83192b30..a541a5cda98f96324de77cfde6e46707fa416d0b 100644 (file)
@@ -122,7 +122,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000ac     0 OBJECT  LOCAL  DEFAULT   11 _GLOBAL_OFFSET_TABLE_
 .* 100000a0     0 NOTYPE  LOCAL  DEFAULT   11 __c6xabi_DSBT_BASE
 .* 100000c0     4 OBJECT  GLOBAL DEFAULT   12 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 00000000     0 OBJECT  WEAK   DEFAULT  UND g2
 .* 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
index b00447c2d2f753555df5670984f1c76e5206fbaf..5c1b675aa7ac4d03bd01b89c424ab7576f50f32c 100644 (file)
@@ -112,6 +112,5 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000ac     0 OBJECT  LOCAL  DEFAULT   10 _GLOBAL_OFFSET_TABLE_
 .* 100000a0     0 NOTYPE  LOCAL  DEFAULT   10 __c6xabi_DSBT_BASE
 .* 100000c0     4 OBJECT  GLOBAL DEFAULT   11 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
 .* 100000c4     4 OBJECT  GLOBAL DEFAULT   12 a
index 7c2c1106b39c2390f782b0ac060d9488ad7f6948..d12183216b19bcab29eb23a11bc5d2c942f9be3a 100644 (file)
@@ -112,6 +112,5 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000ac     0 OBJECT  LOCAL  DEFAULT   10 _GLOBAL_OFFSET_TABLE_
 .* 100000a0     0 NOTYPE  LOCAL  DEFAULT   10 __c6xabi_DSBT_BASE
 .* 100000c0     4 OBJECT  GLOBAL DEFAULT   11 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 FUNC    GLOBAL DEFAULT  UND sub0
 .* 100000c4     4 OBJECT  GLOBAL DEFAULT   12 a
index 3d50e68572ed5ee6ef1fc24bcf318f41c397d73e..e030b17b49be3ceadc649af1cca1ee219f0b2a00 100644 (file)
@@ -124,7 +124,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 1000010c     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
 .* 10000100     0 NOTYPE  LOCAL  DEFAULT   11 __c6xabi_DSBT_BASE
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 1000012c     4 OBJECT  GLOBAL DEFAULT   12 g2
 .* 10000088    52 FUNC    GLOBAL DEFAULT   10 sub0
index ae5bc8d67136614f0ccbee4ecc28fd1a8c889a07..c56d637c1a0d950dd1301c18fda5abe1560572f3 100644 (file)
@@ -107,7 +107,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
 .* 100000c0     0 NOTYPE  LOCAL  DEFAULT    8 __c6xabi_DSBT_BASE
 .* 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
 .* 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
index ae5bc8d67136614f0ccbee4ecc28fd1a8c889a07..c56d637c1a0d950dd1301c18fda5abe1560572f3 100644 (file)
@@ -107,7 +107,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
 .* 100000c0     0 NOTYPE  LOCAL  DEFAULT    8 __c6xabi_DSBT_BASE
 .* 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
 .* 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
index 3bc91dd6c299e70b80ab44a45f99b7d2fb3e6cca..588e4224df4c38df8e7913b9a0c742498a6fccab 100644 (file)
@@ -104,7 +104,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
 .* 100000c0     0 NOTYPE  LOCAL  DEFAULT    8 __c6xabi_DSBT_BASE
 .* 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
 .* 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0
index 3bc91dd6c299e70b80ab44a45f99b7d2fb3e6cca..588e4224df4c38df8e7913b9a0c742498a6fccab 100644 (file)
@@ -104,7 +104,6 @@ Symbol table '\.symtab' contains [0-9]+ entries:
 .* 100000cc     0 OBJECT  LOCAL  DEFAULT    8 _GLOBAL_OFFSET_TABLE_
 .* 100000c0     0 NOTYPE  LOCAL  DEFAULT    8 __c6xabi_DSBT_BASE
 .* 100000e8     4 OBJECT  GLOBAL DEFAULT    9 b
-.* 00020000     0 OBJECT  GLOBAL DEFAULT  ABS __stacksize
 .* 00000000     0 NOTYPE  WEAK   DEFAULT  UND g1
 .* 100000e4     4 OBJECT  GLOBAL DEFAULT    9 g2
 .* 10000008    52 FUNC    GLOBAL DEFAULT    7 sub0