+2016-05-03 Jiong Wang <jiong.wang@arm.com>
+
+ * bfd-in.h (bfd_elf64_aarch64_set_options): Update prototype.
+ * bfd-in2.h (bfd_elf64_aarch64_set_options): Likewise.
+ * elfnn-aarch64.c (bfd_elfNN_aarch64_set_options): Initialize
+ no_apply_dynamic_relocs.
+ (elfNN_aarch64_final_link_relocate): Apply absolute relocations even though
+ dynamic relocations generated.
+
2016-04-29 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_size_dynamic_sections): Move interp
(bfd *);
extern void bfd_elf64_aarch64_set_options
- (bfd *, struct bfd_link_info *, int, int, int, int, int);
+ (bfd *, struct bfd_link_info *, int, int, int, int, int, int);
extern void bfd_elf32_aarch64_set_options
- (bfd *, struct bfd_link_info *, int, int, int, int, int);
+ (bfd *, struct bfd_link_info *, int, int, int, int, int, int);
/* ELF AArch64 mapping symbol support. */
#define BFD_AARCH64_SPECIAL_SYM_TYPE_MAP (1 << 0)
(bfd *);
extern void bfd_elf64_aarch64_set_options
- (bfd *, struct bfd_link_info *, int, int, int, int, int);
+ (bfd *, struct bfd_link_info *, int, int, int, int, int, int);
extern void bfd_elf32_aarch64_set_options
- (bfd *, struct bfd_link_info *, int, int, int, int, int);
+ (bfd *, struct bfd_link_info *, int, int, int, int, int, int);
/* ELF AArch64 mapping symbol support. */
#define BFD_AARCH64_SPECIAL_SYM_TYPE_MAP (1 << 0)
/* Enable ADRP->ADR rewrite for erratum 843419 workaround. */
int fix_erratum_843419_adr;
+ /* Don't apply link-time values for dynamic relocations. */
+ int no_apply_dynamic_relocs;
+
/* The number of bytes in the initial entry in the PLT. */
bfd_size_type plt_header_size;
int no_enum_warn,
int no_wchar_warn, int pic_veneer,
int fix_erratum_835769,
- int fix_erratum_843419)
+ int fix_erratum_843419,
+ int no_apply_dynamic_relocs)
{
struct elf_aarch64_link_hash_table *globals;
globals->fix_erratum_835769 = fix_erratum_835769;
globals->fix_erratum_843419 = fix_erratum_843419;
globals->fix_erratum_843419_adr = TRUE;
+ globals->no_apply_dynamic_relocs = no_apply_dynamic_relocs;
BFD_ASSERT (is_aarch64_elf (output_bfd));
elf_aarch64_tdata (output_bfd)->no_enum_size_warning = no_enum_warn;
relocate the text and data segments independently,
so the symbol does not matter. */
symbol = 0;
+ relocate = globals->no_apply_dynamic_relocs ? FALSE : TRUE;
outrel.r_info = ELFNN_R_INFO (symbol, AARCH64_R (RELATIVE));
outrel.r_addend += value;
}
+2016-05-03 Jiong Wang <jiong.wang@arm.com>
+
+ * emultempl/aarch64elf.em (--no-apply-dynamic-relocs): New option.
+ * NEWS: Mention --no-apply-dynamic-relocs.
+ * ld.texinfo (ld and the ARM family): Document
+ --no-apply-dynamic-relocs.
+ * testsuite/ld-aarch64/rela-abs-relative.s: New test source.
+ * testsuite/ld-aarch64/rela-abs-relative.d: New expected result.
+ * testsuite/ld-aarch64/rela-abs-relative-be.d: Likewise for big-endian.
+ * estsuite/ld-aarch64/rela-abs-relative-opt.d: Likewise, but enable new
+ option.
+
2016-05-03 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* testsuite/ld-elfcomm/elfcomm.exp: Check for shared lib support
* The NOCROSSREFSTO command was added to the linker script language.
+* Add --no-apply-dynamic-relocs to the AArch64 linker to do not apply link-time
+ values for dynamic relocations.
+
Changes in 2.26:
* Add --fix-stm32l4xx-629360 to the ARM linker to enable a link-time
static int pic_veneer = 0;
static int fix_erratum_835769 = 0;
static int fix_erratum_843419 = 0;
+static int no_apply_dynamic_relocs = 0;
static void
gld${EMULATION_NAME}_before_parse (void)
no_enum_size_warning,
no_wchar_size_warning,
pic_veneer,
- fix_erratum_835769, fix_erratum_843419);
+ fix_erratum_835769, fix_erratum_843419,
+ no_apply_dynamic_relocs);
stub_file = lang_add_input_file ("linker stubs",
lang_input_file_is_fake_enum,
#define OPTION_NO_WCHAR_SIZE_WARNING 312
#define OPTION_FIX_ERRATUM_835769 313
#define OPTION_FIX_ERRATUM_843419 314
+#define OPTION_NO_APPLY_DYNAMIC_RELOCS 315
'
PARSE_AND_LIST_SHORTOPTS=p
{ "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING},
{ "fix-cortex-a53-835769", no_argument, NULL, OPTION_FIX_ERRATUM_835769},
{ "fix-cortex-a53-843419", no_argument, NULL, OPTION_FIX_ERRATUM_843419},
+ { "no-apply-dynamic-relocs", no_argument, NULL, OPTION_NO_APPLY_DYNAMIC_RELOCS},
'
PARSE_AND_LIST_OPTIONS='
));
fprintf (file, _(" --fix-cortex-a53-835769 Fix erratum 835769\n"));
fprintf (file, _(" --fix-cortex-a53-843419 Fix erratum 843419\n"));
+ fprintf (file, _(" --no-apply-dynamic-relocs Do not apply link-time values for dynamic relocations\n"));
'
PARSE_AND_LIST_ARGS_CASES='
fix_erratum_843419 = 1;
break;
+ case OPTION_NO_APPLY_DYNAMIC_RELOCS:
+ no_apply_dynamic_relocs = 1;
+ break;
+
case OPTION_STUBGROUP_SIZE:
{
const char *end;
which support up to 4Gb of code. The default is to use 12 byte PLT
entries which only support 512Mb of code.
+@kindex --no-apply-dynamic-relocs
+@cindex AArch64 rela addend
+The @samp{--no-apply-dynamic-relocs} option makes AArch64 linker do not apply
+link-time values for dynamic relocations.
+
@ifclear GENERIC
@lowersections
@end ifclear
run_dump_test "plt_mapping_symbol"
+run_dump_test "rela-abs-relative"
+run_dump_test "rela-abs-relative-be"
+run_dump_test "rela-abs-relative-opt"
+
set aarch64elflinktests {
{"ld-aarch64/so with global symbol" "-shared" "" "" {copy-reloc-so.s}
{} "copy-reloc-so.so"}
--- /dev/null
+#name: rela-abs-relative (big endian)
+#source: rela-abs-relative.s
+#ld: -shared -Ttext-segment=0x100000 -Tdata=0x200000 -Trelocs.ld
+#target: aarch64_be-*-*
+#objdump: -dR -j .data
+#...
+
+Disassembly of section .data:
+
+.* <a>:
+ 200000: 00 00 00 00 ca fe ca fe 00 00 00 00 00 01 00 ca.*
+ 200008: R_AARCH64_RELATIVE \*ABS\*\+0x100ca
+ 200010: 00 00 00 00 de ad de ad.*
--- /dev/null
+#name: rela-abs-relative --no-apply-dynamic-relocs
+#source: rela-abs-relative.s
+#ld: -shared -Ttext-segment=0x100000 -Tdata=0x200000 -Trelocs.ld --no-apply-dynamic-relocs
+#notarget: aarch64_be-*-*
+#objdump: -dR -j .data
+#...
+
+Disassembly of section .data:
+
+.* <a>:
+ 200000: fe ca fe ca 00 00 00 00 00 00 00 00 00 00 00 00.*
+ 200008: R_AARCH64_RELATIVE \*ABS\*\+0x100ca
+ 200010: ad de ad de 00 00 00 00.*
--- /dev/null
+#name: rela-abs-relative
+#source: rela-abs-relative.s
+#ld: -shared -Ttext-segment=0x100000 -Tdata=0x200000 -Trelocs.ld
+#notarget: aarch64_be-*-*
+#objdump: -dR -j .data
+#...
+
+Disassembly of section .data:
+
+.* <a>:
+ 200000: fe ca fe ca 00 00 00 00 ca 00 01 00 00 00 00 00.*
+ 200008: R_AARCH64_RELATIVE \*ABS\*\+0x100ca
+ 200010: ad de ad de 00 00 00 00.*
--- /dev/null
+ .section .rodata
+ .align 3
+ .type string1, %object
+ .size string1, 8
+local_foo:
+ .string "local_foo"
+
+ .section .data,"aw",%progbits
+ .align 3
+ .global a
+ .type a, %object
+ .size a, 24
+a:
+ .xword 0xcafecafe
+ .xword local_foo + 0xca
+ .xword 0xdeaddead