aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-arm.c35
-rw-r--r--bfd/elf32-hppa.c4
-rw-r--r--bfd/elf64-ppc.c4
4 files changed, 42 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b3e979b..4bad004 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index b32163e..e663d93 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -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;
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 7f0f2cb..b7d951b 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -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
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index dfe10fa..674bff4 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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: