summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-01-26 15:07:47 -0800
committerH.J. Lu <hjl.tools@gmail.com>2016-01-29 16:31:18 -0800
commitd2a5f21c620a54e298d3464b801dc3f8d0b06fa2 (patch)
tree2a857ab033788d042b706a32863595c2671d2205
parent79915ff99e6c1df498d2ce89ac00a26bcaeeb190 (diff)
downloadbinutils-gdb-users/hjl/pr19520/master.tar.gz
Add -mrelax-relocations= to x86 assemblerusers/hjl/pr19520/master
-rw-r--r--gas/NEWS4
-rw-r--r--gas/config.in3
-rw-r--r--gas/config/tc-i386.c30
-rwxr-xr-xgas/configure38
-rw-r--r--gas/configure.ac29
-rw-r--r--gas/doc/c-i386.texi12
-rw-r--r--gas/testsuite/gas/i386/got-no-relax.d31
-rw-r--r--gas/testsuite/gas/i386/got.d1
-rw-r--r--gas/testsuite/gas/i386/i386.exp2
-rw-r--r--gas/testsuite/gas/i386/ilp32/x86-64-gotpcrel.d1
-rw-r--r--gas/testsuite/gas/i386/ilp32/x86-64-localpic.d1
-rw-r--r--gas/testsuite/gas/i386/localpic.d1
-rw-r--r--gas/testsuite/gas/i386/mixed-mode-reloc32.d1
-rw-r--r--gas/testsuite/gas/i386/reloc32.d1
-rw-r--r--gas/testsuite/gas/i386/x86-64-gotpcrel-no-relax.d27
-rw-r--r--gas/testsuite/gas/i386/x86-64-gotpcrel.d1
-rw-r--r--gas/testsuite/gas/i386/x86-64-localpic.d1
-rw-r--r--ld/testsuite/ld-i386/branch1.d2
-rw-r--r--ld/testsuite/ld-i386/call1.d2
-rw-r--r--ld/testsuite/ld-i386/call2.d2
-rw-r--r--ld/testsuite/ld-i386/call3a.d2
-rw-r--r--ld/testsuite/ld-i386/call3b.d2
-rw-r--r--ld/testsuite/ld-i386/call3c.d2
-rw-r--r--ld/testsuite/ld-i386/call3d.d2
-rw-r--r--ld/testsuite/ld-i386/call3e.d2
-rw-r--r--ld/testsuite/ld-i386/call3f.d2
-rw-r--r--ld/testsuite/ld-i386/call3g.d2
-rw-r--r--ld/testsuite/ld-i386/call3h.d2
-rw-r--r--ld/testsuite/ld-i386/got1.dd2
-rw-r--r--ld/testsuite/ld-i386/got1a.S11
-rw-r--r--ld/testsuite/ld-i386/got1d.S1
-rw-r--r--ld/testsuite/ld-i386/i386.exp10
-rw-r--r--ld/testsuite/ld-i386/jmp1.d2
-rw-r--r--ld/testsuite/ld-i386/jmp2.d2
-rw-r--r--ld/testsuite/ld-i386/lea1c.d2
-rw-r--r--ld/testsuite/ld-i386/load1.d2
-rw-r--r--ld/testsuite/ld-i386/load2.d2
-rw-r--r--ld/testsuite/ld-i386/load3.d2
-rw-r--r--ld/testsuite/ld-i386/load4a.d2
-rw-r--r--ld/testsuite/ld-i386/load5a.d2
-rw-r--r--ld/testsuite/ld-i386/mov2b.d2
-rw-r--r--ld/testsuite/ld-i386/mov3.d2
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-21-x86-64.d2
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-22-x86-64.d2
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1a.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1b.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1c.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1d.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1e.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1f.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1g.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1h.d2
-rw-r--r--ld/testsuite/ld-x86-64/call1i.d2
-rw-r--r--ld/testsuite/ld-x86-64/load1a.d2
-rw-r--r--ld/testsuite/ld-x86-64/load1b.d2
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp10
57 files changed, 236 insertions, 52 deletions
diff --git a/gas/NEWS b/gas/NEWS
index d66c2f588d4..4315cb8c8fe 100644
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,9 @@
-*- text -*-
+* Add a configure option --enable-x86-relax-relocations to decide
+ whether x86 assembler should generate relax relocations. Default
+ to yes, except for x86 Solaris targets older than Solaris 12.
+
Changes in 2.26:
* Add a configure option --enable-compressed-debug-sections={all,gas} to
diff --git a/gas/config.in b/gas/config.in
index 35c82026a21..8b040fc5084 100644
--- a/gas/config.in
+++ b/gas/config.in
@@ -39,6 +39,9 @@
/* Define if you want compressed debug sections by default. */
#undef DEFAULT_FLAG_COMPRESS_DEBUG
+/* Define to 1 if you want to generate x86 relax relocations by default. */
+#undef DEFAULT_GENERATE_X86_RELAX_RELOCATIONS
+
/* Supported emulations. */
#undef EMULATIONS
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 3a98b21d955..2bc76169509 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -556,6 +556,11 @@ static int omit_lock_prefix = 0;
"lock addl $0, (%{re}sp)". */
static int avoid_fence = 0;
+/* 1 if the assembler should generate relax relocations. */
+
+static int generate_relax_relocations
+ = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
+
static enum check_kind
{
check_none = 0,
@@ -7267,9 +7272,14 @@ output_disp (fragS *insn_start_frag, offsetT insn_start_off)
/* Check for "call/jmp *mem", "mov mem, %reg",
"test %reg, mem" and "binop mem, %reg" where binop
is one of adc, add, and, cmp, or, sbb, sub, xor
- instructions. */
- if ((i.rm.mode == 2
- || (i.rm.mode == 0 && i.rm.regmem == 5))
+ instructions. Always generate R_386_GOT32X for
+ "sym*GOT" operand in 32-bit mode. */
+ if ((generate_relax_relocations
+ || (!object_64bit
+ && i.rm.mode == 0
+ && i.rm.regmem == 5))
+ && (i.rm.mode == 2
+ || (i.rm.mode == 0 && i.rm.regmem == 5))
&& ((i.operands == 1
&& i.tm.base_opcode == 0xff
&& (i.rm.reg == 2 || i.rm.reg == 4))
@@ -9643,6 +9653,7 @@ const char *md_shortopts = "qn";
#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
+#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 25)
struct option md_longopts[] =
{
@@ -9675,6 +9686,7 @@ struct option md_longopts[] =
#endif
{"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
{"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
+ {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
{"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
{"mamd64", no_argument, NULL, OPTION_MAMD64},
{"mintel64", no_argument, NULL, OPTION_MINTEL64},
@@ -10003,6 +10015,15 @@ md_parse_option (int c, char *arg)
as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
break;
+ case OPTION_MRELAX_RELOCATIONS:
+ if (strcasecmp (arg, "yes") == 0)
+ generate_relax_relocations = 1;
+ else if (strcasecmp (arg, "no") == 0)
+ generate_relax_relocations = 0;
+ else
+ as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
+ break;
+
case OPTION_MAMD64:
cpu_arch_flags.bitfield.cpuamd64 = 1;
cpu_arch_flags.bitfield.cpuintel64 = 0;
@@ -10187,6 +10208,9 @@ md_show_usage (FILE *stream)
encode lfence, mfence and sfence as\n\
lock addl $0x0, (%%{re}sp)\n"));
fprintf (stream, _("\
+ -mrelax-relocations=[no|yes]\n\
+ generate relax relocations\n"));
+ fprintf (stream, _("\
-mamd64 accept only AMD64 ISA\n"));
fprintf (stream, _("\
-mintel64 accept only Intel64 ISA\n"));
diff --git a/gas/configure b/gas/configure
index b1731f0a276..cd7182f2942 100755
--- a/gas/configure
+++ b/gas/configure
@@ -765,6 +765,7 @@ enable_largefile
enable_targets
enable_checking
enable_compressed_debug_sections
+enable_x86_relax_relocations
enable_werror
enable_build_warnings
enable_nls
@@ -1415,6 +1416,8 @@ Optional Features:
--enable-checking enable run-time checks
--enable-compressed-debug-sections={all,gas,none}
compress debug sections by default
+ --enable-x86-relax-relocations
+ generate x86 relax relocations by default
--enable-werror treat compile warnings as errors
--enable-build-warnings enable build-time compiler warnings
--disable-nls do not use Native Language Support
@@ -10972,7 +10975,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10975 "configure"
+#line 10978 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11078,7 +11081,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11081 "configure"
+#line 11084 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11680,6 +11683,17 @@ if test "${enable_compressed_debug_sections+set}" = set; then :
esac
fi
+# PR gas/19520
+# Decide if x86 assembler should generate relax relocations.
+ac_default_x86_relax_relocations=unset
+# Provide a configure time option to override our default.
+# Check whether --enable-x86_relax_relocations was given.
+if test "${enable_x86_relax_relocations+set}" = set; then :
+ enableval=$enable_x86_relax_relocations; case "${enableval}" in
+ no) ac_default_x86_relax_relocations=0 ;;
+esac
+fi
+
using_cgen=no
@@ -12085,6 +12099,17 @@ $as_echo "#define STRICTCOFF 1" >>confdefs.h
;;
+ i386-*-solaris2 \
+ | x86_64-*-solaris2 \
+ | i386-*-solaris2.[0-9] \
+ | i386-*-solaris2.1[01] \
+ | x86_64-*-solaris2.1[01])
+ if test ${this_target} = $target \
+ && test ${ac_default_x86_relax_relocations} = unset; then
+ ac_default_x86_relax_relocations=0
+ fi
+ ;;
+
i860-*-*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GAS support for ${generic_target} is preliminary and a work in progress" >&5
$as_echo "$as_me: WARNING: GAS support for ${generic_target} is preliminary and a work in progress" >&2;}
@@ -12505,6 +12530,15 @@ _ACEOF
done
+if test ${ac_default_x86_relax_relocations} = unset; then
+ ac_default_x86_relax_relocations=1
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_GENERATE_X86_RELAX_RELOCATIONS $ac_default_x86_relax_relocations
+_ACEOF
+
+
if test x$ac_default_compressed_debug_sections = xyes ; then
$as_echo "#define DEFAULT_FLAG_COMPRESS_DEBUG 1" >>confdefs.h
diff --git a/gas/configure.ac b/gas/configure.ac
index 9af5121121b..377526e72b4 100644
--- a/gas/configure.ac
+++ b/gas/configure.ac
@@ -77,6 +77,17 @@ AC_ARG_ENABLE(compressed_debug_sections,
*) ac_default_compressed_debug_sections=unset ;;
esac])dnl
+# PR gas/19520
+# Decide if x86 assembler should generate relax relocations.
+ac_default_x86_relax_relocations=unset
+# Provide a configure time option to override our default.
+AC_ARG_ENABLE(x86_relax_relocations,
+ AS_HELP_STRING([--enable-x86-relax-relocations],
+ [generate x86 relax relocations by default]),
+[case "${enableval}" in
+ no) ac_default_x86_relax_relocations=0 ;;
+esac])dnl
+
using_cgen=no
AM_BINUTILS_WARNINGS
@@ -168,6 +179,17 @@ for this_target in $target $canon_targets ; do
AC_DEFINE(STRICTCOFF, 1, [Using strict COFF?])
;;
+ i386-*-solaris2 \
+ | x86_64-*-solaris2 \
+ | i386-*-solaris2.[[0-9]] \
+ | i386-*-solaris2.1[[01]] \
+ | x86_64-*-solaris2.1[[01]])
+ if test ${this_target} = $target \
+ && test ${ac_default_x86_relax_relocations} = unset; then
+ ac_default_x86_relax_relocations=0
+ fi
+ ;;
+
i860-*-*)
AC_MSG_WARN(GAS support for ${generic_target} is preliminary and a work in progress)
;;
@@ -549,6 +571,13 @@ changequote([,])dnl
done
+if test ${ac_default_x86_relax_relocations} = unset; then
+ ac_default_x86_relax_relocations=1
+fi
+AC_DEFINE_UNQUOTED(DEFAULT_GENERATE_X86_RELAX_RELOCATIONS,
+ $ac_default_x86_relax_relocations,
+ [Define to 1 if you want to generate x86 relax relocations by default.])
+
if test x$ac_default_compressed_debug_sections = xyes ; then
AC_DEFINE(DEFAULT_FLAG_COMPRESS_DEBUG, 1, [Define if you want compressed debug sections by default.])
fi
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 357851a3126..7d503495411 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -339,6 +339,18 @@ sfence as @samp{lock addl $0x0, (%rsp)} in 64-bit mode and
@option{-mfence-as-lock-add=@var{no}} will encode lfence, mfence and
sfence as usual, which is the default.
+@cindex @samp{-mrelax-relocations=} option, i386
+@cindex @samp{-mrelax-relocations=} option, x86-64
+@item -mrelax-relocations=@var{no}
+@itemx -mrelax-relocations=@var{yes}
+These options control whether the assembler should generate relax
+relocations, R_386_GOT32X, in 32-bit mode, or R_X86_64_GOTPCRELX and
+R_X86_64_REX_GOTPCRELX, in 64-bit mode.
+@option{-mrelax-relocations=@var{yes}} will generate relax relocations.
+@option{-mrelax-relocations=@var{no}} will not generate relax
+relocations. The default can be controlled by a configure option
+@option{--enable-x86-relax-relocations}.
+
@cindex @samp{-mevexrcig=} option, i386
@cindex @samp{-mevexrcig=} option, x86-64
@item -mevexrcig=@var{rne}
diff --git a/gas/testsuite/gas/i386/got-no-relax.d b/gas/testsuite/gas/i386/got-no-relax.d
new file mode 100644
index 00000000000..6bf138a5cb2
--- /dev/null
+++ b/gas/testsuite/gas/i386/got-no-relax.d
@@ -0,0 +1,31 @@
+#source: got.s
+#as: -mrelax-relocations=no
+#objdump: -dwr
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <_start>:
+[ ]*[a-f0-9]+: b8 00 00 00 00 mov \$0x0,%eax 1: R_386_GOT32 foo
+[ ]*[a-f0-9]+: 8b 05 00 00 00 00 mov 0x0,%eax 7: R_386_GOT32X foo
+[ ]*[a-f0-9]+: 8b 80 00 00 00 00 mov 0x0\(%eax\),%eax d: R_386_GOT32 foo
+[ ]*[a-f0-9]+: 05 00 00 00 00 add \$0x0,%eax 12: R_386_GOT32 foo
+[ ]*[a-f0-9]+: 03 05 00 00 00 00 add 0x0,%eax 18: R_386_GOT32X foo
+[ ]*[a-f0-9]+: 03 80 00 00 00 00 add 0x0\(%eax\),%eax 1e: R_386_GOT32 foo
+[ ]*[a-f0-9]+: ff 15 00 00 00 00 call \*0x0 24: R_386_GOT32X foo
+[ ]*[a-f0-9]+: ff 90 00 00 00 00 call \*0x0\(%eax\) 2a: R_386_GOT32 foo
+[ ]*[a-f0-9]+: ff 25 00 00 00 00 jmp \*0x0 30: R_386_GOT32X foo
+[ ]*[a-f0-9]+: ff a0 00 00 00 00 jmp \*0x0\(%eax\) 36: R_386_GOT32 foo
+[ ]*[a-f0-9]+: b8 00 00 00 00 mov \$0x0,%eax 3b: R_386_GOT32 foo
+[ ]*[a-f0-9]+: 8b 05 00 00 00 00 mov 0x0,%eax 41: R_386_GOT32X foo
+[ ]*[a-f0-9]+: 8b 80 00 00 00 00 mov 0x0\(%eax\),%eax 47: R_386_GOT32 foo
+[ ]*[a-f0-9]+: 05 00 00 00 00 add \$0x0,%eax 4c: R_386_GOT32 foo
+[ ]*[a-f0-9]+: 03 05 00 00 00 00 add 0x0,%eax 52: R_386_GOT32X foo
+[ ]*[a-f0-9]+: 03 80 00 00 00 00 add 0x0\(%eax\),%eax 58: R_386_GOT32 foo
+[ ]*[a-f0-9]+: ff 90 00 00 00 00 call \*0x0\(%eax\) 5e: R_386_GOT32 foo
+[ ]*[a-f0-9]+: ff 15 00 00 00 00 call \*0x0 64: R_386_GOT32X foo
+[ ]*[a-f0-9]+: ff a0 00 00 00 00 jmp \*0x0\(%eax\) 6a: R_386_GOT32 foo
+[ ]*[a-f0-9]+: ff 25 00 00 00 00 jmp \*0x0 70: R_386_GOT32X foo
+#pass
diff --git a/gas/testsuite/gas/i386/got.d b/gas/testsuite/gas/i386/got.d
index f76ca47e37d..7621cdf0700 100644
--- a/gas/testsuite/gas/i386/got.d
+++ b/gas/testsuite/gas/i386/got.d
@@ -1,3 +1,4 @@
+#as: -mrelax-relocations=yes
#objdump: -dwr
.*: +file format .*
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index b9144c4a9d4..22aca23b15d 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -408,6 +408,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
run_dump_test "relax-4"
run_dump_test "got"
+ run_dump_test "got-no-relax"
if {![istarget "*-*-nacl*"]} then {
run_dump_test "iamcu-1"
@@ -788,6 +789,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
run_list_test "x86-64-branch-3" "-al -mintel64"
run_dump_test "x86-64-gotpcrel"
+ run_dump_test "x86-64-gotpcrel-no-relax"
}
set ASFLAGS "$old_ASFLAGS"
diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-gotpcrel.d b/gas/testsuite/gas/i386/ilp32/x86-64-gotpcrel.d
index e5a3b1ca30a..1314e5b508e 100644
--- a/gas/testsuite/gas/i386/ilp32/x86-64-gotpcrel.d
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-gotpcrel.d
@@ -1,4 +1,5 @@
#source: ../x86-64-gotpcrel.s
+#as: --x32 -mrelax-relocations=yes
#objdump: -dwr
#name: x86-64 (ILP32) gotpcrel
diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d b/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d
index 0ca69c7ba40..a9528a271dd 100644
--- a/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-localpic.d
@@ -1,4 +1,5 @@
#source: ../x86-64-localpic.s
+#as: --x32 -mrelax-relocations=yes
#readelf: -rsW
#name: x86-64 (ILP32) local PIC
diff --git a/gas/testsuite/gas/i386/localpic.d b/gas/testsuite/gas/i386/localpic.d
index 04fb5ce0daf..0a5eec5d1e0 100644
--- a/gas/testsuite/gas/i386/localpic.d
+++ b/gas/testsuite/gas/i386/localpic.d
@@ -1,3 +1,4 @@
+#as: -mrelax-relocations=yes
#readelf: -rs
#name: i386 local PIC
diff --git a/gas/testsuite/gas/i386/mixed-mode-reloc32.d b/gas/testsuite/gas/i386/mixed-mode-reloc32.d
index 9affc367bba..a2ef6a0b858 100644
--- a/gas/testsuite/gas/i386/mixed-mode-reloc32.d
+++ b/gas/testsuite/gas/i386/mixed-mode-reloc32.d
@@ -1,3 +1,4 @@
+#as: -mrelax-relocations=yes
#objdump: -r
#source: mixed-mode-reloc.s
#name: x86 mixed mode relocs (32-bit object)
diff --git a/gas/testsuite/gas/i386/reloc32.d b/gas/testsuite/gas/i386/reloc32.d
index 45c9cd2334f..b6e1bbd8104 100644
--- a/gas/testsuite/gas/i386/reloc32.d
+++ b/gas/testsuite/gas/i386/reloc32.d
@@ -1,3 +1,4 @@
+#as: -mrelax-relocations=yes
#objdump: -Drw
#name: i386 relocs
diff --git a/gas/testsuite/gas/i386/x86-64-gotpcrel-no-relax.d b/gas/testsuite/gas/i386/x86-64-gotpcrel-no-relax.d
new file mode 100644
index 00000000000..a3f89436b3e
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-gotpcrel-no-relax.d
@@ -0,0 +1,27 @@
+#source: x86-64-gotpcrel.s
+#as: -mrelax-relocations=no
+#objdump: -dwr
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <_start>:
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax 3: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: 48 8b 04 25 00 00 00 00 mov 0x0,%rax b: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: 48 8b 05 00 00 00 00 mov 0x0\(%rip\),%rax # 16 <_start\+0x16> 12: R_X86_64_GOTPCREL foo-0x4
+[ ]*[a-f0-9]+: 48 8b 81 00 00 00 00 mov 0x0\(%rcx\),%rax 19: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: ff 15 00 00 00 00 callq \*0x0\(%rip\) # 23 <_start\+0x23> 1f: R_X86_64_GOTPCREL foo-0x4
+[ ]*[a-f0-9]+: ff 90 00 00 00 00 callq \*0x0\(%rax\) 25: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: ff 25 00 00 00 00 jmpq \*0x0\(%rip\) # 2f <_start\+0x2f> 2b: R_X86_64_GOTPCREL foo-0x4
+[ ]*[a-f0-9]+: ff a1 00 00 00 00 jmpq \*0x0\(%rcx\) 31: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax 38: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: 48 8b 04 25 00 00 00 00 mov 0x0,%rax 40: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: 48 8b 05 00 00 00 00 mov 0x0\(%rip\),%rax # 4b <_start\+0x4b> 47: R_X86_64_GOTPCREL foo-0x4
+[ ]*[a-f0-9]+: 48 8b 81 00 00 00 00 mov 0x0\(%rcx\),%rax 4e: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: ff 15 00 00 00 00 callq \*0x0\(%rip\) # 58 <_start\+0x58> 54: R_X86_64_GOTPCREL foo-0x4
+[ ]*[a-f0-9]+: ff 90 00 00 00 00 callq \*0x0\(%rax\) 5a: R_X86_64_GOTPCREL foo
+[ ]*[a-f0-9]+: ff 25 00 00 00 00 jmpq \*0x0\(%rip\) # 64 <_start\+0x64> 60: R_X86_64_GOTPCREL foo-0x4
+[ ]*[a-f0-9]+: ff a1 00 00 00 00 jmpq \*0x0\(%rcx\) 66: R_X86_64_GOTPCREL foo
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-gotpcrel.d b/gas/testsuite/gas/i386/x86-64-gotpcrel.d
index 6ca3fc75bb3..fbe5e47ab14 100644
--- a/gas/testsuite/gas/i386/x86-64-gotpcrel.d
+++ b/gas/testsuite/gas/i386/x86-64-gotpcrel.d
@@ -1,3 +1,4 @@
+#as: -mrelax-relocations=yes
#objdump: -dwr
.*: +file format .*
diff --git a/gas/testsuite/gas/i386/x86-64-localpic.d b/gas/testsuite/gas/i386/x86-64-localpic.d
index 0a07149d0c7..bafaa9c19aa 100644
--- a/gas/testsuite/gas/i386/x86-64-localpic.d
+++ b/gas/testsuite/gas/i386/x86-64-localpic.d
@@ -1,3 +1,4 @@
+#as: -mrelax-relocations=yes
#readelf: -rsW
#name: x86-64 local PIC
diff --git a/ld/testsuite/ld-i386/branch1.d b/ld/testsuite/ld-i386/branch1.d
index a078f1d4a2a..81b069e4281 100644
--- a/ld/testsuite/ld-i386/branch1.d
+++ b/ld/testsuite/ld-i386/branch1.d
@@ -1,4 +1,4 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call1.d b/ld/testsuite/ld-i386/call1.d
index 69383b23cba..e3ebedcc6bc 100644
--- a/ld/testsuite/ld-i386/call1.d
+++ b/ld/testsuite/ld-i386/call1.d
@@ -1,3 +1,3 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -shared -melf_i386
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/call2.d b/ld/testsuite/ld-i386/call2.d
index 69383b23cba..e3ebedcc6bc 100644
--- a/ld/testsuite/ld-i386/call2.d
+++ b/ld/testsuite/ld-i386/call2.d
@@ -1,3 +1,3 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -shared -melf_i386
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/call3a.d b/ld/testsuite/ld-i386/call3a.d
index a8ff27f12f5..5a1e1df1b35 100644
--- a/ld/testsuite/ld-i386/call3a.d
+++ b/ld/testsuite/ld-i386/call3a.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3b.d b/ld/testsuite/ld-i386/call3b.d
index 06af6f5876e..de98ce41b01 100644
--- a/ld/testsuite/ld-i386/call3b.d
+++ b/ld/testsuite/ld-i386/call3b.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=prefix-addr
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3c.d b/ld/testsuite/ld-i386/call3c.d
index 64e83728e6f..0fdbee454a3 100644
--- a/ld/testsuite/ld-i386/call3c.d
+++ b/ld/testsuite/ld-i386/call3c.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=prefix-nop
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3d.d b/ld/testsuite/ld-i386/call3d.d
index a9274c8dbf0..4d965b30829 100644
--- a/ld/testsuite/ld-i386/call3d.d
+++ b/ld/testsuite/ld-i386/call3d.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=suffix-nop
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3e.d b/ld/testsuite/ld-i386/call3e.d
index 2876b49ce2d..608682c00f3 100644
--- a/ld/testsuite/ld-i386/call3e.d
+++ b/ld/testsuite/ld-i386/call3e.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=prefix-0x67
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3f.d b/ld/testsuite/ld-i386/call3f.d
index 5ab0cf170ac..f3a48696e91 100644
--- a/ld/testsuite/ld-i386/call3f.d
+++ b/ld/testsuite/ld-i386/call3f.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=prefix-0x90
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3g.d b/ld/testsuite/ld-i386/call3g.d
index 828777024f8..f3e3f364ba1 100644
--- a/ld/testsuite/ld-i386/call3g.d
+++ b/ld/testsuite/ld-i386/call3g.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=suffix-0x90
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/call3h.d b/ld/testsuite/ld-i386/call3h.d
index 83f371a1bfb..afd1ce822a7 100644
--- a/ld/testsuite/ld-i386/call3h.d
+++ b/ld/testsuite/ld-i386/call3h.d
@@ -1,5 +1,5 @@
#source: call3.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -z call-nop=suffix-144
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/got1.dd b/ld/testsuite/ld-i386/got1.dd
index e46153db262..e6e82dee910 100644
--- a/ld/testsuite/ld-i386/got1.dd
+++ b/ld/testsuite/ld-i386/got1.dd
@@ -10,6 +10,8 @@
[ ]*[a-f0-9]+: ff d0 call \*%eax
[ ]*[a-f0-9]+: [ a-f0-9]+ mov *0x[a-f0-9]+,%eax
[ ]*[a-f0-9]+: ff d0 call \*%eax
+[ ]*[a-f0-9]+: [ a-f0-9]+ call [a-f0-9]+ <__x86.get_pc_thunk.cx>
+[ ]*[a-f0-9]+: [ a-f0-9]+ add \$0x[a-f0-9]+,%ecx
[ ]*[a-f0-9]+: [ a-f0-9]+ lea *0x[a-f0-9]+,%ecx
[ ]*[a-f0-9]+: ff d1 call \*%ecx
[ ]*[a-f0-9]+: 83 ec 0c sub \$0xc,%esp
diff --git a/ld/testsuite/ld-i386/got1a.S b/ld/testsuite/ld-i386/got1a.S
index f3d5330b057..7a3f7b5b47d 100644
--- a/ld/testsuite/ld-i386/got1a.S
+++ b/ld/testsuite/ld-i386/got1a.S
@@ -12,10 +12,19 @@ main:
call *%eax
movl plt@GOT, %eax
call *%eax
- movl foo@GOT(%ebx), %ecx
+ call __x86.get_pc_thunk.cx
+ addl $_GLOBAL_OFFSET_TABLE_, %ecx
+ movl foo@GOT(%ecx), %ecx
call *%ecx
subl $12, %esp
pushl $0
pushl $0 # Push a dummy return address onto stack.
jmp *myexit@GOT
.size main, .-main
+ .section .text.__x86.get_pc_thunk.cx,"axG",@progbits,__x86.get_pc_thunk.cx,comdat
+ .globl __x86.get_pc_thunk.cx
+ .hidden __x86.get_pc_thunk.cx
+ .type __x86.get_pc_thunk.cx, @function
+__x86.get_pc_thunk.cx:
+ movl (%esp), %ecx
+ ret
diff --git a/ld/testsuite/ld-i386/got1d.S b/ld/testsuite/ld-i386/got1d.S
index a6d51c66eed..7e4c9b167d1 100644
--- a/ld/testsuite/ld-i386/got1d.S
+++ b/ld/testsuite/ld-i386/got1d.S
@@ -19,7 +19,6 @@ plt:
pushl %esi
pushl %ebx
call __x86.get_pc_thunk.bx
-1:
addl $_GLOBAL_OFFSET_TABLE_, %ebx
subl $20, %esp
leal __FUNCTION__.1866@GOTOFF(%ebx), %esi
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 04eb7b13e39..9d392c2a0bd 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -357,7 +357,7 @@ if { [isnative]
[list \
"Build libplt-main1.a" \
"" \
- "-fPIC" \
+ "-fPIC -Wa,-mrelax-relocations=yes" \
{ plt-main1.c } \
{{readelf {-Wr} plt-main1.rd}} \
"libplt-main1.a" \
@@ -365,7 +365,7 @@ if { [isnative]
[list \
"Build libplt-main2.a" \
"" \
- "-fPIC" \
+ "-fPIC -Wa,-mrelax-relocations=yes" \
{ plt-main2.c } \
{{readelf {-Wr} plt-main2.rd}} \
"libplt-main2.a" \
@@ -373,7 +373,7 @@ if { [isnative]
[list \
"Build libplt-main3.a" \
"" \
- "-fPIC $PLT_CFLAGS" \
+ "-fPIC -Wa,-mrelax-relocations=yes $PLT_CFLAGS" \
{ plt-main3.c } \
{{readelf {-Wr} plt-main3.rd}} \
"libplt-main3.a" \
@@ -381,7 +381,7 @@ if { [isnative]
[list \
"Build libplt-main4.a" \
"" \
- "-fPIC $PLT_CFLAGS" \
+ "-fPIC -Wa,-mrelax-relocations=yes $PLT_CFLAGS" \
{ plt-main4.c } \
{{readelf {-Wr} plt-main4.rd}} \
"libplt-main4.a" \
@@ -535,7 +535,7 @@ if { [isnative]
[list \
"Build gotpc1" \
"tmpdir/got1d.so" \
- "" \
+ "-Wa,-mrelax-relocations=yes" \
{ got1a.S got1b.c got1c.c } \
{{objdump {-dw} got1.dd}} \
"got1" \
diff --git a/ld/testsuite/ld-i386/jmp1.d b/ld/testsuite/ld-i386/jmp1.d
index 69383b23cba..e3ebedcc6bc 100644
--- a/ld/testsuite/ld-i386/jmp1.d
+++ b/ld/testsuite/ld-i386/jmp1.d
@@ -1,3 +1,3 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -shared -melf_i386
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/jmp2.d b/ld/testsuite/ld-i386/jmp2.d
index 69383b23cba..e3ebedcc6bc 100644
--- a/ld/testsuite/ld-i386/jmp2.d
+++ b/ld/testsuite/ld-i386/jmp2.d
@@ -1,3 +1,3 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -shared -melf_i386
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/lea1c.d b/ld/testsuite/ld-i386/lea1c.d
index dd76258be34..0c3580d21ae 100644
--- a/ld/testsuite/ld-i386/lea1c.d
+++ b/ld/testsuite/ld-i386/lea1c.d
@@ -1,5 +1,5 @@
#source: lea1.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/load1.d b/ld/testsuite/ld-i386/load1.d
index 062ea183bf9..a252a15efa2 100644
--- a/ld/testsuite/ld-i386/load1.d
+++ b/ld/testsuite/ld-i386/load1.d
@@ -1,4 +1,4 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386
#objdump: -dw --sym
#notarget: i?86-*-nacl* x86_64-*-nacl*
diff --git a/ld/testsuite/ld-i386/load2.d b/ld/testsuite/ld-i386/load2.d
index 87c2509dca3..467fee03e8d 100644
--- a/ld/testsuite/ld-i386/load2.d
+++ b/ld/testsuite/ld-i386/load2.d
@@ -1,3 +1,3 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -shared
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/load3.d b/ld/testsuite/ld-i386/load3.d
index 87c2509dca3..467fee03e8d 100644
--- a/ld/testsuite/ld-i386/load3.d
+++ b/ld/testsuite/ld-i386/load3.d
@@ -1,3 +1,3 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386 -shared
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/load4a.d b/ld/testsuite/ld-i386/load4a.d
index 3aa56bd4923..f3f02eae7bc 100644
--- a/ld/testsuite/ld-i386/load4a.d
+++ b/ld/testsuite/ld-i386/load4a.d
@@ -1,4 +1,4 @@
#source: load4.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -Bsymbolic -shared -melf_i386
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/load5a.d b/ld/testsuite/ld-i386/load5a.d
index 88c225a1b34..97443163de1 100644
--- a/ld/testsuite/ld-i386/load5a.d
+++ b/ld/testsuite/ld-i386/load5a.d
@@ -1,4 +1,4 @@
#source: load5.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -Bsymbolic -shared -melf_i386
#error: direct GOT relocation R_386_GOT32X against `foo' without base register can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/mov2b.d b/ld/testsuite/ld-i386/mov2b.d
index ea5dd9ba39b..295a7c5c5b1 100644
--- a/ld/testsuite/ld-i386/mov2b.d
+++ b/ld/testsuite/ld-i386/mov2b.d
@@ -1,5 +1,5 @@
#source: mov2.s
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -pie -melf_i386
#objdump: -dw
diff --git a/ld/testsuite/ld-i386/mov3.d b/ld/testsuite/ld-i386/mov3.d
index 17da244ba1c..4ce5cd8f53d 100644
--- a/ld/testsuite/ld-i386/mov3.d
+++ b/ld/testsuite/ld-i386/mov3.d
@@ -1,4 +1,4 @@
-#as: --32
+#as: --32 -mrelax-relocations=yes
#ld: -melf_i386
#objdump: -dw
diff --git a/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
index 53ccd5a4064..ae75487f421 100644
--- a/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
+++ b/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
@@ -1,4 +1,4 @@
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64
#objdump: -dw
#target: x86_64-*-*
diff --git a/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
index 53ccd5a4064..ae75487f421 100644
--- a/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
+++ b/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
@@ -1,4 +1,4 @@
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64
#objdump: -dw
#target: x86_64-*-*
diff --git a/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d
index 18021e7a025..2ce53a9efa6 100644
--- a/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d
+++ b/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d
@@ -1,5 +1,5 @@
#source: ifunc-5-local-x86-64.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -r -melf_x86_64
#readelf: -r --wide
#target: x86_64-*-*
diff --git a/ld/testsuite/ld-x86-64/call1a.d b/ld/testsuite/ld-x86-64/call1a.d
index 2a63b1c73ec..2b131ee28db 100644
--- a/ld/testsuite/ld-x86-64/call1a.d
+++ b/ld/testsuite/ld-x86-64/call1a.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1b.d b/ld/testsuite/ld-x86-64/call1b.d
index e782fa27262..e2fef071f19 100644
--- a/ld/testsuite/ld-x86-64/call1b.d
+++ b/ld/testsuite/ld-x86-64/call1b.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=prefix-addr
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1c.d b/ld/testsuite/ld-x86-64/call1c.d
index d058fc75a11..7fe8056e49d 100644
--- a/ld/testsuite/ld-x86-64/call1c.d
+++ b/ld/testsuite/ld-x86-64/call1c.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=prefix-nop
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1d.d b/ld/testsuite/ld-x86-64/call1d.d
index 8871cc6f334..c93756b2b3d 100644
--- a/ld/testsuite/ld-x86-64/call1d.d
+++ b/ld/testsuite/ld-x86-64/call1d.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=suffix-nop
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1e.d b/ld/testsuite/ld-x86-64/call1e.d
index 7127f1a326e..c7c467c3b27 100644
--- a/ld/testsuite/ld-x86-64/call1e.d
+++ b/ld/testsuite/ld-x86-64/call1e.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=prefix-0x67
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1f.d b/ld/testsuite/ld-x86-64/call1f.d
index 587bade37bc..d0c3f11eeed 100644
--- a/ld/testsuite/ld-x86-64/call1f.d
+++ b/ld/testsuite/ld-x86-64/call1f.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=prefix-0x90
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1g.d b/ld/testsuite/ld-x86-64/call1g.d
index 3bb512e4f7d..6a8d790d814 100644
--- a/ld/testsuite/ld-x86-64/call1g.d
+++ b/ld/testsuite/ld-x86-64/call1g.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=suffix-0x90
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1h.d b/ld/testsuite/ld-x86-64/call1h.d
index c7c8dde5473..f8e1d07bba0 100644
--- a/ld/testsuite/ld-x86-64/call1h.d
+++ b/ld/testsuite/ld-x86-64/call1h.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -z call-nop=suffix-144
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/call1i.d b/ld/testsuite/ld-x86-64/call1i.d
index b3684adb672..d5a157b962e 100644
--- a/ld/testsuite/ld-x86-64/call1i.d
+++ b/ld/testsuite/ld-x86-64/call1i.d
@@ -1,5 +1,5 @@
#source: call1.s
-#as: --x32
+#as: --x32 -mrelax-relocations=yes
#ld: -melf32_x86_64 -z call-nop=suffix-0x90
#objdump: -dw
diff --git a/ld/testsuite/ld-x86-64/load1a.d b/ld/testsuite/ld-x86-64/load1a.d
index 5c9349ee4d2..0eb4880719f 100644
--- a/ld/testsuite/ld-x86-64/load1a.d
+++ b/ld/testsuite/ld-x86-64/load1a.d
@@ -1,5 +1,5 @@
#source: load1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64
#objdump: -dw --sym
#notarget: x86_64-*-nacl*
diff --git a/ld/testsuite/ld-x86-64/load1b.d b/ld/testsuite/ld-x86-64/load1b.d
index 70ef274679d..8827f389dfa 100644
--- a/ld/testsuite/ld-x86-64/load1b.d
+++ b/ld/testsuite/ld-x86-64/load1b.d
@@ -1,5 +1,5 @@
#source: load1.s
-#as: --x32
+#as: --x32 -mrelax-relocations=yes
#ld: -melf32_x86_64
#objdump: -dw --sym
#notarget: x86_64-*-nacl*
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 1db43303fae..55c5ae0b149 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -391,7 +391,7 @@ if { [isnative] && [which $CC] != 0 } {
[list \
"Build libplt-main1.a" \
"" \
- "-fPIC" \
+ "-fPIC -Wa,-mrelax-relocations=yes" \
{ plt-main1.c } \
{{readelf {-Wr} plt-main1.rd}} \
"libplt-main1.a" \
@@ -399,7 +399,7 @@ if { [isnative] && [which $CC] != 0 } {
[list \
"Build libplt-main2.a" \
"" \
- "-fPIC" \
+ "-fPIC -Wa,-mrelax-relocations=yes" \
{ plt-main2.c } \
{{readelf {-Wr} plt-main2.rd}} \
"libplt-main2.a" \
@@ -407,7 +407,7 @@ if { [isnative] && [which $CC] != 0 } {
[list \
"Build libplt-main3.a" \
"" \
- "-fPIC $PLT_CFLAGS" \
+ "-fPIC -Wa,-mrelax-relocations=yes $PLT_CFLAGS" \
{ plt-main3.c } \
{{readelf {-Wr} plt-main3.rd}} \
"libplt-main3.a" \
@@ -415,7 +415,7 @@ if { [isnative] && [which $CC] != 0 } {
[list \
"Build libplt-main4.a" \
"" \
- "-fPIC $PLT_CFLAGS" \
+ "-fPIC -Wa,-mrelax-relocations=yes $PLT_CFLAGS" \
{ plt-main4.c } \
{{readelf {-Wr} plt-main4.rd}} \
"libplt-main4.a" \
@@ -545,7 +545,7 @@ if { [isnative] && [which $CC] != 0 } {
[list \
"Build gotpcrel1" \
"tmpdir/gotpcrel1d.so" \
- "" \
+ "-Wa,-mrelax-relocations=yes" \
{ gotpcrel1a.S gotpcrel1b.c gotpcrel1c.c } \
{{objdump {-dw} gotpcrel1.dd}} \
"gotpcrel1" \