OSDN Git Service

PR ld/13049
authornickc <nickc>
Thu, 20 Oct 2011 16:26:57 +0000 (16:26 +0000)
committernickc <nickc>
Thu, 20 Oct 2011 16:26:57 +0000 (16:26 +0000)
* elf32-arm.c (STUB_SUFFIX): Avoid collision with user namespace
symbol names.
* elf64-ppc.c (STUB_SUFFIX): Likewise.
* elf32-hppa.c (STUB_SUFFIX): Likewise.

bfd/ChangeLog
bfd/elf32-arm.c
bfd/elf32-hppa.c
bfd/elf64-ppc.c

index b3e979b..4bad004 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-20  Nick Clifton  <nickc@redhat.com>
+
+       PR ld/13049
+       * elf32-arm.c (STUB_SUFFIX): Avoid collision with user namespace
+       symbol names.
+       * elf64-ppc.c (STUB_SUFFIX): Likewise.
+       * elf32-hppa.c (STUB_SUFFIX): Likewise.
+
 2011-10-20  Alan Modra  <amodra@gmail.com>
 
        * elf32-i386.c (i386_opcode16): Delete.
index b32163e..e663d93 100644 (file)
@@ -2354,9 +2354,32 @@ static const insn_sequence elf32_arm_stub_a8_veneer_blx[] =
     ARM_REL_INSN(0xea000000, -8)       /* b original_branch_dest.  */
   };
 
-/* Section name for stubs is the associated section name plus this
-   string.  */
-#define STUB_SUFFIX ".stub"
+/* For each section group there can be a specially created linker section
+   to hold the stubs for that group.  The name of the stub section is based
+   upon the name of another section within that group with the suffix below
+   applied.
+
+   PR 13049: STUB_SUFFIX used to be ".stub", but this allowed the user to
+   create what appeared to be a linker stub section when it actually
+   contained user code/data.  For example, consider this fragment:
+   
+     const char * stubborn_problems[] = { "np" };
+
+   If this is compiled with "-fPIC -fdata-sections" then gcc produces a
+   section called:
+
+     .data.rel.local.stubborn_problems
+
+   This then causes problems in arm32_arm_build_stubs() as it triggers:
+
+      // Ignore non-stub sections.
+      if (!strstr (stub_sec->name, STUB_SUFFIX))
+       continue;
+
+   And so the section would be ignored instead of being processed.  Hence
+   the change in definition of STUB_SUFFIX to a name that cannot be a valid
+   C identifier.  */
+#define STUB_SUFFIX ".__stub"
 
 /* One entry per long/short branch stub defined above.  */
 #define DEF_STUBS \
@@ -3557,7 +3580,7 @@ arm_type_of_stub (struct bfd_link_info *info,
                  stub_type = (info->shared | globals->pic_veneer)
                    /* PIC stubs.  */
                    ? ((globals->use_blx
-                       && (r_type ==R_ARM_THM_CALL))
+                       && (r_type == R_ARM_THM_CALL))
                       /* V5T and above. Stub starts with ARM code, so
                          we must be able to switch mode before
                          reaching it, which is only possible for 'bl'
@@ -3568,7 +3591,7 @@ arm_type_of_stub (struct bfd_link_info *info,
 
                    /* non-PIC stubs.  */
                    : ((globals->use_blx
-                       && (r_type ==R_ARM_THM_CALL))
+                       && (r_type == R_ARM_THM_CALL))
                       /* V5T and above.  */
                       ? arm_stub_long_branch_any_any
                       /* V4T.  */
@@ -3797,7 +3820,9 @@ elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
   asection *stub_sec;
 
   link_sec = htab->stub_group[section->id].link_sec;
+  BFD_ASSERT (link_sec != NULL);
   stub_sec = htab->stub_group[section->id].stub_sec;
+
   if (stub_sec == NULL)
     {
       stub_sec = htab->stub_group[link_sec->id].stub_sec;
index 7f0f2cb..b7d951b 100644 (file)
@@ -155,8 +155,8 @@ static const bfd_byte plt_stub[] =
 };
 
 /* Section name for stubs is the associated section name plus this
-   string.  */
-#define STUB_SUFFIX ".stub"
+   string.  PR 13049: Use a name that is not a valid C identifier.  */
+#define STUB_SUFFIX ".__stub"
 
 /* We don't need to copy certain PC- or GP-relative dynamic relocs
    into a shared object's dynamic section.  All the relocs of the
index dfe10fa..674bff4 100644 (file)
@@ -3527,8 +3527,8 @@ must_be_dyn_reloc (struct bfd_link_info *info,
 #define ELIMINATE_COPY_RELOCS 1
 
 /* Section name for stubs is the associated section name plus this
-   string.  */
-#define STUB_SUFFIX ".stub"
+   string.  PR 13049: Use a name that is not a valid C identifier.  */
+#define STUB_SUFFIX ".__stub"
 
 /* Linker stubs.
    ppc_stub_long_branch: