From efc3a950394676d0781f0397655d1e8be56450bf Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 1 Apr 2020 05:40:45 -0700 Subject: [PATCH] x86: Force relocation against local absolute symbol Define TC_FORCE_RELOCATION_ABS to force relocation against local absolute symbol. PR gas/25756 * config/tc-i386.h (TC_FORCE_RELOCATION_ABS): New. * testsuite/gas/i386/localpic.s: Add a test for relocation against local absolute symbol. * testsuite/gas/i386/x86-64-localpic.s: Likewise. * testsuite/gas/i386/localpic.d: Updated. * testsuite/gas/i386/x86-64-localpic.d: Likewise. * testsuite/gas/i386/ilp32/x86-64-localpic.d: Likewise. --- gas/ChangeLog | 11 +++++++++++ gas/config/tc-i386.h | 8 ++++++++ gas/testsuite/gas/i386/ilp32/x86-64-localpic.d | 4 +++- gas/testsuite/gas/i386/localpic.d | 4 +++- gas/testsuite/gas/i386/localpic.s | 2 ++ gas/testsuite/gas/i386/x86-64-localpic.d | 4 +++- gas/testsuite/gas/i386/x86-64-localpic.s | 2 ++ 7 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 2d68a2741d3..ef0217e5d70 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2020-04-01 H.J. Lu + + PR gas/25756 + * config/tc-i386.h (TC_FORCE_RELOCATION_ABS): New. + * testsuite/gas/i386/localpic.s: Add a test for relocation + against local absolute symbol. + * testsuite/gas/i386/x86-64-localpic.s: Likewise. + * testsuite/gas/i386/localpic.d: Updated. + * testsuite/gas/i386/x86-64-localpic.d: Likewise. + * testsuite/gas/i386/ilp32/x86-64-localpic.d: Likewise. + 2020-04-01 Rainer Orth PR gas/25732 diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index 93678c22822..cb426b5b911 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -180,6 +180,14 @@ extern int tc_i386_fix_adjustable (struct fix *); || (FIX)->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX \ || (FIX)->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX) +#define TC_FORCE_RELOCATION_ABS(FIX) \ + (TC_FORCE_RELOCATION (FIX) \ + || (FIX)->fx_r_type == BFD_RELOC_386_GOT32 \ + || (FIX)->fx_r_type == BFD_RELOC_386_GOT32X \ + || (FIX)->fx_r_type == BFD_RELOC_X86_64_GOTPCREL \ + || (FIX)->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX \ + || (FIX)->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX) + extern int i386_parse_name (char *, expressionS *, char *); #define md_parse_name(s, e, m, c) i386_parse_name (s, e, c) diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d b/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d index e9b77f2b171..d0cc4e8efc9 100644 --- a/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d +++ b/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d @@ -3,9 +3,11 @@ #readelf: -rsW #name: x86-64 (ILP32) local PIC -Relocation section '.rela.text' at offset 0x[0-9a-f]+ contains 1 entry: +Relocation section '.rela.text' 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_REX_GOTPCRELX +[0-9a-f]+ +foo - 4 +[0-9a-f]+ +[0-9a-f]+ R_X86_64_REX_GOTPCRELX +[0-9a-f]+ +bar - 4 #... +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +NOTYPE +LOCAL +DEFAULT +[0-9]+ +foo + +[0-9]+: +fffffff0 +[0-9a-f]+ +NOTYPE +LOCAL +DEFAULT +ABS +bar #pass diff --git a/gas/testsuite/gas/i386/localpic.d b/gas/testsuite/gas/i386/localpic.d index 88d3566412f..b06137f437f 100644 --- a/gas/testsuite/gas/i386/localpic.d +++ b/gas/testsuite/gas/i386/localpic.d @@ -2,9 +2,11 @@ #readelf: -rs #name: i386 local PIC -Relocation section '.rel.text' at offset 0x[0-9a-f]+ contains 1 entry: +Relocation section '.rel.text' at offset 0x[0-9a-f]+ contains 2 entries: Offset Info Type Sym.Value Sym. Name [0-9a-f]+ +[0-9a-f]+ R_386_GOT32X +[0-9a-f]+ +foo +[0-9a-f]+ +[0-9a-f]+ R_386_GOT32X +[0-9a-f]+ +bar #... +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +NOTYPE +LOCAL +DEFAULT +[0-9]+ +foo + +[0-9]+: +fffffff0 +[0-9a-f]+ +NOTYPE +LOCAL +DEFAULT +ABS +bar #pass diff --git a/gas/testsuite/gas/i386/localpic.s b/gas/testsuite/gas/i386/localpic.s index e63394445ee..f57fb18638a 100644 --- a/gas/testsuite/gas/i386/localpic.s +++ b/gas/testsuite/gas/i386/localpic.s @@ -3,3 +3,5 @@ foo: .long 0 .text movl foo@GOT(%ecx), %eax +movl bar@GOT(%ecx), %eax + bar = 0xfffffff0 diff --git a/gas/testsuite/gas/i386/x86-64-localpic.d b/gas/testsuite/gas/i386/x86-64-localpic.d index 9f8b43edb04..62030d410ad 100644 --- a/gas/testsuite/gas/i386/x86-64-localpic.d +++ b/gas/testsuite/gas/i386/x86-64-localpic.d @@ -2,9 +2,11 @@ #readelf: -rsW #name: x86-64 local PIC -Relocation section '.rela.text' at offset 0x[0-9a-f]+ contains 1 entry: +Relocation section '.rela.text' at offset 0x[0-9a-f]+ contains 2 entries: +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend [0-9a-f]+ +[0-9a-f]+ R_X86_64_REX_GOTPCRELX +[0-9a-f]+ +foo - 4 +[0-9a-f]+ +[0-9a-f]+ R_X86_64_REX_GOTPCRELX +[0-9a-f]+ +bar - 4 #... +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +NOTYPE +LOCAL +DEFAULT +[0-9]+ +foo + +[0-9]+: +0+fffffff0 +[0-9a-f]+ +NOTYPE +LOCAL +DEFAULT +ABS +bar #pass diff --git a/gas/testsuite/gas/i386/x86-64-localpic.s b/gas/testsuite/gas/i386/x86-64-localpic.s index c73a7c563bc..beda94dc2f3 100644 --- a/gas/testsuite/gas/i386/x86-64-localpic.s +++ b/gas/testsuite/gas/i386/x86-64-localpic.s @@ -2,3 +2,5 @@ foo: .quad 0 movq foo@GOTPCREL(%rip), %rax + movq bar@GOTPCREL(%rip), %rax + bar = 0xfffffff0 -- 2.30.2