aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog15
-rw-r--r--bfd/elf32-i386.c79
-rw-r--r--bfd/elf64-x86-64.c178
-rw-r--r--ld/ChangeLog96
-rw-r--r--ld/testsuite/ld-i386/got1.dd4
-rw-r--r--ld/testsuite/ld-i386/i386.exp14
-rw-r--r--ld/testsuite/ld-i386/lea1c.d8
-rw-r--r--ld/testsuite/ld-i386/load1-nacl.d8
-rw-r--r--ld/testsuite/ld-i386/load1.d8
-rw-r--r--ld/testsuite/ld-i386/load4b.d2
-rw-r--r--ld/testsuite/ld-i386/load5b.d2
-rw-r--r--ld/testsuite/ld-i386/mov1b.d6
-rw-r--r--ld/testsuite/ld-i386/pr19609-1.s12
-rw-r--r--ld/testsuite/ld-i386/pr19609-1a.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1b.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1c.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1d.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1e.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1f.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1g.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1h.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-1i.d17
-rw-r--r--ld/testsuite/ld-i386/pr19609-2.s6
-rw-r--r--ld/testsuite/ld-i386/pr19609-2a.d12
-rw-r--r--ld/testsuite/ld-i386/pr19609-2b.d12
-rw-r--r--ld/testsuite/ld-i386/pr19609-2c.d12
-rw-r--r--ld/testsuite/ld-i386/undefweak.s10
-rw-r--r--ld/testsuite/ld-i386/undefweaka.d9
-rw-r--r--ld/testsuite/ld-i386/undefweakb.d11
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-21-i386.d8
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-21-x86-64.d8
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-22-i386.d8
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-22-x86-64.d8
-rw-r--r--ld/testsuite/ld-x86-64/gotpcrel1.dd2
-rw-r--r--ld/testsuite/ld-x86-64/lea1.s6
-rw-r--r--ld/testsuite/ld-x86-64/lea1a.d7
-rw-r--r--ld/testsuite/ld-x86-64/lea1b.d7
-rw-r--r--ld/testsuite/ld-x86-64/lea1c.d13
-rw-r--r--ld/testsuite/ld-x86-64/lea1d.d7
-rw-r--r--ld/testsuite/ld-x86-64/lea1e.d7
-rw-r--r--ld/testsuite/ld-x86-64/lea1f.d13
-rw-r--r--ld/testsuite/ld-x86-64/mov1b.d8
-rw-r--r--ld/testsuite/ld-x86-64/mov1d.d8
-rw-r--r--ld/testsuite/ld-x86-64/pr13082-3b.d5
-rw-r--r--ld/testsuite/ld-x86-64/pr13082-3c.d9
-rw-r--r--ld/testsuite/ld-x86-64/pr13082-3d.d10
-rw-r--r--ld/testsuite/ld-x86-64/pr13082-4b.d5
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1.s20
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1a.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1b.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1c.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1d.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1e.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1f.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1g.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1h.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1i.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1j.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1k.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1l.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-1m.d23
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-2.s9
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-2a.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-2b.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-2c.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-2d.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-3.s10
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-3a.d14
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-3b.d14
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-4.s10
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-4a.d5
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-4b.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-4c.d5
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-4d.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-4e.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-5.s6
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-5a.d12
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-5b.d12
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-5c.d12
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-5d.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-5e.d12
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-6.s6
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-6a.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-6b.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-6c.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-6d.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-7.s7
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-7a.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-7b.d13
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-7c.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr19609-7d.d13
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp39
92 files changed, 1320 insertions, 122 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a2e5f1e..0b52c17 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,20 @@
2016-02-26 H.J. Lu <hongjiu.lu@intel.com>
+ PR ld/19609
+ * elf32-i386.c (elf_i386_convert_load): Convert to R_386_32 for
+ load with locally bound symbols if PIC is false or there is no
+ base register. Optimize branch to 0 if PIC is false.
+ (elf_i386_relocate_section): Don't generate dynamic relocations
+ against undefined weak symbols if PIC is false.
+ * elf64-x86-64.c (elf_x86_64_convert_load): Disable optimization
+ if we can't estimate relocation overflow with --no-relax.
+ Convert to R_X86_64_32S/R_X86_64_32 for load with locally bound
+ symbols if PIC is false. Optimize branch to 0 if PIC is false.
+ (elf_x86_64_relocate_section): Don't generate dynamic relocations
+ against undefined weak symbols if PIC is false.
+
+2016-02-26 H.J. Lu <hongjiu.lu@intel.com>
+
PR ld/19645
* bfd.c (bfd): Change flags to 20 bits.
(BFD_CONVERT_ELF_COMMON): New.
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 2ae5e44..ab3945d 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -2863,6 +2863,7 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
struct elf_i386_link_hash_table *htab;
bfd_boolean changed_contents;
bfd_boolean changed_relocs;
+ bfd_boolean is_pic;
bfd_signed_vma *local_got_refcounts;
/* Don't even try to convert non-ELF outputs. */
@@ -2889,6 +2890,8 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
changed_relocs = FALSE;
local_got_refcounts = elf_local_got_refcounts (abfd);
+ is_pic = bfd_link_pic (link_info);
+
/* Get the section contents. */
if (elf_section_data (sec)->this_hdr.contents != NULL)
contents = elf_section_data (sec)->this_hdr.contents;
@@ -2913,6 +2916,7 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
unsigned int addend;
unsigned int nop;
bfd_vma nop_offset;
+ bfd_boolean to_reloc_32;
if (r_type != R_386_GOT32 && r_type != R_386_GOT32X)
continue;
@@ -2929,9 +2933,7 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
modrm = bfd_get_8 (abfd, contents + roff - 1);
baseless = (modrm & 0xc7) == 0x5;
- if (r_type == R_386_GOT32X
- && baseless
- && bfd_link_pic (link_info))
+ if (r_type == R_386_GOT32X && baseless && is_pic)
{
/* For PIC, disallow R_386_GOT32X without a base register
since we don't know what the GOT base is. Allow
@@ -2960,7 +2962,7 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
opcode = bfd_get_8 (abfd, contents + roff - 2);
- /* It is OK to convert mov to lea. */
+ /* Convert mov to lea since it has been done for a while. */
if (opcode != 0x8b)
{
/* Only convert R_386_GOT32X relocation for call, jmp or
@@ -2968,14 +2970,12 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
instructions. */
if (r_type != R_386_GOT32X)
continue;
-
- /* It is OK to convert indirect branch to direct branch. It
- is OK to convert adc, add, and, cmp, or, sbb, sub, test,
- xor only when PIC is false. */
- if (opcode != 0xff && bfd_link_pic (link_info))
- continue;
}
+ /* Convert to R_386_32 if PIC is false or there is no base
+ register. */
+ to_reloc_32 = !is_pic || baseless;
+
/* Try to convert R_386_GOT32 and R_386_GOT32X. Get the symbol
referred to by the reloc. */
if (r_symndx < symtab_hdr->sh_info)
@@ -3010,6 +3010,27 @@ elf_i386_convert_load (bfd *abfd, asection *sec,
if (h->type == STT_GNU_IFUNC)
continue;
+ /* Undefined weak symbol is only bound locally in executable
+ and its reference is resolved as 0. */
+ if (UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
+ elf_i386_hash_entry (h)))
+ {
+ if (opcode == 0xff)
+ {
+ /* No direct branch to 0 for PIC. */
+ if (is_pic)
+ continue;
+ else
+ goto convert_branch;
+ }
+ else
+ {
+ /* We can convert load of address 0 to R_386_32. */
+ to_reloc_32 = TRUE;
+ goto convert_load;
+ }
+ }
+
if (opcode == 0xff)
{
/* We have "call/jmp *foo@GOT[(%reg)]". */
@@ -3087,27 +3108,29 @@ convert_branch:
convert_load:
if (opcode == 0x8b)
{
- /* Convert "mov foo@GOT(%reg1), %reg2" to
- "lea foo@GOTOFF(%reg1), %reg2". */
- if (r_type == R_386_GOT32X
- && (baseless || !bfd_link_pic (link_info)))
+ if (to_reloc_32)
{
+ /* Convert "mov foo@GOT[(%reg1)], %reg2" to
+ "mov $foo, %reg2" with R_386_32. */
r_type = R_386_32;
- /* For R_386_32, convert
- "lea foo@GOTOFF(%reg1), %reg2" to
- "lea foo@GOT, %reg2". */
- if (!baseless)
- {
- modrm = 0x5 | (modrm & 0x38);
- bfd_put_8 (abfd, modrm, contents + roff - 1);
- }
+ modrm = 0xc0 | (modrm & 0x38) >> 3;
+ bfd_put_8 (abfd, modrm, contents + roff - 1);
+ opcode = 0xc7;
}
else
- r_type = R_386_GOTOFF;
- opcode = 0x8d;
+ {
+ /* Convert "mov foo@GOT(%reg1), %reg2" to
+ "lea foo@GOTOFF(%reg1), %reg2". */
+ r_type = R_386_GOTOFF;
+ opcode = 0x8d;
+ }
}
else
{
+ /* Only R_386_32 is supported. */
+ if (!to_reloc_32)
+ continue;
+
if (opcode == 0x85)
{
/* Convert "test %reg1, foo@GOT(%reg2)" to
@@ -4369,10 +4392,10 @@ r_386_got32:
|| eh->func_pointer_refcount > 0
|| (h->root.type == bfd_link_hash_undefweak
&& !resolved_to_zero))
- && ((h->def_dynamic
- && !h->def_regular)
- || h->root.type == bfd_link_hash_undefweak
- || h->root.type == bfd_link_hash_undefined)))
+ && ((h->def_dynamic && !h->def_regular)
+ /* Undefined weak symbol is bound locally when
+ PIC is false. */
+ || h->root.type == bfd_link_hash_undefweak)))
{
Elf_Internal_Rela outrel;
bfd_boolean skip, relocate;
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 6ca3b2e..c696850 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3070,6 +3070,8 @@ elf_x86_64_convert_load (bfd *abfd, asection *sec,
bfd_boolean changed_relocs;
bfd_signed_vma *local_got_refcounts;
bfd_vma maxpagesize;
+ bfd_boolean is_pic;
+ bfd_boolean require_reloc_pc32;
/* Don't even try to convert non-ELF outputs. */
if (!is_elf_hash_table (link_info->hash))
@@ -3105,6 +3107,13 @@ elf_x86_64_convert_load (bfd *abfd, asection *sec,
goto error_return;
}
+ is_pic = bfd_link_pic (link_info);
+
+ /* TRUE if we can convert only to R_X86_64_PC32. Enable it for
+ --no-relax. */
+ require_reloc_pc32
+ = link_info->disable_target_specific_optimizations > 1;
+
irelend = internal_relocs + sec->reloc_count;
for (irel = internal_relocs; irel < irelend; irel++)
{
@@ -3118,10 +3127,12 @@ elf_x86_64_convert_load (bfd *abfd, asection *sec,
bfd_signed_vma raddend;
unsigned int opcode;
unsigned int modrm;
+ bfd_boolean relocx;
+ bfd_boolean to_reloc_pc32;
- if (r_type != R_X86_64_GOTPCREL
- && r_type != R_X86_64_GOTPCRELX
- && r_type != R_X86_64_REX_GOTPCRELX)
+ relocx = (r_type == R_X86_64_GOTPCRELX
+ || r_type == R_X86_64_REX_GOTPCRELX);
+ if (!relocx && r_type != R_X86_64_GOTPCREL)
continue;
roff = irel->r_offset;
@@ -3135,26 +3146,27 @@ elf_x86_64_convert_load (bfd *abfd, asection *sec,
opcode = bfd_get_8 (abfd, contents + roff - 2);
- /* It is OK to convert mov to lea. */
+ /* Convert mov to lea since it has been done for a while. */
if (opcode != 0x8b)
{
/* Only convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX
- for mov call, jmp or one of adc, add, and, cmp, or, sbb,
- sub, test, xor instructions. */
- if (r_type != R_X86_64_GOTPCRELX
- && r_type != R_X86_64_REX_GOTPCRELX)
+ for call, jmp or one of adc, add, and, cmp, or, sbb, sub,
+ test, xor instructions. */
+ if (!relocx)
continue;
-
- /* It is OK to convert indirect branch to direct branch. */
- if (opcode != 0xff)
- {
- /* It is OK to convert adc, add, and, cmp, or, sbb, sub,
- test, xor only when PIC is false. */
- if (bfd_link_pic (link_info))
- continue;
- }
}
+ /* We convert only to R_X86_64_PC32:
+ 1. Branch.
+ 2. R_X86_64_GOTPCREL since we can't modify REX byte.
+ 3. require_reloc_pc32 is true.
+ 4. PIC.
+ */
+ to_reloc_pc32 = (opcode == 0xff
+ || !relocx
+ || require_reloc_pc32
+ || is_pic);
+
/* Get the symbol referred to by the reloc. */
if (r_symndx < symtab_hdr->sh_info)
{
@@ -3195,22 +3207,59 @@ elf_x86_64_convert_load (bfd *abfd, asection *sec,
/* STT_GNU_IFUNC must keep GOTPCREL relocations. We also
avoid optimizing GOTPCREL relocations againt _DYNAMIC
since ld.so may use its link-time address. */
- if ((h->def_regular
- || h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- && h->type != STT_GNU_IFUNC
- && h != htab->elf.hdynamic
- && SYMBOL_REFERENCES_LOCAL (link_info, h))
+ if (h->type == STT_GNU_IFUNC)
+ continue;
+
+ /* Undefined weak symbol is only bound locally in executable
+ and its reference is resolved as 0 without relocation
+ overflow. We can only perform this optimization for
+ GOTPCRELX relocations since we need to modify REX byte.
+ It is OK convert mov with R_X86_64_GOTPCREL to
+ R_X86_64_PC32. */
+ if ((relocx || opcode == 0x8b)
+ && UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info,
+ elf_x86_64_hash_entry (h)))
+ {
+ if (opcode == 0xff)
+ {
+ /* Skip for branch instructions since R_X86_64_PC32
+ may overflow. */
+ if (require_reloc_pc32)
+ continue;
+ }
+ else if (relocx)
+ {
+ /* For non-branch instructions, we can convert to
+ R_X86_64_32/R_X86_64_32S since we know if there
+ is a REX byte. */
+ to_reloc_pc32 = FALSE;
+ }
+
+ /* Since we don't know the current PC when PIC is true,
+ we can't convert to R_X86_64_PC32. */
+ if (to_reloc_pc32 && is_pic)
+ continue;
+
+ goto convert;
+ }
+ else if ((h->def_regular
+ || h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && h != htab->elf.hdynamic
+ && SYMBOL_REFERENCES_LOCAL (link_info, h))
{
/* bfd_link_hash_new or bfd_link_hash_undefined is
- set by an assignment in a linker script in
- bfd_elf_record_link_assignment. FIXME: If we
- ever get a linker error due relocation overflow,
- we will skip this optimization. */
+ set by an assignment in a linker script in
+ bfd_elf_record_link_assignment. */
if (h->def_regular
&& (h->root.type == bfd_link_hash_new
|| h->root.type == bfd_link_hash_undefined))
- goto convert;
+ {
+ /* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
+ if (require_reloc_pc32)
+ continue;
+ goto convert;
+ }
tsec = h->root.u.def.section;
toff = h->root.u.def.value;
symtype = h->type;
@@ -3219,6 +3268,10 @@ elf_x86_64_convert_load (bfd *abfd, asection *sec,
continue;
}
+ /* We can only estimate relocation overflow for R_X86_64_PC32. */
+ if (!to_reloc_pc32)
+ goto convert;
+
if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
{
/* At this stage in linking, no SEC_MERGE symbol has been
@@ -3342,15 +3395,55 @@ convert:
}
else
{
+ unsigned int rex;
+ unsigned int rex_mask = REX_R;
+
+ if (r_type == R_X86_64_REX_GOTPCRELX)
+ rex = bfd_get_8 (abfd, contents + roff - 3);
+ else
+ rex = 0;
+
if (opcode == 0x8b)
{
- /* Convert "mov foo@GOTPCREL(%rip), %reg" to
- "lea foo(%rip), %reg". */
- opcode = 0x8d;
- r_type = R_X86_64_PC32;
+ if (to_reloc_pc32)
+ {
+ /* Convert "mov foo@GOTPCREL(%rip), %reg" to
+ "lea foo(%rip), %reg". */
+ opcode = 0x8d;
+ r_type = R_X86_64_PC32;
+ }
+ else
+ {
+ /* Convert "mov foo@GOTPCREL(%rip), %reg" to
+ "mov $foo, %reg". */
+ opcode = 0xc7;
+ modrm = bfd_get_8 (abfd, contents + roff - 1);
+ modrm = 0xc0 | (modrm & 0x38) >> 3;
+ if ((rex & REX_W) != 0
+ && ABI_64_P (link_info->output_bfd))
+ {
+ /* Keep the REX_W bit in REX byte for LP64. */
+ r_type = R_X86_64_32S;
+ goto rewrite_modrm_rex;
+ }
+ else
+ {
+ /* If the REX_W bit in REX byte isn't needed,
+ use R_X86_64_32 and clear the W bit to avoid
+ sign-extend imm32 to imm64. */
+ r_type = R_X86_64_32;
+ /* Clear the W bit in REX byte. */
+ rex_mask |= REX_W;
+ goto rewrite_modrm_rex;
+ }
+ }
}
else
{
+ /* R_X86_64_PC32 isn't supported. */
+ if (to_reloc_pc32)
+ continue;
+
modrm = bfd_get_8 (abfd, contents + roff - 1);
if (opcode == 0x85)
{
@@ -3366,18 +3459,23 @@ convert:
modrm = 0xc0 | (modrm & 0x38) >> 3 | (opcode & 0x3c);
opcode = 0x81;
}
+
+ /* Use R_X86_64_32 with 32-bit operand to avoid relocation
+ overflow when sign-extending imm32 to imm64. */
+ r_type = (rex & REX_W) != 0 ? R_X86_64_32S : R_X86_64_32;
+
+rewrite_modrm_rex:
bfd_put_8 (abfd, modrm, contents + roff - 1);
- if (r_type == R_X86_64_REX_GOTPCRELX)
+ if (rex)
{
/* Move the R bit to the B bit in REX byte. */
- unsigned int rex = bfd_get_8 (abfd, contents + roff - 3);
- rex = (rex & ~REX_R) | (rex & REX_R) >> 2;
+ rex = (rex & ~rex_mask) | (rex & REX_R) >> 2;
bfd_put_8 (abfd, rex, contents + roff - 3);
}
- /* No addend for R_X86_64_32S relocation. */
+
+ /* No addend for R_X86_64_32/R_X86_64_32S relocations. */
irel->r_addend = 0;
- r_type = R_X86_64_32S;
}
bfd_put_8 (abfd, opcode, contents + roff - 2);
@@ -4688,9 +4786,9 @@ direct:
|| eh->func_pointer_refcount > 0
|| (h->root.type == bfd_link_hash_undefweak
&& !resolved_to_zero))
- && ((h->def_dynamic
- && !h->def_regular)
- || h->root.type == bfd_link_hash_undefweak
+ && ((h->def_dynamic && !h->def_regular)
+ /* Undefined weak symbol is bound locally when
+ PIC is false. */
|| h->root.type == bfd_link_hash_undefined)))
{
Elf_Internal_Rela outrel;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 2c02012..ef2e60f 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,101 @@
2016-02-26 H.J. Lu <hongjiu.lu@intel.com>
+ PR ld/19609
+ * testsuite/ld-i386/got1.dd: Updated.
+ * testsuite/ld-i386/lea1c.d: Likewise.
+ * testsuite/ld-i386/load1-nacl.d: Likewise.
+ * testsuite/ld-i386/load1.d: Likewise.
+ * testsuite/ld-i386/load4b.d: Likewise.
+ * testsuite/ld-i386/load5b.d: Likewise.
+ * testsuite/ld-i386/mov1b.d: Likewise.
+ * testsuite/ld-x86-64/mov1b.d: Likewise.
+ * testsuite/ld-x86-64/mov1d.d: Likewise.
+ * testsuite/ld-ifunc/ifunc-21-i386.d: Likewise.
+ * testsuite/ld-ifunc/ifunc-21-x86-64.d: Likewise.
+ * testsuite/ld-ifunc/ifunc-22-i386.d: Likewise.
+ * testsuite/ld-ifunc/ifunc-22-x86-64.d: Likewise.
+ * testsuite/ld-x86-64/gotpcrel1.dd: Likewise.
+ * testsuite/ld-x86-64/lea1a.d: Likewise.
+ * testsuite/ld-x86-64/lea1b.d: Likewise.
+ * testsuite/ld-x86-64/lea1c.d: Likewise.
+ * testsuite/ld-x86-64/lea1d.d: Likewise.
+ * testsuite/ld-x86-64/lea1e.d: Likewise.
+ * testsuite/ld-x86-64/lea1f.d: Likewise.
+ * testsuite/ld-x86-64/mov1b.d: Likewise.
+ * testsuite/ld-x86-64/mov1d.d: Likewise.
+ * testsuite/ld-x86-64/pr13082-3b.d: Likewise.
+ * testsuite/ld-x86-64/pr13082-4b.d: Likewise.
+ * testsuite/ld-x86-64/lea1.s: Add tests for 32-bit registers.
+ * testsuite/ld-i386/pr19609-1.s: New file.
+ * testsuite/ld-i386/pr19609-1a.d: Likewise.
+ * testsuite/ld-i386/pr19609-1b.d: Likewise.
+ * testsuite/ld-i386/pr19609-1c.d: Likewise.
+ * testsuite/ld-i386/pr19609-1d.d: Likewise.
+ * testsuite/ld-i386/pr19609-1e.d: Likewise.
+ * testsuite/ld-i386/pr19609-1f.d: Likewise.
+ * testsuite/ld-i386/pr19609-1g.d: Likewise.
+ * testsuite/ld-i386/pr19609-1h.d: Likewise.
+ * testsuite/ld-i386/pr19609-1i.d: Likewise.
+ * testsuite/ld-i386/pr19609-2.s: Likewise.
+ * testsuite/ld-i386/pr19609-2a.d: Likewise.
+ * testsuite/ld-i386/pr19609-2b.d: Likewise.
+ * testsuite/ld-i386/pr19609-2c.d: Likewise.
+ * testsuite/ld-i386/undefweak.s: Likewise.
+ * testsuite/ld-i386/undefweaka.d: Likewise.
+ * testsuite/ld-i386/undefweakb.d: Likewise.
+ * testsuite/ld-x86-64/pr13082-3c.d: Likewise.
+ * testsuite/ld-x86-64/pr13082-3d.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-1a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1c.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1d.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1e.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1f.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1g.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1h.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1i.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1j.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1k.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1l.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-1m.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-2.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-2a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-2b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-2c.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-2d.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-3.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-3a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-3b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-4.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-4a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-4b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-4c.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-4d.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-4e.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-5.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-5a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-5b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-5c.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-5d.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-5e.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-6.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-6a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-6b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-6c.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-6d.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-7.s: Likewise.
+ * testsuite/ld-x86-64/pr19609-7a.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-7b.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-7c.d: Likewise.
+ * testsuite/ld-x86-64/pr19609-7d.d: Likewise.
+ * testsuite/ld-i386/i386.exp: Run undefweak tests and tests for
+ PR ld/19609.
+ * testsuite/ld-x86-64/x86-64.exp: Run pr13082-3c, pr13082-3d
+ and tests for PR ld/19609.
+
+2016-02-26 H.J. Lu <hongjiu.lu@intel.com>
+
PR ld/19645
* NEWS: Mention -z common/-z nocommon for ELF targets.
* emultempl/elf32.em (gld${EMULATION_NAME}_handle_option): Handle
diff --git a/ld/testsuite/ld-i386/got1.dd b/ld/testsuite/ld-i386/got1.dd
index e6e82de..cfea36b 100644
--- a/ld/testsuite/ld-i386/got1.dd
+++ b/ld/testsuite/ld-i386/got1.dd
@@ -4,7 +4,7 @@
[ ]*[a-f0-9]+: [ a-f0-9]+ addr16 call [a-f0-9]+ <foo>
[ ]*[a-f0-9]+: [ a-f0-9]+ call \*0x[a-f0-9]+
[ ]*[a-f0-9]+: [ a-f0-9]+ call \*0x[a-f0-9]+
-[ ]*[a-f0-9]+: [ a-f0-9]+ lea *0x[a-f0-9]+,%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]+ mov *0x[a-f0-9]+,%eax
[ ]*[a-f0-9]+: ff d0 call \*%eax
@@ -12,7 +12,7 @@
[ ]*[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]+: [ a-f0-9]+ mov *\$0x[a-f0-9]+,%ecx
[ ]*[a-f0-9]+: ff d1 call \*%ecx
[ ]*[a-f0-9]+: 83 ec 0c sub \$0xc,%esp
[ ]*[a-f0-9]+: 6a 00 push \$0x0
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 5ddf045..e5f4aaa 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -350,6 +350,20 @@ run_dump_test "pr19636-4b"
run_dump_test "pr19636-4c"
run_dump_test "pr19636-4d"
run_dump_test "pr19645"
+run_dump_test "pr19609-1a"
+run_dump_test "pr19609-1b"
+run_dump_test "pr19609-1c"
+run_dump_test "pr19609-1d"
+run_dump_test "pr19609-1e"
+run_dump_test "pr19609-1f"
+run_dump_test "pr19609-1g"
+run_dump_test "pr19609-1h"
+run_dump_test "pr19609-1i"
+run_dump_test "pr19609-2a"
+run_dump_test "pr19609-2b"
+run_dump_test "pr19609-2c"
+run_dump_test "undefweaka"
+run_dump_test "undefweakb"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/lea1c.d b/ld/testsuite/ld-i386/lea1c.d
index 0c3580d..b461089 100644
--- a/ld/testsuite/ld-i386/lea1c.d
+++ b/ld/testsuite/ld-i386/lea1c.d
@@ -9,8 +9,8 @@
Disassembly of section .text:
#...
-[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+,%eax
-[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+,%eax
-[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+,%eax
-[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
#pass
diff --git a/ld/testsuite/ld-i386/load1-nacl.d b/ld/testsuite/ld-i386/load1-nacl.d
index 1245639..1dbba11 100644
--- a/ld/testsuite/ld-i386/load1-nacl.d
+++ b/ld/testsuite/ld-i386/load1-nacl.d
@@ -16,7 +16,7 @@ SYMBOL TABLE:
Disassembly of section .text:
0+20000 <_start>:
-[ ]*[a-f0-9]+: 8d 05 80 00 03 10 lea 0x10030080,%eax
+[ ]*[a-f0-9]+: c7 c0 80 00 03 10 mov \$0x10030080,%eax
[ ]*[a-f0-9]+: 81 d0 80 00 03 10 adc \$0x10030080,%eax
[ ]*[a-f0-9]+: 81 c3 80 00 03 10 add \$0x10030080,%ebx
[ ]*[a-f0-9]+: 81 e1 80 00 03 10 and \$0x10030080,%ecx
@@ -26,7 +26,7 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 81 ed 80 00 03 10 sub \$0x10030080,%ebp
[ ]*[a-f0-9]+: 81 f4 80 00 03 10 xor \$0x10030080,%esp
[ ]*[a-f0-9]+: f7 c1 80 00 03 10 test \$0x10030080,%ecx
-[ ]*[a-f0-9]+: 8d 05 80 00 03 10 lea 0x10030080,%eax
+[ ]*[a-f0-9]+: c7 c0 80 00 03 10 mov \$0x10030080,%eax
[ ]*[a-f0-9]+: 81 d0 80 00 03 10 adc \$0x10030080,%eax
[ ]*[a-f0-9]+: 81 c3 80 00 03 10 add \$0x10030080,%ebx
[ ]*[a-f0-9]+: 81 e1 80 00 03 10 and \$0x10030080,%ecx
@@ -36,7 +36,7 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 81 ed 80 00 03 10 sub \$0x10030080,%ebp
[ ]*[a-f0-9]+: 81 f4 80 00 03 10 xor \$0x10030080,%esp
[ ]*[a-f0-9]+: f7 c1 80 00 03 10 test \$0x10030080,%ecx
-[ ]*[a-f0-9]+: 8d 05 81 00 03 10 lea 0x10030081,%eax
+[ ]*[a-f0-9]+: c7 c0 81 00 03 10 mov \$0x10030081,%eax
[ ]*[a-f0-9]+: 81 d0 81 00 03 10 adc \$0x10030081,%eax
[ ]*[a-f0-9]+: 81 c3 81 00 03 10 add \$0x10030081,%ebx
[ ]*[a-f0-9]+: 81 e1 81 00 03 10 and \$0x10030081,%ecx
@@ -46,7 +46,7 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 81 ed 81 00 03 10 sub \$0x10030081,%ebp
[ ]*[a-f0-9]+: 81 f4 81 00 03 10 xor \$0x10030081,%esp
[ ]*[a-f0-9]+: f7 c1 81 00 03 10 test \$0x10030081,%ecx
-[ ]*[a-f0-9]+: 8d 05 81 00 03 10 lea 0x10030081,%eax
+[ ]*[a-f0-9]+: c7 c0 81 00 03 10 mov \$0x10030081,%eax
[ ]*[a-f0-9]+: 81 d0 81 00 03 10 adc \$0x10030081,%eax
[ ]*[a-f0-9]+: 81 c3 81 00 03 10 add \$0x10030081,%ebx
[ ]*[a-f0-9]+: 81 e1 81 00 03 10 and \$0x10030081,%ecx
diff --git a/ld/testsuite/ld-i386/load1.d b/ld/testsuite/ld-i386/load1.d
index a252a15..9c4aa8e 100644
--- a/ld/testsuite/ld-i386/load1.d
+++ b/ld/testsuite/ld-i386/load1.d
@@ -15,7 +15,7 @@ SYMBOL TABLE:
Disassembly of section .text:
0+8048074 <_start>:
-[ ]*[a-f0-9]+: 8d 05 70 91 04 08 lea 0x8049170,%eax
+[ ]*[a-f0-9]+: c7 c0 70 91 04 08 mov \$0x8049170,%eax
[ ]*[a-f0-9]+: 81 d0 70 91 04 08 adc \$0x8049170,%eax
[ ]*[a-f0-9]+: 81 c3 70 91 04 08 add \$0x8049170,%ebx
[ ]*[a-f0-9]+: 81 e1 70 91 04 08 and \$0x8049170,%ecx
@@ -25,7 +25,7 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 81 ed 70 91 04 08 sub \$0x8049170,%ebp
[ ]*[a-f0-9]+: 81 f4 70 91 04 08 xor \$0x8049170,%esp
[ ]*[a-f0-9]+: f7 c1 70 91 04 08 test \$0x8049170,%ecx
-[ ]*[a-f0-9]+: 8d 05 70 91 04 08 lea 0x8049170,%eax
+[ ]*[a-f0-9]+: c7 c0 70 91 04 08 mov \$0x8049170,%eax
[ ]*[a-f0-9]+: 81 d0 70 91 04 08 adc \$0x8049170,%eax
[ ]*[a-f0-9]+: 81 c3 70 91 04 08 add \$0x8049170,%ebx
[ ]*[a-f0-9]+: 81 e1 70 91 04 08 and \$0x8049170,%ecx
@@ -35,7 +35,7 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 81 ed 70 91 04 08 sub \$0x8049170,%ebp
[ ]*[a-f0-9]+: 81 f4 70 91 04 08 xor \$0x8049170,%esp
[ ]*[a-f0-9]+: f7 c1 70 91 04 08 test \$0x8049170,%ecx
-[ ]*[a-f0-9]+: 8d 05 71 91 04 08 lea 0x8049171,%eax
+[ ]*[a-f0-9]+: c7 c0 71 91 04 08 mov \$0x8049171,%eax
[ ]*[a-f0-9]+: 81 d0 71 91 04 08 adc \$0x8049171,%eax
[ ]*[a-f0-9]+: 81 c3 71 91 04 08 add \$0x8049171,%ebx
[ ]*[a-f0-9]+: 81 e1 71 91 04 08 and \$0x8049171,%ecx
@@ -45,7 +45,7 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 81 ed 71 91 04 08 sub \$0x8049171,%ebp
[ ]*[a-f0-9]+: 81 f4 71 91 04 08 xor \$0x8049171,%esp
[ ]*[a-f0-9]+: f7 c1 71 91 04 08 test \$0x8049171,%ecx
-[ ]*[a-f0-9]+: 8d 05 71 91 04 08 lea 0x8049171,%eax
+[ ]*[a-f0-9]+: c7 c0 71 91 04 08 mov \$0x8049171,%eax
[ ]*[a-f0-9]+: 81 d0 71 91 04 08 adc \$0x8049171,%eax
[ ]*[a-f0-9]+: 81 c3 71 91 04 08 add \$0x8049171,%ebx
[ ]*[a-f0-9]+: 81 e1 71 91 04 08 and \$0x8049171,%ecx
diff --git a/ld/testsuite/ld-i386/load4b.d b/ld/testsuite/ld-i386/load4b.d
index 0f6f4e2..9d1732b 100644
--- a/ld/testsuite/ld-i386/load4b.d
+++ b/ld/testsuite/ld-i386/load4b.d
@@ -9,5 +9,5 @@
Disassembly of section .text:
#...
-[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
#pass
diff --git a/ld/testsuite/ld-i386/load5b.d b/ld/testsuite/ld-i386/load5b.d
index 6db0b28..96726a4 100644
--- a/ld/testsuite/ld-i386/load5b.d
+++ b/ld/testsuite/ld-i386/load5b.d
@@ -9,5 +9,5 @@
Disassembly of section .text:
#...
-[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
#pass
diff --git a/ld/testsuite/ld-i386/mov1b.d b/ld/testsuite/ld-i386/mov1b.d
index ae40862..1b7cc2f 100644
--- a/ld/testsuite/ld-i386/mov1b.d
+++ b/ld/testsuite/ld-i386/mov1b.d
@@ -1,6 +1,6 @@
#source: mov1.s
#as: --32
-#ld: -pie -melf_i386
+#ld: -pie -melf_i386 --no-dynamic-linker
#objdump: -dw
.*: +file format .*
@@ -10,6 +10,6 @@ Disassembly of section .text:
#...
[ ]*[a-f0-9]+: 8b 81 ([0-9a-f]{2} ){4} * mov -0x[a-f0-9]+\(%ecx\),%eax
-[ ]*[a-f0-9]+: 8b 81 ([0-9a-f]{2} ){4} * mov -0x[a-f0-9]+\(%ecx\),%eax
-[ ]*[a-f0-9]+: 8b 81 ([0-9a-f]{2} ){4} * mov -0x[a-f0-9]+\(%ecx\),%eax
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 * mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 * mov \$0x0,%eax
#pass
diff --git a/ld/testsuite/ld-i386/pr19609-1.s b/ld/testsuite/ld-i386/pr19609-1.s
new file mode 100644
index 0000000..f0b8eac
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1.s
@@ -0,0 +1,12 @@
+ .text
+ .weak bar
+ .globl _start
+ .type _start, @function
+_start:
+ cmp bar@GOT(%edx), %eax
+ cmp bar@GOT(%edx), %ecx
+ mov bar@GOT(%edx), %eax
+ mov bar@GOT(%edx), %ecx
+ test bar@GOT(%edx), %eax
+ test bar@GOT(%edx), %ecx
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-i386/pr19609-1a.d b/ld/testsuite/ld-i386/pr19609-1a.d
new file mode 100644
index 0000000..214adaf
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1a.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 00 cmp \$0x0,%eax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: f7 c0 00 00 00 00 test \$0x0,%eax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
diff --git a/ld/testsuite/ld-i386/pr19609-1b.d b/ld/testsuite/ld-i386/pr19609-1b.d
new file mode 100644
index 0000000..ebd6bc9
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1b.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -pie -melf_i386 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 00 cmp \$0x0,%eax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: f7 c0 00 00 00 00 test \$0x0,%eax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
diff --git a/ld/testsuite/ld-i386/pr19609-1c.d b/ld/testsuite/ld-i386/pr19609-1c.d
new file mode 100644
index 0000000..e7d1c13
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1c.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -shared -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 3b 82 fc ff ff ff cmp -0x4\(%edx\),%eax
+[ ]*[a-f0-9]+: 3b 8a fc ff ff ff cmp -0x4\(%edx\),%ecx
+[ ]*[a-f0-9]+: 8b 82 fc ff ff ff mov -0x4\(%edx\),%eax
+[ ]*[a-f0-9]+: 8b 8a fc ff ff ff mov -0x4\(%edx\),%ecx
+[ ]*[a-f0-9]+: 85 82 fc ff ff ff test %eax,-0x4\(%edx\)
+[ ]*[a-f0-9]+: 85 8a fc ff ff ff test %ecx,-0x4\(%edx\)
diff --git a/ld/testsuite/ld-i386/pr19609-1d.d b/ld/testsuite/ld-i386/pr19609-1d.d
new file mode 100644
index 0000000..4b50f8c
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1d.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -E -melf_i386 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 00 cmp \$0x0,%eax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: f7 c0 00 00 00 00 test \$0x0,%eax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
diff --git a/ld/testsuite/ld-i386/pr19609-1e.d b/ld/testsuite/ld-i386/pr19609-1e.d
new file mode 100644
index 0000000..a515ad6
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1e.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -shared -E -Bsymbolic -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 3b 82 fc ff ff ff cmp -0x4\(%edx\),%eax
+[ ]*[a-f0-9]+: 3b 8a fc ff ff ff cmp -0x4\(%edx\),%ecx
+[ ]*[a-f0-9]+: 8b 82 fc ff ff ff mov -0x4\(%edx\),%eax
+[ ]*[a-f0-9]+: 8b 8a fc ff ff ff mov -0x4\(%edx\),%ecx
+[ ]*[a-f0-9]+: 85 82 fc ff ff ff test %eax,-0x4\(%edx\)
+[ ]*[a-f0-9]+: 85 8a fc ff ff ff test %ecx,-0x4\(%edx\)
diff --git a/ld/testsuite/ld-i386/pr19609-1f.d b/ld/testsuite/ld-i386/pr19609-1f.d
new file mode 100644
index 0000000..99ed5bb
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1f.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -pie --dynamic-list-data -melf_i386 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 00 cmp \$0x0,%eax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: f7 c0 00 00 00 00 test \$0x0,%eax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
diff --git a/ld/testsuite/ld-i386/pr19609-1g.d b/ld/testsuite/ld-i386/pr19609-1g.d
new file mode 100644
index 0000000..2fc9731
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1g.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -pie -E -melf_i386 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 00 cmp \$0x0,%eax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: f7 c0 00 00 00 00 test \$0x0,%eax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
diff --git a/ld/testsuite/ld-i386/pr19609-1h.d b/ld/testsuite/ld-i386/pr19609-1h.d
new file mode 100644
index 0000000..79fe5d5
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1h.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=yes
+#ld: -pie -E -Bsymbolic-functions -melf_i386 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 00 cmp \$0x0,%eax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: f7 c0 00 00 00 00 test \$0x0,%eax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
diff --git a/ld/testsuite/ld-i386/pr19609-1i.d b/ld/testsuite/ld-i386/pr19609-1i.d
new file mode 100644
index 0000000..ce15bc9
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-1i.d
@@ -0,0 +1,17 @@
+#source: pr19609-1.s
+#as: --32 -mrelax-relocations=no
+#ld: -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 3b 82 fc ff ff ff cmp -0x4\(%edx\),%eax
+[ ]*[a-f0-9]+: 3b 8a fc ff ff ff cmp -0x4\(%edx\),%ecx
+[ ]*[a-f0-9]+: c7 c0 00 00 00 00 mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 85 82 fc ff ff ff test %eax,-0x4\(%edx\)
+[ ]*[a-f0-9]+: 85 8a fc ff ff ff test %ecx,-0x4\(%edx\)
diff --git a/ld/testsuite/ld-i386/pr19609-2.s b/ld/testsuite/ld-i386/pr19609-2.s
new file mode 100644
index 0000000..622dbd4
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-2.s
@@ -0,0 +1,6 @@
+ .text
+ .weak bar
+ .globl _start
+ .type _start, @function
+_start:
+ call *bar@GOT(%edx)
diff --git a/ld/testsuite/ld-i386/pr19609-2a.d b/ld/testsuite/ld-i386/pr19609-2a.d
new file mode 100644
index 0000000..ea1e461
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-2a.d
@@ -0,0 +1,12 @@
+#source: pr19609-2.s
+#as: --32 -mrelax-relocations=yes
+#ld: -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]+[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr16 call 0 <_start-0x[0-9a-f]+>
diff --git a/ld/testsuite/ld-i386/pr19609-2b.d b/ld/testsuite/ld-i386/pr19609-2b.d
new file mode 100644
index 0000000..a4bf598
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-2b.d
@@ -0,0 +1,12 @@
+#source: pr19609-2.s
+#as: --32 -mrelax-relocations=yes
+#ld: -pie -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: ff 92 fc ff ff ff call \*-0x4\(%edx\)
diff --git a/ld/testsuite/ld-i386/pr19609-2c.d b/ld/testsuite/ld-i386/pr19609-2c.d
new file mode 100644
index 0000000..2553f8a
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr19609-2c.d
@@ -0,0 +1,12 @@
+#source: pr19609-2.s
+#as: --32 -mrelax-relocations=yes
+#ld: -shared -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: ff 92 fc ff ff ff call \*-0x4\(%edx\)
diff --git a/ld/testsuite/ld-i386/undefweak.s b/ld/testsuite/ld-i386/undefweak.s
new file mode 100644
index 0000000..f34c917
--- /dev/null
+++ b/ld/testsuite/ld-i386/undefweak.s
@@ -0,0 +1,10 @@
+ .text
+ .globl _start
+_start:
+ mov .Ljmp(%eax), %eax
+ jmp *(%eax)
+ .section .data.rel.ro.local,"aw",@progbits
+ .weak func
+ .align 8
+.Ljmp:
+ .long func
diff --git a/ld/testsuite/ld-i386/undefweaka.d b/ld/testsuite/ld-i386/undefweaka.d
new file mode 100644
index 0000000..c106ebf
--- /dev/null
+++ b/ld/testsuite/ld-i386/undefweaka.d
@@ -0,0 +1,9 @@
+#source: undefweak.s
+#as: --32
+#ld: -shared -melf_i386
+#readelf: -r --wide
+
+Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
+ Offset Info Type Sym. Value Symbol's Name
+[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE +
+[0-9a-f]+ +[0-9a-f]+ +R_386_32 +[0-9a-f]+ +func
diff --git a/ld/testsuite/ld-i386/undefweakb.d b/ld/testsuite/ld-i386/undefweakb.d
new file mode 100644
index 0000000..48ebad8
--- /dev/null
+++ b/ld/testsuite/ld-i386/undefweakb.d
@@ -0,0 +1,11 @@
+#source: undefweak.s
+#as: --32
+#ld: -pie -melf_i386
+#readelf: -r --wide -x .data.rel.ro
+
+Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name
+[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE +
+
+Hex dump of section '.data.rel.ro':
+ 0x[a-f0-9]+ 00000000 ....
diff --git a/ld/testsuite/ld-ifunc/ifunc-21-i386.d b/ld/testsuite/ld-ifunc/ifunc-21-i386.d
index c7ca811..36fcfc0 100644
--- a/ld/testsuite/ld-ifunc/ifunc-21-i386.d
+++ b/ld/testsuite/ld-ifunc/ifunc-21-i386.d
@@ -12,5 +12,11 @@
[ ]*[a-f0-9]+: 03 83 0c 00 00 00 add 0xc\(%ebx\),%eax
[ ]*[a-f0-9]+: 8b 83 0c 00 00 00 mov 0xc\(%ebx\),%eax
[ ]*[a-f0-9]+: 85 83 0c 00 00 00 test %eax,0xc\(%ebx\)
-[ ]*[a-f0-9]+: 8d ([0-9a-f]{2} ){5}[ ]+lea[ ]+.*
+[ ]*[a-f0-9]+: c7 c0 b5 80 04 08 mov \$0x80480b5,%eax
+
+0+80480b4 <foo>:
+[ ]*[a-f0-9]+: c3 ret
+
+0+80480b5 <bar>:
+[ ]*[a-f0-9]+: c3 ret
#pass
diff --git a/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
index ae75487..e28734e 100644
--- a/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
+++ b/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d
@@ -12,5 +12,11 @@
[ ]*[a-f0-9]+: 48 03 05 35 00 20 00 add 0x200035\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18>
[ ]*[a-f0-9]+: 48 8b 05 2e 00 20 00 mov 0x20002e\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18>
[ ]*[a-f0-9]+: 48 85 05 27 00 20 00 test %rax,0x200027\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18>
-[ ]*[a-f0-9]+: 48 8d ([0-9a-f]{2} ){5}[ ]+lea[ ]+.*
+[ ]*[a-f0-9]+: 48 c7 c0 09 01 40 00 mov \$0x400109,%rax
+
+0+400108 <foo>:
+[ ]*[a-f0-9]+: c3 retq
+
+0+400109 <bar>:
+[ ]*[a-f0-9]+: c3 retq
#pass
diff --git a/ld/testsuite/ld-ifunc/ifunc-22-i386.d b/ld/testsuite/ld-ifunc/ifunc-22-i386.d
index c7ca811..36fcfc0 100644
--- a/ld/testsuite/ld-ifunc/ifunc-22-i386.d
+++ b/ld/testsuite/ld-ifunc/ifunc-22-i386.d
@@ -12,5 +12,11 @@
[ ]*[a-f0-9]+: 03 83 0c 00 00 00 add 0xc\(%ebx\),%eax
[ ]*[a-f0-9]+: 8b 83 0c 00 00 00 mov 0xc\(%ebx\),%eax
[ ]*[a-f0-9]+: 85 83 0c 00 00 00 test %eax,0xc\(%ebx\)
-[ ]*[a-f0-9]+: 8d ([0-9a-f]{2} ){5}[ ]+lea[ ]+.*
+[ ]*[a-f0-9]+: c7 c0 b5 80 04 08 mov \$0x80480b5,%eax
+
+0+80480b4 <foo>:
+[ ]*[a-f0-9]+: c3 ret
+
+0+80480b5 <bar>:
+[ ]*[a-f0-9]+: c3 ret
#pass
diff --git a/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
index ae75487..e28734e 100644
--- a/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
+++ b/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d
@@ -12,5 +12,11 @@
[ ]*[a-f0-9]+: 48 03 05 35 00 20 00 add 0x200035\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18>
[ ]*[a-f0-9]+: 48 8b 05 2e 00 20 00 mov 0x20002e\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18>
[ ]*[a-f0-9]+: 48 85 05 27 00 20 00 test %rax,0x200027\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18>
-[ ]*[a-f0-9]+: 48 8d ([0-9a-f]{2} ){5}[ ]+lea[ ]+.*
+[ ]*[a-f0-9]+: 48 c7 c0 09 01 40 00 mov \$0x400109,%rax
+
+0+400108 <foo>:
+[ ]*[a-f0-9]+: c3 retq
+
+0+400109 <bar>:
+[ ]*[a-f0-9]+: c3 retq
#pass
diff --git a/ld/testsuite/ld-x86-64/gotpcrel1.dd b/ld/testsuite/ld-x86-64/gotpcrel1.dd
index 187a1a5..46321db 100644
--- a/ld/testsuite/ld-x86-64/gotpcrel1.dd
+++ b/ld/testsuite/ld-x86-64/gotpcrel1.dd
@@ -4,7 +4,7 @@
[ ]*[a-f0-9]+: [ a-f0-9]+ addr32 callq [a-f0-9]+ <foo>
[ ]*[a-f0-9]+: [ a-f0-9]+ callq \*0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
[ ]*[a-f0-9]+: [ a-f0-9]+ callq \*0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
-[ ]*[a-f0-9]+: [ a-f0-9]+ lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
+[ ]*[a-f0-9]+: [ a-f0-9]+ (rex mov|mov ) \$0x[a-f0-9]+,%(r|e)ax
[ ]*[a-f0-9]+: ff d0 callq \*%rax
[ ]*[a-f0-9]+: [ a-f0-9]+ mov 0x[a-f0-9]+\(%rip\),%rcx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
[ ]*[a-f0-9]+: ff d1 callq \*%rcx
diff --git a/ld/testsuite/ld-x86-64/lea1.s b/ld/testsuite/ld-x86-64/lea1.s
index 07a2e35..2c9982e 100644
--- a/ld/testsuite/ld-x86-64/lea1.s
+++ b/ld/testsuite/ld-x86-64/lea1.s
@@ -9,10 +9,12 @@ foo:
.globl _start
.type _start, @function
_start:
+ movl foo@GOTPCREL(%rip), %eax
+ movl bar@GOTPCREL(%rip), %r11d
movq foo@GOTPCREL(%rip), %rax
- movq bar@GOTPCREL(%rip), %rax
+ movq bar@GOTPCREL(%rip), %r11
movq __start_my_section@GOTPCREL(%rip), %rax
- movq __stop_my_section@GOTPCREL(%rip), %rax
+ movq __stop_my_section@GOTPCREL(%rip), %r11
.size _start, .-_start
.comm pad,4,4
.comm bar,4,4
diff --git a/ld/testsuite/ld-x86-64/lea1a.d b/ld/testsuite/ld-x86-64/lea1a.d
index 36e9f54..9b662cb 100644
--- a/ld/testsuite/ld-x86-64/lea1a.d
+++ b/ld/testsuite/ld-x86-64/lea1a.d
@@ -9,8 +9,11 @@
Disassembly of section .text:
#...
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%eax # [a-f0-9]+ <foo>
+[ ]*[a-f0-9]+: 44 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11d # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <bar>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__start_my_section>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__stop_my_section>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <__stop_my_section>
#pass
diff --git a/ld/testsuite/ld-x86-64/lea1b.d b/ld/testsuite/ld-x86-64/lea1b.d
index a92acd7..9108149 100644
--- a/ld/testsuite/ld-x86-64/lea1b.d
+++ b/ld/testsuite/ld-x86-64/lea1b.d
@@ -9,8 +9,11 @@
Disassembly of section .text:
#...
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%eax # [a-f0-9]+ <foo>
+[ ]*[a-f0-9]+: 44 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11d # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <bar>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__start_my_section>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__stop_my_section>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <__stop_my_section>
#pass
diff --git a/ld/testsuite/ld-x86-64/lea1c.d b/ld/testsuite/ld-x86-64/lea1c.d
index 072b1ee..68fec03 100644
--- a/ld/testsuite/ld-x86-64/lea1c.d
+++ b/ld/testsuite/ld-x86-64/lea1c.d
@@ -1,5 +1,5 @@
#source: lea1.s
-#as: --64
+#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64
#objdump: -dw
@@ -9,8 +9,11 @@
Disassembly of section .text:
#...
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <bar>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__start_my_section>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__stop_my_section>
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: 41 c7 c3 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%r11d
+[ ]*[a-f0-9]+: 48 c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%rax
+[ ]*[a-f0-9]+: 49 c7 c3 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%r11
+[ ]*[a-f0-9]+: 48 c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%rax
+[ ]*[a-f0-9]+: 49 c7 c3 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%r11
#pass
diff --git a/ld/testsuite/ld-x86-64/lea1d.d b/ld/testsuite/ld-x86-64/lea1d.d
index 2613061..4d708d2 100644
--- a/ld/testsuite/ld-x86-64/lea1d.d
+++ b/ld/testsuite/ld-x86-64/lea1d.d
@@ -9,8 +9,11 @@
Disassembly of section .text:
#...
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%eax # [a-f0-9]+ <foo>
+[ ]*[a-f0-9]+: 44 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11d # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <bar>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__start_my_section>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__stop_my_section>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <__stop_my_section>
#pass
diff --git a/ld/testsuite/ld-x86-64/lea1e.d b/ld/testsuite/ld-x86-64/lea1e.d
index 109c1cd..da60137 100644
--- a/ld/testsuite/ld-x86-64/lea1e.d
+++ b/ld/testsuite/ld-x86-64/lea1e.d
@@ -9,8 +9,11 @@
Disassembly of section .text:
#...
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%eax # [a-f0-9]+ <foo>
+[ ]*[a-f0-9]+: 44 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11d # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <bar>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <bar>
[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__start_my_section>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__stop_my_section>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <__stop_my_section>
#pass
diff --git a/ld/testsuite/ld-x86-64/lea1f.d b/ld/testsuite/ld-x86-64/lea1f.d
index 8d6cd78..b7abeb3 100644
--- a/ld/testsuite/ld-x86-64/lea1f.d
+++ b/ld/testsuite/ld-x86-64/lea1f.d
@@ -1,5 +1,5 @@
#source: lea1.s
-#as: --x32
+#as: --x32 -mrelax-relocations=yes
#ld: -melf32_x86_64
#objdump: -dw
@@ -9,8 +9,11 @@
Disassembly of section .text:
#...
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <foo>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <bar>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__start_my_section>
-[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <__stop_my_section>
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: c7 c0 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: 41 c7 c3 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%r11d
+[ ]*[a-f0-9]+: 40 c7 c0 ([0-9a-f]{2} ){4} * rex mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: 41 c7 c3 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%r11d
+[ ]*[a-f0-9]+: 40 c7 c0 ([0-9a-f]{2} ){4} * rex mov \$0x[a-f0-9]+,%eax
+[ ]*[a-f0-9]+: 41 c7 c3 ([0-9a-f]{2} ){4} * mov \$0x[a-f0-9]+,%r11d
#pass
diff --git a/ld/testsuite/ld-x86-64/mov1b.d b/ld/testsuite/ld-x86-64/mov1b.d
index f112c1c..7421853 100644
--- a/ld/testsuite/ld-x86-64/mov1b.d
+++ b/ld/testsuite/ld-x86-64/mov1b.d
@@ -1,6 +1,6 @@
#source: mov1.s
-#as: --64
-#ld: -pie -melf_x86_64
+#as: --64 -mrelax-relocations=yes
+#ld: -pie -melf_x86_64 --no-dynamic-linker
#objdump: -dw
.*: +file format .*
@@ -10,6 +10,6 @@ Disassembly of section .text:
#...
[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
-[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
-[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 * mov \$0x0,%rax
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 * mov \$0x0,%rax
#pass
diff --git a/ld/testsuite/ld-x86-64/mov1d.d b/ld/testsuite/ld-x86-64/mov1d.d
index 794a546..7cdab0c 100644
--- a/ld/testsuite/ld-x86-64/mov1d.d
+++ b/ld/testsuite/ld-x86-64/mov1d.d
@@ -1,6 +1,6 @@
#source: mov1.s
-#as: --x32
-#ld: -pie -melf32_x86_64
+#as: --x32 -mrelax-relocations=yes
+#ld: -pie -melf32_x86_64 --no-dynamic-linker
#objdump: -dw
.*: +file format .*
@@ -10,6 +10,6 @@ Disassembly of section .text:
#...
[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
-[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
-[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 00 * rex mov \$0x0,%eax
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 00 * rex mov \$0x0,%eax
#pass
diff --git a/ld/testsuite/ld-x86-64/pr13082-3b.d b/ld/testsuite/ld-x86-64/pr13082-3b.d
index 766dd74..c3c3f86 100644
--- a/ld/testsuite/ld-x86-64/pr13082-3b.d
+++ b/ld/testsuite/ld-x86-64/pr13082-3b.d
@@ -2,6 +2,9 @@
#name: PR ld/13082-3 (b)
#as: --x32
#ld: -pie -melf32_x86_64
-#readelf: -r --wide
+#readelf: -r -x .data.rel.ro
There are no relocations in this file.
+
+Hex dump of section '.data.rel.ro':
+ 0x[a-f0-9]+ 00000000 00000000 ........
diff --git a/ld/testsuite/ld-x86-64/pr13082-3c.d b/ld/testsuite/ld-x86-64/pr13082-3c.d
new file mode 100644
index 0000000..9947425
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr13082-3c.d
@@ -0,0 +1,9 @@
+#source: pr13082-3.s
+#name: PR ld/13082-3 (c)
+#as: --64
+#ld: -shared -melf_x86_64
+#readelf: -r --wide
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Symbol's Value Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_64 +[0-9a-f]+ +func \+ 0
diff --git a/ld/testsuite/ld-x86-64/pr13082-3d.d b/ld/testsuite/ld-x86-64/pr13082-3d.d
new file mode 100644
index 0000000..8385d50
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr13082-3d.d
@@ -0,0 +1,10 @@
+#source: pr13082-3.s
+#name: PR ld/13082-3 (d)
+#as: --64
+#ld: -pie -melf_x86_64
+#readelf: -r -x .data.rel.ro
+
+There are no relocations in this file.
+
+Hex dump of section '.data.rel.ro':
+ 0x[a-f0-9]+ 00000000 00000000 ........
diff --git a/ld/testsuite/ld-x86-64/pr13082-4b.d b/ld/testsuite/ld-x86-64/pr13082-4b.d
index 6d4a35b..2b7584c 100644
--- a/ld/testsuite/ld-x86-64/pr13082-4b.d
+++ b/ld/testsuite/ld-x86-64/pr13082-4b.d
@@ -2,6 +2,9 @@
#name: PR ld/13082-4 (b)
#as: --x32
#ld: -pie -melf32_x86_64
-#readelf: -r --wide
+#readelf: -r -x .data.rel.ro
There are no relocations in this file.
+
+Hex dump of section '.data.rel.ro':
+ 0x[a-f0-9]+ 01000000 00000000 ........
diff --git a/ld/testsuite/ld-x86-64/pr19609-1.s b/ld/testsuite/ld-x86-64/pr19609-1.s
new file mode 100644
index 0000000..91cc130
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1.s
@@ -0,0 +1,20 @@
+ .text
+ .weak bar
+ .globl _start
+ .type _start, @function
+_start:
+ cmp bar@GOTPCREL(%rip), %rax
+ cmp bar@GOTPCREL(%rip), %ecx
+ cmp bar@GOTPCREL(%rip), %r11
+ cmp bar@GOTPCREL(%rip), %r12d
+
+ mov bar@GOTPCREL(%rip), %rax
+ mov bar@GOTPCREL(%rip), %ecx
+ mov bar@GOTPCREL(%rip), %r11
+ mov bar@GOTPCREL(%rip), %r12d
+
+ test %rax, bar@GOTPCREL(%rip)
+ test %ecx, bar@GOTPCREL(%rip)
+ test %r11, bar@GOTPCREL(%rip)
+ test %r12d, bar@GOTPCREL(%rip)
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr19609-1a.d b/ld/testsuite/ld-x86-64/pr19609-1a.d
new file mode 100644
index 0000000..a908e39
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1a.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 c7 c3 00 00 00 00 mov \$0x0,%r11
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1b.d b/ld/testsuite/ld-x86-64/pr19609-1b.d
new file mode 100644
index 0000000..d5e2e85
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1b.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -pie -melf_x86_64 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 c7 c3 00 00 00 00 mov \$0x0,%r11
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1c.d b/ld/testsuite/ld-x86-64/pr19609-1c.d
new file mode 100644
index 0000000..3b1e98d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1c.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -shared -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 3b 0d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 3b 1d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 3b 25 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 8b 0d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 8b 1d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 8b 25 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 85 05 ([0-9a-f]{2} ){4} * test %rax,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 85 0d ([0-9a-f]{2} ){4} * test %ecx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 85 1d ([0-9a-f]{2} ){4} * test %r11,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 85 25 ([0-9a-f]{2} ){4} * test %r12d,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-1d.d b/ld/testsuite/ld-x86-64/pr19609-1d.d
new file mode 100644
index 0000000..980d8dc
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1d.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -E -melf_x86_64 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 c7 c3 00 00 00 00 mov \$0x0,%r11
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1e.d b/ld/testsuite/ld-x86-64/pr19609-1e.d
new file mode 100644
index 0000000..dac5fef
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1e.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -shared -E -Bsymbolic -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 3b 0d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 3b 1d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 3b 25 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 8b 0d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 8b 1d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 8b 25 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 85 05 ([0-9a-f]{2} ){4} * test %rax,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 85 0d ([0-9a-f]{2} ){4} * test %ecx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 85 1d ([0-9a-f]{2} ){4} * test %r11,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 85 25 ([0-9a-f]{2} ){4} * test %r12d,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-1f.d b/ld/testsuite/ld-x86-64/pr19609-1f.d
new file mode 100644
index 0000000..93a7f2c
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1f.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -pie --dynamic-list-data -melf_x86_64 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 c7 c3 00 00 00 00 mov \$0x0,%r11
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1g.d b/ld/testsuite/ld-x86-64/pr19609-1g.d
new file mode 100644
index 0000000..05a4964
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1g.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -pie -E -melf_x86_64 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 c7 c3 00 00 00 00 mov \$0x0,%r11
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1h.d b/ld/testsuite/ld-x86-64/pr19609-1h.d
new file mode 100644
index 0000000..5675076
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1h.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 00 rex mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 41 c7 c3 00 00 00 00 mov \$0x0,%r11d
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1i.d b/ld/testsuite/ld-x86-64/pr19609-1i.d
new file mode 100644
index 0000000..8ef42ad
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1i.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -pie -melf32_x86_64 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 00 rex mov \$0x0,%eax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 41 c7 c3 00 00 00 00 mov \$0x0,%r11d
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1j.d b/ld/testsuite/ld-x86-64/pr19609-1j.d
new file mode 100644
index 0000000..4a36a70
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1j.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --x32
+#ld: -shared -melf32_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 3b 0d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 3b 1d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 3b 25 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 8b 0d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 8b 1d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 8b 25 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 85 05 ([0-9a-f]{2} ){4} * test %rax,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 85 0d ([0-9a-f]{2} ){4} * test %ecx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 85 1d ([0-9a-f]{2} ){4} * test %r11,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 85 25 ([0-9a-f]{2} ){4} * test %r12d,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-1k.d b/ld/testsuite/ld-x86-64/pr19609-1k.d
new file mode 100644
index 0000000..faab0df
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1k.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -pie -E -Bsymbolic-functions -melf_x86_64 --no-dynamic-linker
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 81 f8 00 00 00 00 cmp \$0x0,%rax
+[ ]*[a-f0-9]+: 81 f9 00 00 00 00 cmp \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 81 fb 00 00 00 00 cmp \$0x0,%r11
+[ ]*[a-f0-9]+: 41 81 fc 00 00 00 00 cmp \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 00 mov \$0x0,%rax
+[ ]*[a-f0-9]+: c7 c1 00 00 00 00 mov \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 c7 c3 00 00 00 00 mov \$0x0,%r11
+[ ]*[a-f0-9]+: 41 c7 c4 00 00 00 00 mov \$0x0,%r12d
+[ ]*[a-f0-9]+: 48 f7 c0 00 00 00 00 test \$0x0,%rax
+[ ]*[a-f0-9]+: f7 c1 00 00 00 00 test \$0x0,%ecx
+[ ]*[a-f0-9]+: 49 f7 c3 00 00 00 00 test \$0x0,%r11
+[ ]*[a-f0-9]+: 41 f7 c4 00 00 00 00 test \$0x0,%r12d
diff --git a/ld/testsuite/ld-x86-64/pr19609-1l.d b/ld/testsuite/ld-x86-64/pr19609-1l.d
new file mode 100644
index 0000000..aedf5d8
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1l.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=no
+#ld: -melf_x86_64 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 3b 0d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 3b 1d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 3b 25 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 8d 05 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%rax # 0 <_start-0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 8d 0d ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%ecx # 0 <_start-0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 8d 1d ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%r11 # 0 <_start-0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 8d 25 ([0-9a-f]{2} ){4} * lea -0x[a-f0-9]+\(%rip\),%r12d # 0 <_start-0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 85 05 ([0-9a-f]{2} ){4} * test %rax,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 85 0d ([0-9a-f]{2} ){4} * test %ecx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 85 1d ([0-9a-f]{2} ){4} * test %r11,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 85 25 ([0-9a-f]{2} ){4} * test %r12d,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_start\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-1m.d b/ld/testsuite/ld-x86-64/pr19609-1m.d
new file mode 100644
index 0000000..8e80cbb
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-1m.d
@@ -0,0 +1,23 @@
+#source: pr19609-1.s
+#as: --64 -mrelax-relocations=no
+#ld: -pie -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 3b 0d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 3b 1d ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 3b 25 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 8b 0d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%ecx # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 8b 1d ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 8b 25 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%r12d # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 48 85 05 ([0-9a-f]{2} ){4} * test %rax,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 85 0d ([0-9a-f]{2} ){4} * test %ecx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 4c 85 1d ([0-9a-f]{2} ){4} * test %r11,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
+[ ]*[a-f0-9]+: 44 85 25 ([0-9a-f]{2} ){4} * test %r12d,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-2.s b/ld/testsuite/ld-x86-64/pr19609-2.s
new file mode 100644
index 0000000..d52ec9d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-2.s
@@ -0,0 +1,9 @@
+ .data
+foo:
+ .quad 0
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ cmpq foo@GOTPCREL(%rip), %rax
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr19609-2a.d b/ld/testsuite/ld-x86-64/pr19609-2a.d
new file mode 100644
index 0000000..e2c6c89
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-2a.d
@@ -0,0 +1,4 @@
+#source: pr19609-2.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#error: .*relocation truncated to fit: R_X86_64_32S .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-2b.d b/ld/testsuite/ld-x86-64/pr19609-2b.d
new file mode 100644
index 0000000..ead4987
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-2b.d
@@ -0,0 +1,4 @@
+#source: pr19609-2.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#error: .*relocation truncated to fit: R_X86_64_32S .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-2c.d b/ld/testsuite/ld-x86-64/pr19609-2c.d
new file mode 100644
index 0000000..458b08a
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-2c.d
@@ -0,0 +1,13 @@
+#source: pr19609-2.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+70000000 <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} cmp -?0x[a-f0-9]+\(%rip\),%rax # .*
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-2d.d b/ld/testsuite/ld-x86-64/pr19609-2d.d
new file mode 100644
index 0000000..32c4c8f
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-2d.d
@@ -0,0 +1,13 @@
+#source: pr19609-2.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+70000000 <_start>:
+#pass
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} cmp -?0x[a-f0-9]+\(%rip\),%rax # .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-3.s b/ld/testsuite/ld-x86-64/pr19609-3.s
new file mode 100644
index 0000000..b152946
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-3.s
@@ -0,0 +1,10 @@
+ .data
+foo:
+ .quad 0
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ cmpl foo@GOTPCREL(%rip), %eax
+ cmpl foo@GOTPCREL(%rip), %r11d
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr19609-3a.d b/ld/testsuite/ld-x86-64/pr19609-3a.d
new file mode 100644
index 0000000..3248bb2
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-3a.d
@@ -0,0 +1,14 @@
+#source: pr19609-3.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+70000000 <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 a0 cmp \$0xa0000000,%eax
+[ ]*[a-f0-9]+: 41 81 fb 00 00 00 a0 cmp \$0xa0000000,%r11d
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-3b.d b/ld/testsuite/ld-x86-64/pr19609-3b.d
new file mode 100644
index 0000000..52ca5b7
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-3b.d
@@ -0,0 +1,14 @@
+#source: pr19609-3.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+70000000 <_start>:
+[ ]*[a-f0-9]+: 81 f8 00 00 00 a0 cmp \$0xa0000000,%eax
+[ ]*[a-f0-9]+: 41 81 fb 00 00 00 a0 cmp \$0xa0000000,%r11d
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-4.s b/ld/testsuite/ld-x86-64/pr19609-4.s
new file mode 100644
index 0000000..3db3ebb
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-4.s
@@ -0,0 +1,10 @@
+ .data
+foo:
+ .quad 0
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ movq foo@GOTPCREL(%rip), %rax
+ movq foo@GOTPCREL(%rip), %r11
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr19609-4a.d b/ld/testsuite/ld-x86-64/pr19609-4a.d
new file mode 100644
index 0000000..ce952ed
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-4a.d
@@ -0,0 +1,5 @@
+#source: pr19609-4.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#error: .*relocation truncated to fit: R_X86_64_32S .*
+#error: .*relocation truncated to fit: R_X86_64_32S .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-4b.d b/ld/testsuite/ld-x86-64/pr19609-4b.d
new file mode 100644
index 0000000..cb92aa6
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-4b.d
@@ -0,0 +1,13 @@
+#source: pr19609-4.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+70000000 <_start>:
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 a0 rex mov \$0xa0000000,%eax
+[ ]*[a-f0-9]+: 41 c7 c3 00 00 00 a0 mov \$0xa0000000,%r11d
diff --git a/ld/testsuite/ld-x86-64/pr19609-4c.d b/ld/testsuite/ld-x86-64/pr19609-4c.d
new file mode 100644
index 0000000..ce952ed
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-4c.d
@@ -0,0 +1,5 @@
+#source: pr19609-4.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#error: .*relocation truncated to fit: R_X86_64_32S .*
+#error: .*relocation truncated to fit: R_X86_64_32S .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-4d.d b/ld/testsuite/ld-x86-64/pr19609-4d.d
new file mode 100644
index 0000000..cb92aa6
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-4d.d
@@ -0,0 +1,13 @@
+#source: pr19609-4.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+70000000 <_start>:
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 a0 rex mov \$0xa0000000,%eax
+[ ]*[a-f0-9]+: 41 c7 c3 00 00 00 a0 mov \$0xa0000000,%r11d
diff --git a/ld/testsuite/ld-x86-64/pr19609-4e.d b/ld/testsuite/ld-x86-64/pr19609-4e.d
new file mode 100644
index 0000000..527fe5d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-4e.d
@@ -0,0 +1,13 @@
+#source: pr19609-4.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+70000000 <_start>:
+[ ]*[a-f0-9]+: 48 8d 05 f9 ff ff 2f lea 0x2ffffff9\(%rip\),%rax # a0000000 <foo>
+[ ]*[a-f0-9]+: 4c 8d 1d f2 ff ff 2f lea 0x2ffffff2\(%rip\),%r11 # a0000000 <foo>
diff --git a/ld/testsuite/ld-x86-64/pr19609-5.s b/ld/testsuite/ld-x86-64/pr19609-5.s
new file mode 100644
index 0000000..85106bb
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-5.s
@@ -0,0 +1,6 @@
+ .text
+ .weak bar
+ .globl _start
+ .type _start, @function
+_start:
+ call *bar@GOTPCREL(%rip)
diff --git a/ld/testsuite/ld-x86-64/pr19609-5a.d b/ld/testsuite/ld-x86-64/pr19609-5a.d
new file mode 100644
index 0000000..39948e0
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-5a.d
@@ -0,0 +1,12 @@
+#source: pr19609-5.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]+[a-f0-9]+: 67 e8 ([0-9a-f]{2} ){4}[ ]+addr32 callq 0 <_start-0x[0-9a-f]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-5b.d b/ld/testsuite/ld-x86-64/pr19609-5b.d
new file mode 100644
index 0000000..4183d56
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-5b.d
@@ -0,0 +1,12 @@
+#source: pr19609-5.s
+#as: --64 -mrelax-relocations=yes
+#ld: -pie -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]+[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * callq \*0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-5c.d b/ld/testsuite/ld-x86-64/pr19609-5c.d
new file mode 100644
index 0000000..4eaeb2b
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-5c.d
@@ -0,0 +1,12 @@
+#source: pr19609-5.s
+#as: --64 -mrelax-relocations=yes
+#ld: -shared -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]+[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * callq \*0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_DYNAMIC\+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-5d.d b/ld/testsuite/ld-x86-64/pr19609-5d.d
new file mode 100644
index 0000000..959c63e
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-5d.d
@@ -0,0 +1,4 @@
+#source: pr19609-5.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x80000000
+#error: .*relocation truncated to fit: R_X86_64_PC32 .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-5e.d b/ld/testsuite/ld-x86-64/pr19609-5e.d
new file mode 100644
index 0000000..b6b6c65
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-5e.d
@@ -0,0 +1,12 @@
+#source: pr19609-5.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x80000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]+[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * callq \*-?0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <[0-9a-zA-Z_]+[\+\-]+0x[a-f0-9]+>
diff --git a/ld/testsuite/ld-x86-64/pr19609-6.s b/ld/testsuite/ld-x86-64/pr19609-6.s
new file mode 100644
index 0000000..4e3fc23f
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-6.s
@@ -0,0 +1,6 @@
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ movq foobar@GOTPCREL(%rip), %rax
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr19609-6a.d b/ld/testsuite/ld-x86-64/pr19609-6a.d
new file mode 100644
index 0000000..4802ffe
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-6a.d
@@ -0,0 +1,4 @@
+#source: pr19609-6.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 --defsym foobar=0x80000000
+#error: .*relocation truncated to fit: R_X86_64_32S .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-6b.d b/ld/testsuite/ld-x86-64/pr19609-6b.d
new file mode 100644
index 0000000..64e1f5b
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-6b.d
@@ -0,0 +1,13 @@
+#source: pr19609-6.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 --defsym foobar=0x80000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov 0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_start\+0x[a-f0-9]+>
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-6c.d b/ld/testsuite/ld-x86-64/pr19609-6c.d
new file mode 100644
index 0000000..19ba1d8
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-6c.d
@@ -0,0 +1,13 @@
+#source: pr19609-6.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 --defsym foobar=0x70000000
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 48 c7 c0 00 00 00 70 mov \$0x70000000,%rax
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-6d.d b/ld/testsuite/ld-x86-64/pr19609-6d.d
new file mode 100644
index 0000000..3ef614d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-6d.d
@@ -0,0 +1,13 @@
+#source: pr19609-6.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 --defsym foobar=0x80000000
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: 40 c7 c0 00 00 00 80 rex mov \$0x80000000,%eax
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-7.s b/ld/testsuite/ld-x86-64/pr19609-7.s
new file mode 100644
index 0000000..bc654f5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-7.s
@@ -0,0 +1,7 @@
+ .text
+ .weak foobar
+ .globl _start
+ .type _start, @function
+_start:
+ call *foobar@GOTPCREL(%rip)
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr19609-7a.d b/ld/testsuite/ld-x86-64/pr19609-7a.d
new file mode 100644
index 0000000..d960572
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-7a.d
@@ -0,0 +1,4 @@
+#source: pr19609-7.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x80000000
+#error: .*relocation truncated to fit: R_X86_64_PC32 .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-7b.d b/ld/testsuite/ld-x86-64/pr19609-7b.d
new file mode 100644
index 0000000..2e8fd35
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-7b.d
@@ -0,0 +1,13 @@
+#source: pr19609-7.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -Ttext=0x80000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * callq \*-?0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.*0x[a-f0-9]+>
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr19609-7c.d b/ld/testsuite/ld-x86-64/pr19609-7c.d
new file mode 100644
index 0000000..8bd919a
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-7c.d
@@ -0,0 +1,4 @@
+#source: pr19609-7.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x80000000
+#error: .*relocation truncated to fit: R_X86_64_PC32 .*
diff --git a/ld/testsuite/ld-x86-64/pr19609-7d.d b/ld/testsuite/ld-x86-64/pr19609-7d.d
new file mode 100644
index 0000000..ba28828
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr19609-7d.d
@@ -0,0 +1,13 @@
+#source: pr19609-7.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -Ttext=0x80000000 --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * callq \*-?0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.*0x[a-f0-9]+>
+#pass
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 5a3b24f..4b4cf12 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -305,6 +305,8 @@ run_dump_test "pr13082-2a"
run_dump_test "pr13082-2b"
run_dump_test "pr13082-3a"
run_dump_test "pr13082-3b"
+run_dump_test "pr13082-3c"
+run_dump_test "pr13082-3d"
run_dump_test "pr13082-4a"
run_dump_test "pr13082-4b"
run_dump_test "pr13082-5a"
@@ -382,6 +384,43 @@ run_dump_test "pr19636-3a"
run_dump_test "pr19636-3b"
run_dump_test "pr19636-3c"
run_dump_test "pr19645"
+run_dump_test "pr19609-1a"
+run_dump_test "pr19609-1b"
+run_dump_test "pr19609-1c"
+run_dump_test "pr19609-1d"
+run_dump_test "pr19609-1e"
+run_dump_test "pr19609-1f"
+run_dump_test "pr19609-1g"
+run_dump_test "pr19609-1h"
+run_dump_test "pr19609-1i"
+run_dump_test "pr19609-1j"
+run_dump_test "pr19609-1k"
+run_dump_test "pr19609-1l"
+run_dump_test "pr19609-1m"
+run_dump_test "pr19609-2a"
+run_dump_test "pr19609-2b"
+run_dump_test "pr19609-2c"
+run_dump_test "pr19609-2d"
+run_dump_test "pr19609-3a"
+run_dump_test "pr19609-3b"
+run_dump_test "pr19609-4a"
+run_dump_test "pr19609-4b"
+run_dump_test "pr19609-4c"
+run_dump_test "pr19609-4d"
+run_dump_test "pr19609-4e"
+run_dump_test "pr19609-5a"
+run_dump_test "pr19609-5b"
+run_dump_test "pr19609-5c"
+run_dump_test "pr19609-5d"
+run_dump_test "pr19609-5e"
+run_dump_test "pr19609-6a"
+run_dump_test "pr19609-6b"
+run_dump_test "pr19609-6c"
+run_dump_test "pr19609-6d"
+run_dump_test "pr19609-7a"
+run_dump_test "pr19609-7b"
+run_dump_test "pr19609-7c"
+run_dump_test "pr19609-7d"
proc undefined_weak {cflags ldflags} {
set testname "Undefined weak symbol"