diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2018-12-19 12:21:56 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2018-12-19 12:22:12 -0800 |
commit | b9519cfe9828b9ee5a73e74b4be83d46f33e6886 (patch) | |
tree | aecea8a8890eb3cc814a80abdf7c0a976a889f01 /gas | |
parent | fc999e8020ffe8e1136da70f275bceafaa62a588 (diff) | |
download | gdb-b9519cfe9828b9ee5a73e74b4be83d46f33e6886.zip gdb-b9519cfe9828b9ee5a73e74b4be83d46f33e6886.tar.gz gdb-b9519cfe9828b9ee5a73e74b4be83d46f33e6886.tar.bz2 |
x86: Properly handle PLT expression in directive
For PLT expressions, we should subtract the PLT relocation size only for
jump instructions. Since PLT relocations are PC relative, we only allow
"symbol@PLT" in PLT expression.
gas/
PR gas/23997
* config/tc-i386.c (x86_cons): Check for invalid PLT expression.
(md_apply_fix): Subtract the PLT relocation size only for jump
instructions.
* testsuite/gas/i386/reloc32.s: Add test for invalid PLT
expression.
* testsuite/gas/i386/reloc64.s: Likewise.
* testsuite/gas/i386/ilp32/reloc64.s: Likewise.
* testsuite/gas/i386/reloc32.l: Updated.
* testsuite/gas/i386/reloc64.l: Likewise.
* testsuite/gas/i386/ilp32/reloc64.l: Likewise.
ld/
PR gas/23997
* testsuite/ld-i386/i386.exp: Run PR gas/23997 test.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-x86-64/pr23997a.s: New file.
* testsuite/ld-x86-64/pr23997b.c: Likewise.
* testsuite/ld-x86-64/pr23997c.c: Likewise.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 14 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 17 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/ilp32/reloc64.l | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/ilp32/reloc64.s | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc32.l | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc32.s | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc64.l | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc64.s | 1 |
8 files changed, 34 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 0015920..b21680a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,17 @@ +2018-12-19 H.J. Lu <hongjiu.lu@intel.com> + + PR gas/23997 + * config/tc-i386.c (x86_cons): Check for invalid PLT expression. + (md_apply_fix): Subtract the PLT relocation size only for jump + instructions. + * testsuite/gas/i386/reloc32.s: Add test for invalid PLT + expression. + * testsuite/gas/i386/reloc64.s: Likewise. + * testsuite/gas/i386/ilp32/reloc64.s: Likewise. + * testsuite/gas/i386/reloc32.l: Updated. + * testsuite/gas/i386/reloc64.l: Likewise. + * testsuite/gas/i386/ilp32/reloc64.l: Likewise. + 2018-12-14 H.J. Lu <hongjiu.lu@intel.com> PR ld/23900 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 8e25e6c..7640631 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -8919,6 +8919,15 @@ x86_cons (expressionS *exp, int size) as_bad (_("missing or invalid expression `%s'"), save); *input_line_pointer = c; } + else if ((got_reloc == BFD_RELOC_386_PLT32 + || got_reloc == BFD_RELOC_X86_64_PLT32) + && exp->X_op != O_symbol) + { + char c = *input_line_pointer; + *input_line_pointer = 0; + as_bad (_("invalid PLT expression `%s'"), save); + *input_line_pointer = c; + } } } else @@ -10533,9 +10542,11 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) { case BFD_RELOC_386_PLT32: case BFD_RELOC_X86_64_PLT32: - /* Make the jump instruction point to the address of the operand. At - runtime we merely add the offset to the actual PLT entry. */ - value = -4; + /* Make the jump instruction point to the address of the operand. + At runtime we merely add the offset to the actual PLT entry. + NB: Subtract the offset size only for jump instructions. */ + if (fixP->fx_pcrel) + value = -4; break; case BFD_RELOC_386_TLS_GD: diff --git a/gas/testsuite/gas/i386/ilp32/reloc64.l b/gas/testsuite/gas/i386/ilp32/reloc64.l index ff49194..7a1808e 100644 --- a/gas/testsuite/gas/i386/ilp32/reloc64.l +++ b/gas/testsuite/gas/i386/ilp32/reloc64.l @@ -51,3 +51,4 @@ .*:175: Error: .* .*:176: Error: .* .*:177: Error: .* +.*:189: Error: .* diff --git a/gas/testsuite/gas/i386/ilp32/reloc64.s b/gas/testsuite/gas/i386/ilp32/reloc64.s index 77764b3..3ab25ef 100644 --- a/gas/testsuite/gas/i386/ilp32/reloc64.s +++ b/gas/testsuite/gas/i386/ilp32/reloc64.s @@ -186,3 +186,4 @@ bad .byte xtrn@tpoff .quad xtrn - 0x80000000 .long xtrn@got - 4 .long xtrn@got + 4 +bad .long xtrn@plt - . diff --git a/gas/testsuite/gas/i386/reloc32.l b/gas/testsuite/gas/i386/reloc32.l index 9299445..3fb3255 100644 --- a/gas/testsuite/gas/i386/reloc32.l +++ b/gas/testsuite/gas/i386/reloc32.l @@ -65,4 +65,5 @@ .*:159: Error: .* .*:160: Error: .* .*:161: Error: .* +.*:164: Error: .* #pass diff --git a/gas/testsuite/gas/i386/reloc32.s b/gas/testsuite/gas/i386/reloc32.s index 855dcf5..e766a3d 100644 --- a/gas/testsuite/gas/i386/reloc32.s +++ b/gas/testsuite/gas/i386/reloc32.s @@ -161,3 +161,4 @@ bad .byte xtrn@ntpoff bad .byte xtrn@tpoff .long xtrn@got + 4 .long xtrn@got - 4 +bad .long xtrn@plt - . diff --git a/gas/testsuite/gas/i386/reloc64.l b/gas/testsuite/gas/i386/reloc64.l index 5e970cb..6d7a3c7 100644 --- a/gas/testsuite/gas/i386/reloc64.l +++ b/gas/testsuite/gas/i386/reloc64.l @@ -81,3 +81,4 @@ .*:218: Error: .* .*:219: Error: .* .*:220: Error: .* +.*:227: Error: .* diff --git a/gas/testsuite/gas/i386/reloc64.s b/gas/testsuite/gas/i386/reloc64.s index 0f9c51e..bc6f0fa 100644 --- a/gas/testsuite/gas/i386/reloc64.s +++ b/gas/testsuite/gas/i386/reloc64.s @@ -224,3 +224,4 @@ bad .byte xtrn@gotplt mov xtrn(,%ebx), %eax vgatherdps %xmm2, xtrn(,%xmm1), %xmm0 addr32 vgatherdps %xmm2, xtrn(,%xmm1), %xmm0 +bad .long xtrn@plt - . |