@@ -1770,6 +1770,7 @@ static unsigned int evex_move_r_to_b (unsigned int byte1)
static bool
elf_x86_64_convert_load_reloc (bfd *abfd,
+ asection *input_section,
bfd_byte *contents,
unsigned int *r_type_p,
Elf_Internal_Rela *irel,
@@ -1793,6 +1794,10 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
unsigned int r_symndx;
bfd_vma roff = irel->r_offset;
bfd_vma abs_relocation;
+ reloc_howto_type *howto;
+ bfd_reloc_status_type r;
+ Elf_Internal_Sym *isym;
+ bfd_vma relocation;
switch (r_type)
{
@@ -1901,8 +1906,8 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
/* Get the symbol referred to by the reloc. */
if (h == NULL)
{
- Elf_Internal_Sym *isym
- = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, r_symndx);
+ isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
+ r_symndx);
/* Skip relocation against undefined symbols. */
if (isym->st_shndx == SHN_UNDEF)
@@ -1932,6 +1937,9 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
R_X86_64_PC32. */
struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
+ isym = NULL;
+ tsec = NULL;
+
abs_symbol = ABS_SYMBOL_P (h);
abs_relocation = h->root.u.def.value;
@@ -1991,6 +1999,8 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
/* Skip since R_X86_64_32/R_X86_64_32S may overflow. */
if (no_overflow)
return true;
+ if (h->start_stop)
+ tsec = h->root.u.def.section;
goto convert;
}
tsec = h->root.u.def.section;
@@ -2009,6 +2019,25 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
return true;
convert:
+ /* Compute relocation value so that it can be used later to check for
+ overflow against the converted relocation. */
+ if (h == NULL)
+ {
+ /* Make a copy of IREL so that _bfd_elf_rela_local_sym won't
+ change IREL. */
+ Elf_Internal_Rela rel = *irel;
+ relocation = _bfd_elf_rela_local_sym (link_info->output_bfd, isym,
+ &tsec, &rel);
+ /* Use the updated r_addend. */
+ raddend = rel.r_addend;
+ }
+ else if (tsec != NULL)
+ relocation = (h->root.u.def.value
+ + tsec->output_section->vma
+ + tsec->output_offset);
+ else
+ relocation = 0;
+
if (opcode == 0xff)
{
/* We have "call/jmp *foo@GOTPCREL(%rip)". */
@@ -2016,6 +2045,16 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
unsigned int disp;
bfd_vma nop_offset;
+ r_type = R_X86_64_PC32;
+
+ /* Skip if the converted relocation will overflow. */
+ howto = elf_x86_64_rtype_to_howto (abfd, r_type);
+ r = _bfd_final_link_relocate (howto, abfd, input_section,
+ contents, irel->r_offset,
+ relocation, raddend);
+ if (r == bfd_reloc_overflow)
+ return true;
+
/* Convert R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX to
R_X86_64_PC32. */
modrm = bfd_get_8 (abfd, contents + roff - 1);
@@ -2060,7 +2099,6 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
}
bfd_put_8 (abfd, nop, contents + nop_offset);
bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
- r_type = R_X86_64_PC32;
}
else if (r_type == R_X86_64_CODE_6_GOTPCRELX && opcode != 0x8b)
{
@@ -2101,6 +2139,14 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
overflow when sign-extending imm32 to 64 bits. */
r_type = evex[1] & 0x80 ? R_X86_64_32S : R_X86_64_32;
+ /* Skip if the converted relocation will overflow. */
+ howto = elf_x86_64_rtype_to_howto (abfd, r_type);
+ r = _bfd_final_link_relocate (howto, abfd, input_section,
+ contents, irel->r_offset,
+ relocation, 0);
+ if (r == bfd_reloc_overflow)
+ return true;
+
if (abs_relocation) /* Bogus; should be abs_symbol. */
{
/* Check if R_X86_64_32S/R_X86_64_32 fits. */
@@ -2186,6 +2232,15 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
opcode = 0x8d;
r_type = R_X86_64_PC32;
+ /* Skip if the converted relocation will overflow. */
+ howto = elf_x86_64_rtype_to_howto (abfd, r_type);
+ r = _bfd_final_link_relocate (howto, abfd, input_section,
+ contents, irel->r_offset,
+ relocation,
+ raddend);
+ if (r == bfd_reloc_overflow)
+ return true;
+
/* For MOVRS move a possible REX prefix as necessary. */
if (movrs == 5)
bfd_put_8 (abfd, rex, contents + roff - 3);
@@ -2245,6 +2300,14 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
r_type = rex_w ? R_X86_64_32S : R_X86_64_32;
rewrite_modrm_rex:
+ /* Skip if the converted relocation will overflow. */
+ howto = elf_x86_64_rtype_to_howto (abfd, r_type);
+ r = _bfd_final_link_relocate (howto, abfd, input_section,
+ contents, irel->r_offset,
+ relocation, 0);
+ if (r == bfd_reloc_overflow)
+ return true;
+
if (abs_relocation)
{
/* Check if R_X86_64_32S/R_X86_64_32 fits. */
@@ -2465,9 +2528,9 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
&& (h == NULL || h->type != STT_GNU_IFUNC))
{
Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
- if (!elf_x86_64_convert_load_reloc (abfd, contents, &r_type,
- irel, h, &converted_reloc,
- info))
+ if (!elf_x86_64_convert_load_reloc (abfd, sec, contents,
+ &r_type, irel, h,
+ &converted_reloc, info))
goto error_return;
if (converted_reloc)
@@ -73,3 +73,44 @@ EOF
LDEMUL_BEFORE_PARSE=elf_x86_64_before_parse
;;
esac
+
+case x${OUTPUT_FORMAT} in
+ x*x86-64*)
+fragment <<EOF
+
+static void
+elf_x86_64_before_allocation (void)
+{
+ if (!bfd_link_relocatable (&link_info)
+ && is_elf_hash_table (link_info.hash)
+ && expld.phase != lang_mark_phase_enum)
+ {
+ struct elf_link_hash_table *htab = elf_hash_table (&link_info);
+ /* Run one_lang_size_sections_pass to estimate the output section
+ layout before sizing dynamic sections. */
+ expld.dataseg.phase = exp_seg_none;
+ expld.phase = lang_mark_phase_enum;
+ /* NB: Exclude linker created GOT setions when estimating output
+ section layout as sizing dynamic sections may change linker
+ created GOT sections. */
+ if (htab->sgot != NULL)
+ htab->sgot->flags |= SEC_EXCLUDE;
+ if (htab->sgotplt != NULL)
+ htab->sgotplt->flags |= SEC_EXCLUDE;
+ one_lang_size_sections_pass (NULL, false);
+ /* Restore linker created GOT setions. */
+ if (htab->sgot != NULL)
+ htab->sgot->flags &= ~SEC_EXCLUDE;
+ if (htab->sgotplt != NULL)
+ htab->sgotplt->flags &= ~SEC_EXCLUDE;
+ lang_reset_memory_regions ();
+ }
+
+ gld${EMULATION_NAME}_before_allocation ();
+}
+
+EOF
+
+LDEMUL_BEFORE_ALLOCATION=elf_x86_64_before_allocation
+ ;;
+esac
@@ -1,4 +1,13 @@
#source: pr19609-2.s
#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
-#error: .*failed to convert GOTPCREL relocation against 'foo'; relink with --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
@@ -1,4 +1,13 @@
#source: pr19609-2.s
#as: --x32 -mrelax-relocations=yes
#ld: -melf32_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
-#error: .*failed to convert GOTPCREL relocation against 'foo'; relink with --no-relax.*
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+70000000 <_start>:
+[ ]*[a-f0-9]+: 48 3b 05 ([0-9a-f]{2} ){4} cmp -?0x[a-f0-9]+\(%rip\),%rax # .*
+#pass
@@ -1,4 +1,13 @@
#source: pr19609-4.s
#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -Ttext=0x70000000 -Tdata=0xa0000000
-#error: .*failed to convert GOTPCREL relocation against 'foo'; relink with --no-relax.*failed to convert GOTPCREL relocation against 'foo'; relink with --no-relax.*
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+70000000 <_start>:
+[ ]*[a-f0-9]+: 48 8b 05 ([0-9a-f]{2} ){4} * mov [-]?0x[a-f0-9]+\(%rip\),%rax # [a-f0-9]+ <_start\+0x1000>
+[ ]*[a-f0-9]+: 4c 8b 1d ([0-9a-f]{2} ){4} * mov [-]?0x[a-f0-9]+\(%rip\),%r11 # [a-f0-9]+ <_start\+0x1000>
@@ -1,4 +1,12 @@
#source: pr19609-5.s
#as: --64 -mrelax-relocations=yes
#ld: -melf_x86_64 -Ttext=0x80000000
-#error: .*failed to convert GOTPCREL relocation against 'bar'; relink with --no-relax
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]+[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * call \*-?0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.*>
@@ -1,4 +1,13 @@
#source: pr19609-7.s
#as: --64 -mrelax-relocations=yes
-#ld: -melf_x86_64 -Ttext=0x80000000
-#error: .*failed to convert GOTPCREL relocation against 'foobar'; relink with --no-relax
+#ld: -melf_x86_64 -Ttext=0x80000000 -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * call \*-?0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_start\+0x1000>
+#pass
@@ -1,4 +1,13 @@
#source: pr19609-7.s
#as: --x32 -mrelax-relocations=yes
-#ld: -melf32_x86_64 -Ttext=0x80000000
-#error: .*failed to convert GOTPCREL relocation against 'foobar'; relink with --no-relax
+#ld: -melf32_x86_64 -Ttext=0x80000000 -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+[ ]*[a-f0-9]+: ff 15 ([0-9a-f]{2} ){4} * call \*-?0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <_start\+0x1000>
+#pass
new file mode 100644
@@ -0,0 +1,24 @@
+.section .text.foo,"ax"
+.globl _foo
+.type _foo, @function
+_foo:
+ movl __start_data@GOTPCREL(%rip), %eax
+ addq foo_1@GOTPCREL(%rip), %rax
+ addq foo@GOTPCREL(%rip), %rax
+
+.section .text,"ax"
+.globl _start
+.type _start, @function
+_start:
+ movl __stop_data@GOTPCREL(%rip), %eax
+ movq __stop_data@GOTPCREL(%rip), %rax
+ movq __stop_data@GOTPCREL(%rip), %rax
+ movl __stop_data@GOTPCREL(%rip), %eax
+
+.section foo,"aw",@progbits
+.space 1
+foo_1:
+.space 1
+
+.section data,"aw",@progbits
+.space 13
new file mode 100644
@@ -0,0 +1,22 @@
+#source: pr32591-1.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -T pr32591-1a.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+00100000 <_foo>:
+ 100000: c7 c0 00 00 20 80 mov \$0x80200000,%eax
+ 100006: 48 03 05 f3 ff 1f 00 add 0x1ffff3\(%rip\),%rax # 300000 <_start\+0x100000>
+ 10000d: 48 81 c0 ff ff ff 7f add \$0x7fffffff,%rax
+
+Disassembly of section .text:
+
+00200000 <_start>:
+ 200000: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
+ 200006: 40 c7 c0 0d 00 20 80 rex mov \$0x8020000d,%eax
+ 20000d: 40 c7 c0 0d 00 20 80 rex mov \$0x8020000d,%eax
+ 200014: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
new file mode 100644
@@ -0,0 +1,22 @@
+#source: pr32591-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -T pr32591-1a.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+0000000000100000 <_foo>:
+ 100000: c7 c0 00 00 20 80 mov \$0x80200000,%eax
+ 100006: 48 03 05 f3 ff 1f 00 add 0x1ffff3\(%rip\),%rax # 300000 <_start\+0x100000>
+ 10000d: 48 81 c0 ff ff ff 7f add \$0x7fffffff,%rax
+
+Disassembly of section .text:
+
+0000000000200000 <_start>:
+ 200000: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
+ 200006: 48 8b 05 fb ff 0f 00 mov 0xffffb\(%rip\),%rax # 300008 <_start\+0x100008>
+ 20000d: 48 8b 05 f4 ff 0f 00 mov 0xffff4\(%rip\),%rax # 300008 <_start\+0x100008>
+ 200014: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
new file mode 100644
@@ -0,0 +1,7 @@
+SECTIONS {
+ .text.foo 0x100000 : { *(.text.foo) }
+ .text 0x200000 : { *(.text) }
+ .got 0x300000 : { *(.got) }
+ foo 0x7fffffff : { *(foo) }
+ data 0x80200000 : { *(data) }
+}
new file mode 100644
@@ -0,0 +1,27 @@
+#source: pr32591-1.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -T pr32591-1b.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+00100000 <_foo>:
+ 100000: c7 c0 00 00 20 80 mov \$0x80200000,%eax
+ 100006: 48 03 05 f3 ff 1f 00 add 0x1ffff3\(%rip\),%rax # 300000 <_start\+0x100000>
+ 10000d: 48 81 c0 ff ff ff 7f add \$0x7fffffff,%rax
+
+Disassembly of section .text:
+
+001ff000 <_start-0x1000>:
+ 1ff000: 66 2e 0f 1f 84 00 00 00 00 00 cs nopw 0x0\(%rax,%rax,1\)
+#...
+ 1ffffa: 66 0f 1f 44 00 00 nopw 0x0\(%rax,%rax,1\)
+
+00200000 <_start>:
+ 200000: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
+ 200006: 40 c7 c0 0d 00 20 80 rex mov \$0x8020000d,%eax
+ 20000d: 40 c7 c0 0d 00 20 80 rex mov \$0x8020000d,%eax
+ 200014: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
new file mode 100644
@@ -0,0 +1,27 @@
+#source: pr32591-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -T pr32591-1b.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+0000000000100000 <_foo>:
+ 100000: c7 c0 00 00 20 80 mov \$0x80200000,%eax
+ 100006: 48 03 05 f3 ff 1f 00 add 0x1ffff3\(%rip\),%rax # 300000 <_start\+0x100000>
+ 10000d: 48 81 c0 ff ff ff 7f add \$0x7fffffff,%rax
+
+Disassembly of section .text:
+
+00000000001ff000 <_start-0x1000>:
+ 1ff000: 66 2e 0f 1f 84 00 00 00 00 00 cs nopw 0x0\(%rax,%rax,1\)
+#...
+ 1ffffa: 66 0f 1f 44 00 00 nopw 0x0\(%rax,%rax,1\)
+
+0000000000200000 <_start>:
+ 200000: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
+ 200006: 48 8b 05 fb ff 0f 00 mov 0xffffb\(%rip\),%rax # 300008 <_start\+0x100008>
+ 20000d: 48 8b 05 f4 ff 0f 00 mov 0xffff4\(%rip\),%rax # 300008 <_start\+0x100008>
+ 200014: c7 c0 0d 00 20 80 mov \$0x8020000d,%eax
new file mode 100644
@@ -0,0 +1,7 @@
+SECTIONS {
+ .text.foo 0x100000 : { *(.text.foo) }
+ .text 0x1ff000 : { . = . + 0x1000 ; *(.text) }
+ .got 0x300000 : { *(.got) }
+ foo 0x7fffffff : { *(foo) }
+ data 0x80200000 : { *(data) }
+}
new file mode 100644
@@ -0,0 +1,22 @@
+#source: pr32591-1.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -T pr32591-1c.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+00100000 <_foo>:
+ 100000: c7 c0 00 00 40 00 mov \$0x400000,%eax
+ 100006: 48 81 c0 0e 00 40 00 add \$0x40000e,%rax
+ 10000d: 48 81 c0 0d 00 40 00 add \$0x40000d,%rax
+
+Disassembly of section .text:
+
+00200000 <_start>:
+ 200000: c7 c0 0d 00 40 00 mov \$0x40000d,%eax
+ 200006: 40 c7 c0 0d 00 40 00 rex mov \$0x40000d,%eax
+ 20000d: 40 c7 c0 0d 00 40 00 rex mov \$0x40000d,%eax
+ 200014: c7 c0 0d 00 40 00 mov \$0x40000d,%eax
new file mode 100644
@@ -0,0 +1,22 @@
+#source: pr32591-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -T pr32591-1c.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+0000000000100000 <_foo>:
+ 100000: c7 c0 00 00 40 00 mov \$0x400000,%eax
+ 100006: 48 81 c0 0e 00 40 00 add \$0x40000e,%rax
+ 10000d: 48 81 c0 0d 00 40 00 add \$0x40000d,%rax
+
+Disassembly of section .text:
+
+0000000000200000 <_start>:
+ 200000: c7 c0 0d 00 40 00 mov \$0x40000d,%eax
+ 200006: 48 c7 c0 0d 00 40 00 mov \$0x40000d,%rax
+ 20000d: 48 c7 c0 0d 00 40 00 mov \$0x40000d,%rax
+ 200014: c7 c0 0d 00 40 00 mov \$0x40000d,%eax
new file mode 100644
@@ -0,0 +1,6 @@
+SECTIONS {
+ .text.foo 0x100000 : { *(.text.foo) }
+ .text 0x200000 : { *(.text) }
+ .got 0x300000 : { *(.got) }
+ data 0x400000 : { *(data) }
+}
new file mode 100644
@@ -0,0 +1,22 @@
+#source: pr32591-1.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -T pr32591-1d.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+00002000 <_foo>:
+ 2000: c7 c0 00 10 00 80 mov \$0x80001000,%eax
+ 2006: 48 03 05 f3 1f 00 00 add 0x1ff3\(%rip\),%rax # 4000 <_start\+0x1000>
+ 200d: 48 81 c0 ff ff ff 7f add \$0x7fffffff,%rax
+
+Disassembly of section .text:
+
+00003000 <_start>:
+ 3000: c7 c0 0d 10 00 80 mov \$0x8000100d,%eax
+ 3006: 40 c7 c0 0d 10 00 80 rex mov \$0x8000100d,%eax
+ 300d: 40 c7 c0 0d 10 00 80 rex mov \$0x8000100d,%eax
+ 3014: c7 c0 0d 10 00 80 mov \$0x8000100d,%eax
new file mode 100644
@@ -0,0 +1,22 @@
+#source: pr32591-1.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -T pr32591-1d.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text.foo:
+
+0000000000002000 <_foo>:
+ 2000: c7 c0 00 10 00 80 mov \$0x80001000,%eax
+ 2006: 48 03 05 f3 1f 00 00 add 0x1ff3\(%rip\),%rax # 4000 <_start\+0x1000>
+ 200d: 48 81 c0 ff ff ff 7f add \$0x7fffffff,%rax
+
+Disassembly of section .text:
+
+0000000000003000 <_start>:
+ 3000: c7 c0 0d 10 00 80 mov \$0x8000100d,%eax
+ 3006: 48 8b 05 fb 0f 00 00 mov 0xffb\(%rip\),%rax # 4008 <_start\+0x1008>
+ 300d: 48 8b 05 f4 0f 00 00 mov 0xff4\(%rip\),%rax # 4008 <_start\+0x1008>
+ 3014: c7 c0 0d 10 00 80 mov \$0x8000100d,%eax
new file mode 100644
@@ -0,0 +1,7 @@
+SECTIONS {
+ .text.foo 0x02000 : { *(.text.foo) }
+ .text 0x3000 : { *(.text) }
+ .got 0x4000 : { *(.got) }
+ foo 0x7fffffff : { *(foo) }
+ data 0x80001000 : { *(data) }
+}
new file mode 100644
@@ -0,0 +1,12 @@
+#source: pr32591-2.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -T pr32591-2.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+ffff0000 <_start>:
+ffff0000: 40 c7 c0 08 00 ff ff rex mov \$0xffff0008,%eax
new file mode 100644
@@ -0,0 +1,12 @@
+#source: pr32591-2.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -T pr32591-2.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+00000000ffff0000 <_start>:
+ ffff0000: 48 8b 05 09 00 00 00 mov 0x9\(%rip\),%rax # ffff0010 <__stack_chk_guard\+0x8>
new file mode 100644
@@ -0,0 +1,13 @@
+ .text
+ .p2align 4
+ .globl _start
+ .type _start, @function
+_start:
+ movq __stack_chk_guard@GOTPCREL(%rip), %rax
+ .globl __stack_chk_guard
+ .section .rodata
+ .align 8
+ .type __stack_chk_guard, @object
+__stack_chk_guard:
+ .quad -1
+ .section .note.GNU-stack,"",@progbits
new file mode 100644
@@ -0,0 +1,4 @@
+SECTIONS {
+ .text 0xffff0000 : { *(.text*) }
+ .rodata : AT(ADDR(".rodata") - 0xffff0000) { *(.rodata*) }
+}
new file mode 100644
@@ -0,0 +1,13 @@
+#source: pr32591-3.s
+#as: --x32 -mrelax-relocations=yes
+#ld: -melf32_x86_64 -T pr32591-3.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+f0000000 <_start>:
+f0000000: 40 c7 c0 08 00 30 ff rex mov \$0xff300008,%eax
+f0000007: 48 03 1d f2 ff 2f 0f add 0xf2ffff2\(%rip\),%rbx # ff300000 <_start\+0xf300000>
new file mode 100644
@@ -0,0 +1,13 @@
+#source: pr32591-3.s
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64 -T pr32591-3.t -z max-page-size=0x1000 -z separate-code --no-rosegment
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+00000000f0000000 <_start>:
+ f0000000: 48 8b 05 f9 ff 2f 0f mov 0xf2ffff9\(%rip\),%rax # ff300000 <_start\+0xf300000>
+ f0000007: 48 03 1d f2 ff 2f 0f add 0xf2ffff2\(%rip\),%rbx # ff300000 <_start\+0xf300000>
new file mode 100644
@@ -0,0 +1,7 @@
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ movq foo@GOTPCREL(%rip), %rax
+ addq foo@GOTPCREL(%rip), %rbx
+ .size _start, .-_start
new file mode 100644
@@ -0,0 +1,5 @@
+SECTIONS {
+ .text 0xf0000000 : { *(.text) }
+ .got 0xff300000 : { *(.got) }
+ foo = .;
+}
@@ -544,6 +544,18 @@ run_dump_test "tlsdesc4"
run_dump_test "tlsdesc5"
run_dump_test "pr32191"
run_dump_test "pr32191-x32"
+run_dump_test "pr32591-1a"
+run_dump_test "pr32591-1a-x32"
+run_dump_test "pr32591-1b"
+run_dump_test "pr32591-1b-x32"
+run_dump_test "pr32591-1c"
+run_dump_test "pr32591-1c-x32"
+run_dump_test "pr32591-1d"
+run_dump_test "pr32591-1d-x32"
+run_dump_test "pr32591-2"
+run_dump_test "pr32591-2-x32"
+run_dump_test "pr32591-3"
+run_dump_test "pr32591-3-x32"
if { ![skip_sframe_tests] } {
run_dump_test "sframe-simple-1"