From: Jiong Wang Date: Tue, 8 Jul 2014 08:29:06 +0000 (+0100) Subject: Enable elf_backend_rela_normal for AArch64 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2e0488d33f8abbbc5bec214e1723d07048d7afcc;p=binutils-gdb.git Enable elf_backend_rela_normal for AArch64 If we are generating non-relocatable object and --emit-relocs specified, aarch64 ld is actually generating wrong addend for rela entry when relocate against local symbol. for example, for simple testcase foo.c === const char * const a = "foo"; const char * foo () { return a; } bar.c === const char * const b = "bar"; const char * bar () { return b; } aarch64-none-linux-gnu-ld --emit-relocs -o x.o foo.o bar.o aarch64-none-linux-gnu-readelf -r x.o ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 0 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0 ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 0 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0 while it should be: ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 0 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 0 ... R_AARCH64_ADR_PRE 0000000000400018 .rodata + 10 ... R_AARCH64_ADD_ABS 0000000000400018 .rodata + 10 bfd generic code could actually handle this properly, but only when elf_backend_rela_normal set to '1'. this patch enable this and remove those target specific hack. bfd/ * elfnn-aarch64.c (elf_backend_rela_normal): Set to 1. (elfNN_aarch64_relocate_section): Remove duplicated addend adjustment when info->relocatable be true. ld/testsuite/ * ld-aarch64/emit-relocs-local-addend-bar.s: * New source file. * ld-aarch64/emit-relocs-local-addend-foo.s: * Likewise. * ld-aarch64/emit-relocs-local-addend.d: * New testcase. * ld-aarch64/local-addend-r.d: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f6bc88bd651..deed8cede5c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-07-08 Jiong Wang + + * elfnn-aarch64.c (elf_backend_rela_normal): Set to 1. + (elfNN_aarch64_relocate_section): Remove duplicated addend adjustment + when info->relocatable be true. + 2014-07-07 Barney Stratford * elf32-avr.c: Handle R_AVR_PORT5 and R_AVR_PORT6. diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index a8578dae0cd..4dfb6043ae6 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -4158,15 +4158,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd, rel, 1, relend, howto, 0, contents); if (info->relocatable) - { - /* This is a relocatable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION) - rel->r_addend += sec->output_offset; - continue; - } + continue; if (h != NULL) name = h->root.root.string; @@ -7288,6 +7280,7 @@ const struct elf_size_info elfNN_aarch64_size_info = #define elf_backend_may_use_rel_p 0 #define elf_backend_may_use_rela_p 1 #define elf_backend_default_use_rela_p 1 +#define elf_backend_rela_normal 1 #define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3) #define elf_backend_default_execstack 0 diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 50a1b8a9986..bbef087cfdd 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2014-07-08 Jiong Wang + + * ld-aarch64/emit-relocs-local-addend-bar.s: New source file. + * ld-aarch64/emit-relocs-local-addend-foo.s: Likewise. + * ld-aarch64/emit-relocs-local-addend.d: New testcase. + * ld-aarch64/local-addend-r.d: Likewise. + 2014-07-08 Alan Modra PR 17112 diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index 845ea202b4e..36babf3b4ee 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -87,6 +87,10 @@ run_dump_test "emit-relocs-309-low-bad" run_dump_test "emit-relocs-311" run_dump_test "emit-relocs-312" +# test addend correctness when --emit-relocs specified for non-relocatable obj. +run_dump_test "emit-relocs-local-addend" +# test addend correctness when -r specified. +run_dump_test "local-addend-r" run_dump_test "limit-b" run_dump_test "limit-bl" diff --git a/ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s new file mode 100644 index 00000000000..ab8b0fbdcb3 --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-bar.s @@ -0,0 +1,19 @@ + .global b + .section .rodata + .align 3 +.LC0: + .string "bar" + .align 3 + .type b, %object + .size b, 8 +b: + .xword .LC0 + .text + .align 2 + .global bar + .type bar, %function +bar: + adrp x0, .LC0 + add x0, x0, :lo12:.LC0 + ret + .size bar, .-bar diff --git a/ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s new file mode 100644 index 00000000000..497eef7e84e --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-local-addend-foo.s @@ -0,0 +1,20 @@ + .cpu generic+fp+simd + .global a + .section .rodata + .align 3 +.LC0: + .string "foo" + .align 3 + .type a, %object + .size a, 8 +a: + .xword .LC0 + .text + .align 2 + .global foo + .type foo, %function +foo: + adrp x0, .LC0 + add x0, x0, :lo12:.LC0 + ret + .size foo, .-foo diff --git a/ld/testsuite/ld-aarch64/emit-relocs-local-addend.d b/ld/testsuite/ld-aarch64/emit-relocs-local-addend.d new file mode 100644 index 00000000000..1739e644559 --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-local-addend.d @@ -0,0 +1,16 @@ +#source: emit-relocs-local-addend-foo.s +#source: emit-relocs-local-addend-bar.s +#ld: -e0 --emit-relocs +#readelf: -r + +Relocation section '\.rela\.text' at offset 0x102f8 contains 4 entries: + Offset Info Type Sym\. Value Sym\. Name \+ Addend +000000400000 000200000113 R_AARCH64_ADR_PRE 0000000000400018 \.rodata \+ 0 +000000400004 000200000115 R_AARCH64_ADD_ABS 0000000000400018 \.rodata \+ 0 +00000040000c 000200000113 R_AARCH64_ADR_PRE 0000000000400018 \.rodata \+ 10 +000000400010 000200000115 R_AARCH64_ADD_ABS 0000000000400018 \.rodata \+ 10 + +Relocation section '\.rela\.rodata' at offset 0x10358 contains 2 entries: + Offset Info Type Sym\. Value Sym. Name \+ Addend +000000400020 000200000101 R_AARCH64_ABS64 0000000000400018 \.rodata \+ 0 +000000400030 000200000101 R_AARCH64_ABS64 0000000000400018 \.rodata \+ 10 diff --git a/ld/testsuite/ld-aarch64/local-addend-r.d b/ld/testsuite/ld-aarch64/local-addend-r.d new file mode 100644 index 00000000000..c8c27771715 --- /dev/null +++ b/ld/testsuite/ld-aarch64/local-addend-r.d @@ -0,0 +1,16 @@ +#source: emit-relocs-local-addend-foo.s +#source: emit-relocs-local-addend-bar.s +#ld: -e0 -r +#readelf: -r + +Relocation section '\.rela\.text' at offset 0x338 contains 4 entries: + Offset Info Type Sym\. Value Sym\. Name \+ Addend +000000000000 000200000113 R_AARCH64_ADR_PRE 0000000000000000 \.rodata \+ 0 +000000000004 000200000115 R_AARCH64_ADD_ABS 0000000000000000 \.rodata \+ 0 +00000000000c 000200000113 R_AARCH64_ADR_PRE 0000000000000000 \.rodata \+ 10 +000000000010 000200000115 R_AARCH64_ADD_ABS 0000000000000000 \.rodata \+ 10 + +Relocation section '\.rela\.rodata' at offset 0x398 contains 2 entries: + Offset Info Type Sym\. Value Sym. Name \+ Addend +000000000008 000200000101 R_AARCH64_ABS64 0000000000000000 \.rodata \+ 0 +000000000018 000200000101 R_AARCH64_ABS64 0000000000000000 \.rodata \+ 10