mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
2011-05-31 Paul Brook <paul@codesourcery.com>
bfd/ * elf32-arm.c (elf32_arm_final_link_relocate): Only do bl conversion for known functions. (elf32_arm_swap_symbol_in): Only set ST_BRANCH_TO_ARM for function symbols. include/elf/ * arm.h (arm_st_branch_type): Add ST_BRANCH_UNKNOWN. ld/testsuite/ * ld-arm/cortex-a8-far.d: Adjust expected output. * ld-arm/arm-call1.s: Give function symbol correct type. * ld-arm/arm-call2.s: Ditto. * ld-arm/farcall-group4.s: Ditto. * ld-arm/arm-elf.exp (cortex-a8-far): Define far symbols with correct type via assembly file. * ld-arm/cortex-a8-far-3.s: New file. * ld-arm/abs-call-1.s: Add Thumb tests
This commit is contained in:
parent
10960bfbce
commit
63e1a0fcba
@ -1,3 +1,10 @@
|
||||
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* elf32-arm.c (elf32_arm_final_link_relocate): Only do bl conversion
|
||||
for known functions.
|
||||
(elf32_arm_swap_symbol_in): Only set ST_BRANCH_TO_ARM for function
|
||||
symbols.
|
||||
|
||||
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* elf32-arm.c (arm_stub_is_thumb): Add
|
||||
|
@ -8304,7 +8304,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||
case, mode switching is performed by the stub. */
|
||||
if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
|
||||
value |= (1 << 28);
|
||||
else
|
||||
else if (stub_entry || branch_type != ST_BRANCH_UNKNOWN)
|
||||
{
|
||||
value &= ~(bfd_vma)(1 << 28);
|
||||
value |= (1 << 24);
|
||||
@ -15131,12 +15131,16 @@ elf32_arm_swap_symbol_in (bfd * abfd,
|
||||
|
||||
/* New EABI objects mark thumb function symbols by setting the low bit of
|
||||
the address. */
|
||||
if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC
|
||||
|| ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
|
||||
&& (dst->st_value & 1))
|
||||
if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
|
||||
|| ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
|
||||
{
|
||||
dst->st_value &= ~(bfd_vma) 1;
|
||||
dst->st_target_internal = ST_BRANCH_TO_THUMB;
|
||||
if (dst->st_value & 1)
|
||||
{
|
||||
dst->st_value &= ~(bfd_vma) 1;
|
||||
dst->st_target_internal = ST_BRANCH_TO_THUMB;
|
||||
}
|
||||
else
|
||||
dst->st_target_internal = ST_BRANCH_TO_ARM;
|
||||
}
|
||||
else if (ELF_ST_TYPE (dst->st_info) == STT_ARM_TFUNC)
|
||||
{
|
||||
@ -15146,7 +15150,7 @@ elf32_arm_swap_symbol_in (bfd * abfd,
|
||||
else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION)
|
||||
dst->st_target_internal = ST_BRANCH_LONG;
|
||||
else
|
||||
dst->st_target_internal = ST_BRANCH_TO_ARM;
|
||||
dst->st_target_internal = ST_BRANCH_UNKNOWN;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -1,3 +1,7 @@
|
||||
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* arm.h (arm_st_branch_type): Add ST_BRANCH_UNKNOWN.
|
||||
|
||||
2011-04-15 Sergio Durigan Junior <sergiodj@redhat.com>
|
||||
|
||||
* common.h (NT_STAPSDT): New define.
|
||||
|
@ -328,7 +328,8 @@ enum
|
||||
enum arm_st_branch_type {
|
||||
ST_BRANCH_TO_ARM,
|
||||
ST_BRANCH_TO_THUMB,
|
||||
ST_BRANCH_LONG
|
||||
ST_BRANCH_LONG,
|
||||
ST_BRANCH_UNKNOWN
|
||||
};
|
||||
|
||||
#define ARM_SYM_BRANCH_TYPE(SYM) \
|
||||
|
@ -1,3 +1,14 @@
|
||||
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* ld-arm/cortex-a8-far.d: Adjust expected output.
|
||||
* ld-arm/arm-call1.s: Give function symbol correct type.
|
||||
* ld-arm/arm-call2.s: Ditto.
|
||||
* ld-arm/farcall-group4.s: Ditto.
|
||||
* ld-arm/arm-elf.exp (cortex-a8-far): Define far symbols with correct
|
||||
type via assembly file.
|
||||
* ld-arm/cortex-a8-far-3.s: New file.
|
||||
* ld-arm/abs-call-1.s: Add Thumb tests
|
||||
|
||||
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||
Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
|
@ -6,4 +6,9 @@ Disassembly of section .text:
|
||||
00008000 <arm>:
|
||||
8000: eb03dffe bl 100000 <foo>
|
||||
8004: ea03dffd b 100000 <foo>
|
||||
8008: eb03dffc bl 100000 <foo>
|
||||
8008: fa03dffc blx 100000 <foo>
|
||||
800c: eb03dffb bl 100000 <foo>
|
||||
00008010 <thumb>:
|
||||
8010: f0f7 fff6 bl 100000 <foo>
|
||||
8014: f0f7 bff4 b\.w 100000 <foo>
|
||||
8018: f0f7 eff2 blx 100000 <foo>
|
||||
|
@ -4,5 +4,12 @@
|
||||
|
||||
arm: bl 0x100000
|
||||
b 0x100000
|
||||
blx 0x100000
|
||||
bl foo
|
||||
|
||||
.syntax unified
|
||||
.thumb
|
||||
thumb: bl 0x100000
|
||||
b 0x100000
|
||||
blx 0x100000
|
||||
@ bl foo is broken - gas fails to preserve the symbol reference
|
||||
|
@ -2,6 +2,7 @@
|
||||
.text
|
||||
.arch armv5t
|
||||
.global _start
|
||||
.type _start, %function
|
||||
_start:
|
||||
bl arm
|
||||
bl t1
|
||||
|
@ -4,6 +4,7 @@
|
||||
.global t1
|
||||
.global t2
|
||||
.global t5
|
||||
.type arm, %function
|
||||
arm:
|
||||
bx lr
|
||||
.thumb
|
||||
|
@ -276,8 +276,8 @@ set armelftests {
|
||||
{{objdump -dr cortex-a8-fix-blx-rel-thumb.d}}
|
||||
"cortex-a8-fix-blx-rel-thumb"}
|
||||
{"Cortex-A8 erratum fix, relocate bl.w and far call"
|
||||
"-EL -Ttext=0x00 --fix-cortex-a8 --defsym far_fn1=0x80000000 --defsym far_fn2=0x80000004 --defsym far_fn=0x7fff0000 --defsym _start=0"
|
||||
"-EL -mcpu=cortex-a8" {cortex-a8-far-1.s cortex-a8-far-2.s}
|
||||
"-EL -Ttext=0x00 --fix-cortex-a8 --defsym _start=0"
|
||||
"-EL -mcpu=cortex-a8" {cortex-a8-far-1.s cortex-a8-far-2.s cortex-a8-far-3.s}
|
||||
{{objdump -dr cortex-a8-far.d}}
|
||||
"cortex-a8-far"}
|
||||
{"Cortex-A8 erratum fix, headers"
|
||||
|
9
ld/testsuite/ld-arm/cortex-a8-far-3.s
Normal file
9
ld/testsuite/ld-arm/cortex-a8-far-3.s
Normal file
@ -0,0 +1,9 @@
|
||||
.globl far_fn
|
||||
.type far_fn, %function
|
||||
.set far_fn, 0x7fff0000
|
||||
.globl far_fn1
|
||||
.type far_fn1, %function
|
||||
.set far_fn1, 0x80000000
|
||||
.globl far_fn2
|
||||
.type far_fn2, %function
|
||||
.set far_fn2, 0x80000004
|
@ -8,6 +8,7 @@ myfunc:
|
||||
bl bar
|
||||
|
||||
.section .far, "xa"
|
||||
.type bar, %function
|
||||
.global bar
|
||||
bar:
|
||||
bx lr
|
||||
|
Loading…
Reference in New Issue
Block a user