+2016-01-21 Jiong Wang <jiong.wang@arm.com>
+
+ * 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.
+
2016-01-21 Alan Modra <amodra@gmail.com>
* elf-linux-core.h (swap_linux_prpsinfo32_out): New function.
bfd_boolean via_plt_p;
if (st_type != STT_FUNC
- && (sym_sec != bfd_abs_section_ptr))
+ && (sym_sec == input_sec))
return stub_type;
globals = elf_aarch64_hash_table (info);
goto error_ret_free_internal;
}
- stub_entry->target_value = sym_value;
+ stub_entry->target_value = sym_value + irela->r_addend;
stub_entry->target_section = sym_sec;
stub_entry->stub_type = stub_type;
stub_entry->h = hash;
/* Check if a stub has to be inserted because the destination
is too far away. */
struct elf_aarch64_stub_hash_entry *stub_entry = NULL;
- if (! aarch64_valid_branch_p (value, place))
+
+ /* If the branch destination is directed to plt stub, "value" will be
+ the final destination, otherwise we should plus signed_addend, it may
+ contain non-zero value, for example call to local function symbol
+ which are turned into "sec_sym + sec_off", and sec_off is kept in
+ signed_addend. */
+ if (! aarch64_valid_branch_p (via_plt_p ? value : value + signed_addend,
+ place))
/* The target is out of reach, so redirect the branch to
the local stub for this function. */
stub_entry = elfNN_aarch64_get_stub_entry (input_section, sym_sec, h,
rel, globals);
if (stub_entry != NULL)
- value = (stub_entry->stub_offset
- + stub_entry->stub_sec->output_offset
- + stub_entry->stub_sec->output_section->vma);
+ {
+ value = (stub_entry->stub_offset
+ + stub_entry->stub_sec->output_offset
+ + stub_entry->stub_sec->output_section->vma);
+
+ /* We have redirected the destination to stub entry address,
+ so ignore any addend record in the original rela entry. */
+ signed_addend = 0;
+ }
}
value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value,
signed_addend, weak_undef_p);
+2016-01-20 Jiong Wang <jiong.wang@arm.com>
+
+ * 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.
+
2016-01-20 Nick Clifton <nickc@redhat.com>
PR 19457
run_dump_test "limit-b"
run_dump_test "limit-bl"
-run_dump_test "farcall-section"
run_dump_test "farcall-back"
run_dump_test "farcall-b-defsym"
run_dump_test "farcall-bl-defsym"
run_dump_test "farcall-b"
run_dump_test "farcall-b-none-function"
run_dump_test "farcall-bl-none-function"
+run_dump_test "farcall-b-section"
+run_dump_test "farcall-bl-section"
run_dump_test "tls-relax-all"
run_dump_test "tls-relax-gd-le"
#source: farcall-b-none-function.s
#as:
#ld: -Ttext 0x1000 --section-start .foo=0x8001000
-#error: .*\(.text\+0x0\): relocation truncated to fit: R_AARCH64_JUMP26 against symbol `bar'.*
+#objdump: -dr
+#...
+
+Disassembly of section .text:
+
+.* <_start>:
+ 1000: 14000003 b 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
--- /dev/null
+#name: aarch64-farcall-b-section
+#source: farcall-b-section.s
+#as:
+#ld: -Ttext 0x1000 --section-start .foo=0x8001000
+#objdump: -dr
+#...
+
+Disassembly of section .text:
+
+.* <_start>:
+ 1000: 14000008 b 1020 <___veneer>
+ 1004: 14000003 b 1010 <___veneer>
+ 1008: d65f03c0 ret
+ 100c: 1400000d b 1040 <___veneer\+0x20>
+
+.* <___veneer>:
+ 1010: 90040010 adrp x16, 8001000 <bar>
+ 1014: 91001210 add x16, x16, #0x4
+ 1018: d61f0200 br x16
+ 101c: 00000000 .inst 0x00000000 ; undefined
+
+.* <___veneer>:
+ 1020: 90040010 adrp x16, 8001000 <bar>
+ 1024: 91000210 add x16, x16, #0x0
+ 1028: d61f0200 br x16
+ ...
+
+Disassembly of section .foo:
+
+.* <bar>:
+ 8001000: d65f03c0 ret
+
+.* <bar2>:
+ 8001004: d65f03c0 ret
--- /dev/null
+.global _start
+
+# We will place the section .text at 0x1000.
+
+ .text
+
+_start:
+ b bar
+ b bar2
+ ret
+
+# We will place the section .foo at 0x8001000.
+
+ .section .foo, "xa"
+ .type bar, @function
+bar:
+ ret
+ .type bar2, @function
+bar2:
+ ret
#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
--- /dev/null
+#name: aarch64-farcall-bl-section
+#source: farcall-bl-section.s
+#as:
+#ld: -Ttext 0x1000 --section-start .foo=0x8001000
+#objdump: -dr
+#...
+
+Disassembly of section .text:
+
+.* <_start>:
+ 1000: 94000008 bl 1020 <___veneer>
+ 1004: 94000003 bl 1010 <___veneer>
+ 1008: d65f03c0 ret
+ 100c: 1400000d b 1040 <___veneer\+0x20>
+
+.* <___veneer>:
+ 1010: 90040010 adrp x16, 8001000 <bar>
+ 1014: 91001210 add x16, x16, #0x4
+ 1018: d61f0200 br x16
+ 101c: 00000000 .inst 0x00000000 ; undefined
+
+.* <___veneer>:
+ 1020: 90040010 adrp x16, 8001000 <bar>
+ 1024: 91000210 add x16, x16, #0x0
+ 1028: d61f0200 br x16
+ ...
+
+Disassembly of section .foo:
+
+.* <bar>:
+ 8001000: d65f03c0 ret
+
+.* <bar2>:
+ 8001004: d65f03c0 ret
--- /dev/null
+ .global _start
+
+# We will place the section .text at 0x1000.
+
+ .text
+
+_start:
+ bl bar
+ bl bar2
+ ret
+
+# We will place the section .foo at 0x8001000.
+
+ .section .foo, "xa"
+ .type bar, @function
+bar:
+ ret
+ .type bar2, @function
+bar2:
+ ret
+++ /dev/null
-#name: Aarch64 farcall to symbol of type STT_SECTION
-#source: farcall-section.s
-#as:
-#ld: -Ttext 0x1000 --section-start .foo=0x8001014
-#error: .*\(.text\+0x0\): relocation truncated to fit: R_AARCH64_CALL26 against `.foo'
+++ /dev/null
-# Test to ensure that an Aarch64 call exceeding 128MB generates an error
-# if the destination is of type STT_SECTION (eg non-global symbol)
-
- .global _start
-
-# We will place the section .text at 0x1000.
-
- .text
-
-_start:
- bl bar
-
-# We will place the section .foo at 0x8001020.
-
- .section .foo, "xa"
-
-bar:
- ret
-