summaryrefslogtreecommitdiff
path: root/recipes/binutils/binutils-2.19.51/thumb-func.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/binutils/binutils-2.19.51/thumb-func.patch')
-rw-r--r--recipes/binutils/binutils-2.19.51/thumb-func.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/recipes/binutils/binutils-2.19.51/thumb-func.patch b/recipes/binutils/binutils-2.19.51/thumb-func.patch
new file mode 100644
index 0000000000..9c18eff3ba
--- /dev/null
+++ b/recipes/binutils/binutils-2.19.51/thumb-func.patch
@@ -0,0 +1,55 @@
+Index: elf32-arm.c
+===================================================================
+RCS file: /cvs/src/src/bfd/elf32-arm.c,v
+retrieving revision 1.211
+retrieving revision 1.212
+diff -u -r1.211 -r1.212
+--- src/bfd/elf32-arm.c 29 Aug 2009 22:10:58 -0000 1.211
++++ src/bfd/elf32-arm.c 9 Sep 2009 18:36:10 -0000 1.212
+@@ -7036,6 +7036,9 @@
+ + splt->output_offset
+ + h->plt.offset);
+ *unresolved_reloc_p = FALSE;
++ /* The PLT entry is in ARM mode, regardless of the
++ target function. */
++ sym_flags = STT_FUNC;
+ }
+
+ from = (input_section->output_section->vma
+@@ -7452,10 +7455,14 @@
+ /* If the Thumb BLX instruction is available, convert the
+ BL to a BLX instruction to call the ARM-mode PLT entry. */
+ lower_insn = (lower_insn & ~0x1000) | 0x0800;
++ sym_flags = STT_FUNC;
+ }
+ else
+- /* Target the Thumb stub before the ARM PLT entry. */
+- value -= PLT_THUMB_STUB_SIZE;
++ {
++ /* Target the Thumb stub before the ARM PLT entry. */
++ value -= PLT_THUMB_STUB_SIZE;
++ sym_flags = STT_ARM_TFUNC;
++ }
+ *unresolved_reloc_p = FALSE;
+ }
+
+@@ -11449,13 +11456,13 @@
+ {
+ h->root.u.def.section = s;
+ h->root.u.def.value = h->plt.offset;
+- }
+
+- /* Make sure the function is not marked as Thumb, in case
+- it is the target of an ABS32 relocation, which will
+- point to the PLT entry. */
+- if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
+- h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
++ /* Make sure the function is not marked as Thumb, in case
++ it is the target of an ABS32 relocation, which will
++ point to the PLT entry. */
++ if (ELF_ST_TYPE (h->type) == STT_ARM_TFUNC)
++ h->type = ELF_ST_INFO (ELF_ST_BIND (h->type), STT_FUNC);
++ }
+
+ /* Make room for this entry. */
+ s->size += htab->plt_entry_size;