aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-aarch64/farcall-bl-none-function.d
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2016-01-20 16:57:59 +0000
committerJiong Wang <jiong.wang@arm.com>2016-01-21 09:57:09 +0000
commit2f340668a9a7c00f8813b097b157b07fba8cfa82 (patch)
treee5cf0bc883324833481f0352a698c54bf21d9096 /ld/testsuite/ld-aarch64/farcall-bl-none-function.d
parentaeb7056972f1b383578204b9151b0ae6d8c1df81 (diff)
downloadgdb-2f340668a9a7c00f8813b097b157b07fba8cfa82.zip
gdb-2f340668a9a7c00f8813b097b157b07fba8cfa82.tar.gz
gdb-2f340668a9a7c00f8813b097b157b07fba8cfa82.tar.bz2
[AArch64] Relax long branch veneer insertion for non STT_FUNC symbol
As defined at AArch64 ELF Specification (4.6.7 Call and Jump relocations), symbol with type of non STT_FUNC but in different input section with relocation place should insert long branch veneer also. Meanwhile the current long branch veneer infrastructure havn't considered the situation where the branch destination is "sym_value + rela->addend". This was OK because we only insert veneer for long call destination is STT_FUNC symbol for which the addend is always zero. But as we relax the support to other situations by this patch, we need to handle addend be non-zero value. For example, for static function, relocation against "local symbol" are turned into relocation against "section symbol + offset" where there is a valid addend. bfd/ * elfnn-aarch64.c (aarch64_type_of_stub): Allow insert long branch veneer for sym_sec != input_sec. (elfNN_aarch64_size_stub): Support STT_SECTION symbol. (elfNN_aarch64_final_link_relocate): Take rela addend into account when calculation destination. ld/ * testsuite/ld-aarch64/farcall-section.d: Delete. * testsuite/ld-aarch64/farcall-section.s: Delete. * testsuite/ld-aarch64/farcall-b-section.d: New expectation file. * testsuite/ld-aarch64/farcall-bl-section.d: Likewise. * testsuite/ld-aarch64/farcall-b-section.s: New testcase. * testsuite/ld-aarch64/farcall-bl-section.s: Likewise. * testsuite/ld-aarch64/aarch64-elf.exp: Likewise.
Diffstat (limited to 'ld/testsuite/ld-aarch64/farcall-bl-none-function.d')
-rw-r--r--ld/testsuite/ld-aarch64/farcall-bl-none-function.d21
1 files changed, 20 insertions, 1 deletions
diff --git a/ld/testsuite/ld-aarch64/farcall-bl-none-function.d b/ld/testsuite/ld-aarch64/farcall-bl-none-function.d
index 6ce9ca4..b6a4dda 100644
--- a/ld/testsuite/ld-aarch64/farcall-bl-none-function.d
+++ b/ld/testsuite/ld-aarch64/farcall-bl-none-function.d
@@ -2,4 +2,23 @@
#source: farcall-bl-none-function.s
#as:
#ld: -Ttext 0x1000 --section-start .foo=0x8001000
-#error: .*\(.text\+0x0\): relocation truncated to fit: R_AARCH64_CALL26 against symbol `bar'.*
+#objdump: -dr
+#...
+
+Disassembly of section .text:
+
+.* <_start>:
+ 1000: 94000003 bl 100c <__bar_veneer>
+ 1004: d65f03c0 ret
+ 1008: 14000007 b 1024 <__bar_veneer\+0x18>
+
+.* <__bar_veneer>:
+ 100c: 90040010 adrp x16, 8001000 <bar>
+ 1010: 91000210 add x16, x16, #0x0
+ 1014: d61f0200 br x16
+ ...
+
+Disassembly of section .foo:
+
+.* <bar>:
+ 8001000: d65f03c0 ret