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>
|
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
* elf32-arm.c (arm_stub_is_thumb): Add
|
* 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. */
|
case, mode switching is performed by the stub. */
|
||||||
if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
|
if (branch_type == ST_BRANCH_TO_THUMB && !stub_entry)
|
||||||
value |= (1 << 28);
|
value |= (1 << 28);
|
||||||
else
|
else if (stub_entry || branch_type != ST_BRANCH_UNKNOWN)
|
||||||
{
|
{
|
||||||
value &= ~(bfd_vma)(1 << 28);
|
value &= ~(bfd_vma)(1 << 28);
|
||||||
value |= (1 << 24);
|
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
|
/* New EABI objects mark thumb function symbols by setting the low bit of
|
||||||
the address. */
|
the address. */
|
||||||
if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC
|
if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
|
||||||
|| ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
|
|| ELF_ST_TYPE (dst->st_info) == STT_GNU_IFUNC)
|
||||||
&& (dst->st_value & 1))
|
|
||||||
{
|
{
|
||||||
dst->st_value &= ~(bfd_vma) 1;
|
if (dst->st_value & 1)
|
||||||
dst->st_target_internal = ST_BRANCH_TO_THUMB;
|
{
|
||||||
|
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)
|
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)
|
else if (ELF_ST_TYPE (dst->st_info) == STT_SECTION)
|
||||||
dst->st_target_internal = ST_BRANCH_LONG;
|
dst->st_target_internal = ST_BRANCH_LONG;
|
||||||
else
|
else
|
||||||
dst->st_target_internal = ST_BRANCH_TO_ARM;
|
dst->st_target_internal = ST_BRANCH_UNKNOWN;
|
||||||
|
|
||||||
return TRUE;
|
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>
|
2011-04-15 Sergio Durigan Junior <sergiodj@redhat.com>
|
||||||
|
|
||||||
* common.h (NT_STAPSDT): New define.
|
* common.h (NT_STAPSDT): New define.
|
||||||
|
@ -328,7 +328,8 @@ enum
|
|||||||
enum arm_st_branch_type {
|
enum arm_st_branch_type {
|
||||||
ST_BRANCH_TO_ARM,
|
ST_BRANCH_TO_ARM,
|
||||||
ST_BRANCH_TO_THUMB,
|
ST_BRANCH_TO_THUMB,
|
||||||
ST_BRANCH_LONG
|
ST_BRANCH_LONG,
|
||||||
|
ST_BRANCH_UNKNOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ARM_SYM_BRANCH_TYPE(SYM) \
|
#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>
|
2011-05-31 Paul Brook <paul@codesourcery.com>
|
||||||
Nathan Sidwell <nathan@codesourcery.com>
|
Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
|
@ -6,4 +6,9 @@ Disassembly of section .text:
|
|||||||
00008000 <arm>:
|
00008000 <arm>:
|
||||||
8000: eb03dffe bl 100000 <foo>
|
8000: eb03dffe bl 100000 <foo>
|
||||||
8004: ea03dffd b 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
|
arm: bl 0x100000
|
||||||
b 0x100000
|
b 0x100000
|
||||||
|
blx 0x100000
|
||||||
bl foo
|
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
|
.text
|
||||||
.arch armv5t
|
.arch armv5t
|
||||||
.global _start
|
.global _start
|
||||||
|
.type _start, %function
|
||||||
_start:
|
_start:
|
||||||
bl arm
|
bl arm
|
||||||
bl t1
|
bl t1
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
.global t1
|
.global t1
|
||||||
.global t2
|
.global t2
|
||||||
.global t5
|
.global t5
|
||||||
|
.type arm, %function
|
||||||
arm:
|
arm:
|
||||||
bx lr
|
bx lr
|
||||||
.thumb
|
.thumb
|
||||||
|
@ -276,8 +276,8 @@ set armelftests {
|
|||||||
{{objdump -dr cortex-a8-fix-blx-rel-thumb.d}}
|
{{objdump -dr cortex-a8-fix-blx-rel-thumb.d}}
|
||||||
"cortex-a8-fix-blx-rel-thumb"}
|
"cortex-a8-fix-blx-rel-thumb"}
|
||||||
{"Cortex-A8 erratum fix, relocate bl.w and far call"
|
{"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 -Ttext=0x00 --fix-cortex-a8 --defsym _start=0"
|
||||||
"-EL -mcpu=cortex-a8" {cortex-a8-far-1.s cortex-a8-far-2.s}
|
"-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}}
|
{{objdump -dr cortex-a8-far.d}}
|
||||||
"cortex-a8-far"}
|
"cortex-a8-far"}
|
||||||
{"Cortex-A8 erratum fix, headers"
|
{"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
|
bl bar
|
||||||
|
|
||||||
.section .far, "xa"
|
.section .far, "xa"
|
||||||
|
.type bar, %function
|
||||||
.global bar
|
.global bar
|
||||||
bar:
|
bar:
|
||||||
bx lr
|
bx lr
|
||||||
|
Loading…
Reference in New Issue
Block a user