From: H.J. Lu Date: Fri, 12 Aug 2011 19:42:39 +0000 (+0000) Subject: Add R_X86_64_RELATIVE64 and handle R_X86_64_64 for x32. X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=64d25c44142091760a88c3bc8235c99ddc8cbfa1;p=deliverable%2Fbinutils-gdb.git Add R_X86_64_RELATIVE64 and handle R_X86_64_64 for x32. bfd/ 2011-08-12 H.J. Lu PR ld/13082 * elf64-x86-64.c (x86_64_elf_howto_table): Add R_X86_64_RELATIVE64. (elf_x86_64_relocate_section): Treat R_X86_64_64 like R_X86_64_32 and zero-extend it to 64bit if addend is zero for x32. Generate R_X86_64_RELATIVE64 for x32. include/elf/ 2011-08-12 H.J. Lu PR ld/13082 * x86-64.h (R_X86_64_RELATIVE64): New. ld/testsuite/ 2011-08-12 H.J. Lu PR ld/13082 * ld-x86-64/pr13082-1.s: New. * ld-x86-64/pr13082-1a.d: Likewise. * ld-x86-64/pr13082-1b.d: Likewise. * ld-x86-64/pr13082-2.s: Likewise. * ld-x86-64/pr13082-2a.d: Likewise. * ld-x86-64/pr13082-2b.d: Likewise. * ld-x86-64/pr13082-3.s: Likewise. * ld-x86-64/pr13082-3a.d: Likewise. * ld-x86-64/pr13082-3b.d: Likewise. * ld-x86-64/pr13082-4.s: Likewise. * ld-x86-64/pr13082-4a.d: Likewise. * ld-x86-64/pr13082-4b.d: Likewise. * ld-x86-64/pr13082-5.s: Likewise. * ld-x86-64/pr13082-5a.d: Likewise. * ld-x86-64/pr13082-5b.d: Likewise. * ld-x86-64/pr13082-6.s: Likewise. * ld-x86-64/pr13082-6a.d: Likewise. * ld-x86-64/pr13082-6b.d: Likewise. * ld-x86-64/x86-64.exp: Run pr13082-[1-6][ab]. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c811179469..f76cf77bf4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2011-08-12 H.J. Lu + + PR ld/13082 + * elf64-x86-64.c (x86_64_elf_howto_table): Add R_X86_64_RELATIVE64. + (elf_x86_64_relocate_section): Treat R_X86_64_64 like R_X86_64_32 + and zero-extend it to 64bit if addend is zero for x32. Generate + R_X86_64_RELATIVE64 for x32. + 2011-08-09 Matthew Gretton-Dann * bfd-in.h (bfd_elf32_arm_set_target_relocs): Update prototype. diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 7b92097120..238c7bd29b 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -164,6 +164,9 @@ static reloc_howto_type x86_64_elf_howto_table[] = HOWTO(R_X86_64_IRELATIVE, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_X86_64_IRELATIVE", FALSE, MINUS_ONE, MINUS_ONE, FALSE), + HOWTO(R_X86_64_RELATIVE64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_X86_64_RELATIVE64", FALSE, MINUS_ONE, + MINUS_ONE, FALSE), /* We have a gap in the reloc numbers here. R_X86_64_standard counts the number up to this point, and @@ -3083,6 +3086,16 @@ elf_x86_64_relocate_section (bfd *output_bfd, if (info->relocatable) continue; + if (rel->r_addend == 0 + && r_type == R_X86_64_64 + && !ABI_64_P (output_bfd)) + { + /* For x32, treat R_X86_64_64 like R_X86_64_32 and zero-extend + it to 64bit if addend is zero. */ + r_type = R_X86_64_32; + memset (contents + rel->r_offset + 4, 0, 4); + } + /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it here if it is defined in a non-shared object. */ if (h != NULL @@ -3597,6 +3610,14 @@ elf_x86_64_relocate_section (bfd *output_bfd, outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE); outrel.r_addend = relocation + rel->r_addend; } + else if (r_type == R_X86_64_64 + && !ABI_64_P (output_bfd)) + { + relocate = TRUE; + outrel.r_info = htab->r_info (0, + R_X86_64_RELATIVE64); + outrel.r_addend = relocation + rel->r_addend; + } else { long sindx; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 86604a729a..013fbebe73 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,27 @@ +2011-08-12 H.J. Lu + + PR ld/13082 + * ld-x86-64/pr13082-1.s: New. + * ld-x86-64/pr13082-1a.d: Likewise. + * ld-x86-64/pr13082-1b.d: Likewise. + * ld-x86-64/pr13082-2.s: Likewise. + * ld-x86-64/pr13082-2a.d: Likewise. + * ld-x86-64/pr13082-2b.d: Likewise. + * ld-x86-64/pr13082-3.s: Likewise. + * ld-x86-64/pr13082-3a.d: Likewise. + * ld-x86-64/pr13082-3b.d: Likewise. + * ld-x86-64/pr13082-4.s: Likewise. + * ld-x86-64/pr13082-4a.d: Likewise. + * ld-x86-64/pr13082-4b.d: Likewise. + * ld-x86-64/pr13082-5.s: Likewise. + * ld-x86-64/pr13082-5a.d: Likewise. + * ld-x86-64/pr13082-5b.d: Likewise. + * ld-x86-64/pr13082-6.s: Likewise. + * ld-x86-64/pr13082-6a.d: Likewise. + * ld-x86-64/pr13082-6b.d: Likewise. + + * ld-x86-64/x86-64.exp: Run pr13082-[1-6][ab]. + 2011-08-09 Matthew Gretton-Dann * ld-arm/arm-elf.exp (armelftests): Update for new command-line diff --git a/ld/testsuite/ld-x86-64/pr13082-1.s b/ld/testsuite/ld-x86-64/pr13082-1.s new file mode 100644 index 0000000000..6c03e980e4 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-1.s @@ -0,0 +1,10 @@ + .text + .globl _start +_start: + lea .Ljmp(%rip), %rax +.L1: + jmp *(%rax) + .section .data.rel.ro.local,"aw",@progbits + .align 8 +.Ljmp: + .quad .L1 diff --git a/ld/testsuite/ld-x86-64/pr13082-1a.d b/ld/testsuite/ld-x86-64/pr13082-1a.d new file mode 100644 index 0000000000..f0e98ffc90 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-1a.d @@ -0,0 +1,9 @@ +#source: pr13082-1.s +#name: PR ld/13082-1 (a) +#as: --x32 +#ld: -shared -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE64 +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/pr13082-1b.d b/ld/testsuite/ld-x86-64/pr13082-1b.d new file mode 100644 index 0000000000..f10481f85e --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-1b.d @@ -0,0 +1,9 @@ +#source: pr13082-1.s +#name: PR ld/13082-1 (b) +#as: --x32 +#ld: -pie -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE64 +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/pr13082-2.s b/ld/testsuite/ld-x86-64/pr13082-2.s new file mode 100644 index 0000000000..d1847a6557 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-2.s @@ -0,0 +1,9 @@ + .text + .globl _start +_start: + lea .Ljmp(%rip), %rax + jmp *(%rax) + .section .data.rel.ro.local,"aw",@progbits + .align 8 +.Ljmp: + .quad _start diff --git a/ld/testsuite/ld-x86-64/pr13082-2a.d b/ld/testsuite/ld-x86-64/pr13082-2a.d new file mode 100644 index 0000000000..aed33c2416 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-2a.d @@ -0,0 +1,9 @@ +#source: pr13082-2.s +#name: PR ld/13082-2 (a) +#as: --x32 +#ld: -shared -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +[0-9a-f]+ +_start \+ 0 diff --git a/ld/testsuite/ld-x86-64/pr13082-2b.d b/ld/testsuite/ld-x86-64/pr13082-2b.d new file mode 100644 index 0000000000..b000e85bba --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-2b.d @@ -0,0 +1,9 @@ +#source: pr13082-2.s +#name: PR ld/13082-2 (b) +#as: --x32 +#ld: -pie -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/pr13082-3.s b/ld/testsuite/ld-x86-64/pr13082-3.s new file mode 100644 index 0000000000..b76eb0f938 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-3.s @@ -0,0 +1,10 @@ + .text + .globl _start +_start: + lea .Ljmp(%rip), %rax + jmp *(%rax) + .section .data.rel.ro.local,"aw",@progbits + .weak func + .align 8 +.Ljmp: + .quad func diff --git a/ld/testsuite/ld-x86-64/pr13082-3a.d b/ld/testsuite/ld-x86-64/pr13082-3a.d new file mode 100644 index 0000000000..bf176f983a --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-3a.d @@ -0,0 +1,9 @@ +#source: pr13082-3.s +#name: PR ld/13082-3 (a) +#as: --x32 +#ld: -shared -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +[0-9a-f]+ +func \+ 0 diff --git a/ld/testsuite/ld-x86-64/pr13082-3b.d b/ld/testsuite/ld-x86-64/pr13082-3b.d new file mode 100644 index 0000000000..12efaf0964 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-3b.d @@ -0,0 +1,9 @@ +#source: pr13082-3.s +#name: PR ld/13082-3 (b) +#as: --x32 +#ld: -pie -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +[0-9a-f]+ +func \+ 0 diff --git a/ld/testsuite/ld-x86-64/pr13082-4.s b/ld/testsuite/ld-x86-64/pr13082-4.s new file mode 100644 index 0000000000..ed8506d5e6 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-4.s @@ -0,0 +1,10 @@ + .text + .globl _start +_start: + lea .Ljmp(%rip), %rax + jmp *(%rax) + .section .data.rel.ro.local,"aw",@progbits + .weak func + .align 8 +.Ljmp: + .quad func + 1 diff --git a/ld/testsuite/ld-x86-64/pr13082-4a.d b/ld/testsuite/ld-x86-64/pr13082-4a.d new file mode 100644 index 0000000000..bb2c573557 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-4a.d @@ -0,0 +1,9 @@ +#source: pr13082-4.s +#name: PR ld/13082-4 (a) +#as: --x32 +#ld: -shared -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_64 +[0-9a-f]+ +func \+ 1 diff --git a/ld/testsuite/ld-x86-64/pr13082-4b.d b/ld/testsuite/ld-x86-64/pr13082-4b.d new file mode 100644 index 0000000000..cb4d90af19 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-4b.d @@ -0,0 +1,9 @@ +#source: pr13082-4.s +#name: PR ld/13082-4 (b) +#as: --x32 +#ld: -pie -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_64 +[0-9a-f]+ +func \+ 1 diff --git a/ld/testsuite/ld-x86-64/pr13082-5.s b/ld/testsuite/ld-x86-64/pr13082-5.s new file mode 100644 index 0000000000..9757fcbf82 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-5.s @@ -0,0 +1,12 @@ + .text + .globl _start + .globl ifunc + .type ifunc, @gnu_indirect_function +_start: + lea .Ljmp(%rip), %rax +ifunc: + jmp *(%rax) + .section .data.rel.ro.local,"aw",@progbits + .align 8 +.Ljmp: + .quad ifunc diff --git a/ld/testsuite/ld-x86-64/pr13082-5a.d b/ld/testsuite/ld-x86-64/pr13082-5a.d new file mode 100644 index 0000000000..e5b0c113e7 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-5a.d @@ -0,0 +1,14 @@ +#source: pr13082-5.s +#name: PR ld/13082-5 (a) +#as: --x32 +#ld: -shared -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 2 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +ifunc\(\)+ +ifunc \+ 0 +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_GLOB_DAT +ifunc\(\)+ +ifunc \+ 0 + +Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_JUMP_SLOT +ifunc\(\)+ +ifunc \+ 0 diff --git a/ld/testsuite/ld-x86-64/pr13082-5b.d b/ld/testsuite/ld-x86-64/pr13082-5b.d new file mode 100644 index 0000000000..1c5a5e79b5 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-5b.d @@ -0,0 +1,13 @@ +#source: pr13082-5.s +#name: PR ld/13082-5 (b) +#as: --x32 +#ld: -pie -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+ + +Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/pr13082-6.s b/ld/testsuite/ld-x86-64/pr13082-6.s new file mode 100644 index 0000000000..eb88fb6f3e --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-6.s @@ -0,0 +1,11 @@ + .text + .globl _start + .type ifunc, @gnu_indirect_function +_start: + lea .Ljmp(%rip), %rax +ifunc: + jmp *(%rax) + .section .data.rel.ro.local,"aw",@progbits + .align 8 +.Ljmp: + .quad ifunc diff --git a/ld/testsuite/ld-x86-64/pr13082-6a.d b/ld/testsuite/ld-x86-64/pr13082-6a.d new file mode 100644 index 0000000000..9a1a655185 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-6a.d @@ -0,0 +1,13 @@ +#source: pr13082-6.s +#name: PR ld/13082-6 (a) +#as: --x32 +#ld: -shared -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+ + +Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/pr13082-6b.d b/ld/testsuite/ld-x86-64/pr13082-6b.d new file mode 100644 index 0000000000..792c3483eb --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr13082-6b.d @@ -0,0 +1,13 @@ +#source: pr13082-6.s +#name: PR ld/13082-6 (b) +#as: --x32 +#ld: -pie -melf32_x86_64 +#readelf: -r --wide + +Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+ + +Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries: + Offset Info Type Sym. Value Symbol's Name \+ Addend +[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+ diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 2b8721c142..77b081ba46 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -213,6 +213,18 @@ run_dump_test "ia32-3" run_dump_test "lp64-1" run_dump_test "lp64-2" run_dump_test "lp64-3" +run_dump_test "pr13082-1a" +run_dump_test "pr13082-1b" +run_dump_test "pr13082-2a" +run_dump_test "pr13082-2b" +run_dump_test "pr13082-3a" +run_dump_test "pr13082-3b" +run_dump_test "pr13082-4a" +run_dump_test "pr13082-4b" +run_dump_test "pr13082-5a" +run_dump_test "pr13082-5b" +run_dump_test "pr13082-6a" +run_dump_test "pr13082-6b" # Must be native with the C compiler if { [isnative] && [which $CC] != 0 } {