lang_size_relro_segment_1 (seg_align_type *seg)
{
bfd_vma relro_end, desired_end;
- asection *sec;
+ asection *sec, *prev_sec = NULL;
+ bool remove_page_gap = false;
+ unsigned int max_alignment_power = 0;
/* Compute the expected PT_GNU_RELRO/PT_LOAD segment end. */
relro_end = ((seg->relro_end + seg->pagesize - 1)
/* For sections in the relro segment.. */
for (sec = link_info.output_bfd->section_last; sec; sec = sec->prev)
- if ((sec->flags & SEC_ALLOC) != 0
- && sec->vma >= seg->base
- && sec->vma < seg->relro_end - seg->relro_offset)
+ if ((sec->flags & SEC_ALLOC) != 0)
{
- /* Where do we want to put this section so that it ends as
- desired? */
- bfd_vma start, end, bump;
-
- end = start = sec->vma;
- if (!IS_TBSS (sec))
- end += TO_ADDR (sec->size);
- bump = desired_end - end;
- /* We'd like to increase START by BUMP, but we must heed
- alignment so the increase might be less than optimum. */
- start += bump;
- start &= ~(((bfd_vma) 1 << sec->alignment_power) - 1);
- /* This is now the desired end for the previous section. */
- desired_end = start;
+ if (sec->alignment_power > max_alignment_power)
+ max_alignment_power = sec->alignment_power;
+
+ if (sec->vma >= seg->base
+ && sec->vma < seg->relro_end - seg->relro_offset)
+ {
+ /* Where do we want to put this section so that it ends as
+ desired? */
+ bfd_vma start, end, bump;
+
+ end = start = sec->vma;
+ if (!IS_TBSS (sec))
+ end += TO_ADDR (sec->size);
+ bump = desired_end - end;
+ /* We'd like to increase START by BUMP, but we must heed
+ alignment so the increase might be less than optimum. */
+ start += bump;
+ start &= ~(((bfd_vma) 1 << sec->alignment_power) - 1);
+ /* This is now the desired end for the previous section. */
+ desired_end = start;
+ prev_sec = sec->prev;
+ }
}
seg->phase = exp_seg_relro_adjust;
ASSERT (desired_end >= seg->base);
+
+ for (; prev_sec; prev_sec = prev_sec->prev)
+ if ((prev_sec->flags & SEC_ALLOC) != 0)
+ {
+ if (prev_sec->alignment_power > max_alignment_power)
+ max_alignment_power = prev_sec->alignment_power;
+
+ if (prev_sec->size != 0)
+ {
+ /* The 1-page gap before the RELRO segment may be removed. */
+ remove_page_gap = ((prev_sec->vma + prev_sec->size
+ + seg->maxpagesize) < desired_end);
+
+ break;
+ }
+ }
+
+ if (remove_page_gap)
+ {
+ /* Find the maximum section alignment. */
+ for (sec = prev_sec; sec; sec = sec->prev)
+ if ((sec->flags & SEC_ALLOC) != 0
+ && sec->alignment_power > max_alignment_power)
+ max_alignment_power = sec->alignment_power;
+
+ /* Remove the 1-page gap before the RELRO segment only if the
+ maximum page size >= the maximum section alignment. */
+ if (seg->maxpagesize >= (1U << max_alignment_power))
+ {
+ /* If the preceding section size is greater than the maximum
+ page size, subtract the maximum page size. Otherwise,
+ align the RELRO segment to the maximum page size. */
+ if (prev_sec->size > seg->maxpagesize)
+ {
+ desired_end -= seg->maxpagesize;
+ relro_end -= seg->maxpagesize;
+ }
+ else
+ {
+ desired_end &= ~(seg->maxpagesize - 1);
+ relro_end &= ~(seg->maxpagesize - 1);
+ }
+ }
+ }
+
seg->base = desired_end;
return relro_end;
}
Disassembly of section .plt.got:
0+120 <func@plt>:
- +[a-f0-9]+: ff a3 fc ff ff ff jmp \*-0x4\(%ebx\)
+ +[a-f0-9]+: ff a3 78 f0 ff ff jmp \*-0xf88\(%ebx\)
+[a-f0-9]+: 66 90 xchg %ax,%ax
Disassembly of section .text:
0+128 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 120 <func@plt>
- +[a-f0-9]+: 8b 83 fc ff ff ff mov -0x4\(%ebx\),%eax
+ +[a-f0-9]+: 8b 83 78 f0 ff ff mov -0xf88\(%ebx\),%eax
#pass
.* <foo>:
.*: c0 10 00 00 0f 0c [ ]*larl %r1,2000 <bar>
.*: c0 10 00 00 0f 09 [ ]*larl %r1,2000 <bar>
-.*: c4 1d 00 00 0f 02 [ ]*lrl %r1,1ff8 <_GLOBAL_OFFSET_TABLE_\+0x28>
+.*: c4 1d 00 00 07 8a [ ]*lrl %r1,1108 <_GLOBAL_OFFSET_TABLE_\+0x28>
.*: 58 10 c0 28 [ ]*l %r1,40\(%r12\)
.*: e3 10 c0 28 00 58 [ ]*ly %r1,40\(%r12\)
-.*: c4 18 00 00 0e f6 [ ]*lgrl %r1,1ff0 <_GLOBAL_OFFSET_TABLE_\+0x20>
-.*: c4 18 00 00 0e ef [ ]*lgrl %r1,1fe8 <_GLOBAL_OFFSET_TABLE_\+0x18>
+.*: c4 18 00 00 07 7e [ ]*lgrl %r1,1100 <_GLOBAL_OFFSET_TABLE_\+0x20>
+.*: c4 18 00 00 07 77 [ ]*lgrl %r1,10f8 <_GLOBAL_OFFSET_TABLE_\+0x18>
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x000150 0x000150 R 0x200000
- LOAD 0x000b.8 0x0000000000200b.8 0x0000000000200b.8 0x0004.0 0x000c.8 RW 0x200000
- DYNAMIC 0x000b.0 0x0000000000200b.0 0x0000000000200b.0 0x0001.0 0x0001.0 RW 0x8
- GNU_RELRO 0x000b.8 0x0000000000200b.8 0x0000000000200b.8 0x0004.0 0x0004.8 R 0x1
+ LOAD 0x000150 0x0000000000200150 0x0000000000200150 0x0004b8 0x0016f0 RW 0x200000
+ DYNAMIC 0x0001a0 0x00000000002001a0 0x00000000002001a0 0x0001c0 0x0001c0 RW 0x8
+ GNU_RELRO 0x000150 0x0000000000200150 0x0000000000200150 0x0004b8 0x000eb0 R 0x1
Section to Segment mapping:
Segment Sections...
#target: x86_64-*-linux*
#...
- GNU_RELRO 0x04bd17 0x000000000024bd17 0x000000000024bd17 0x0022e9 0x0022e9 R 0x1
+ GNU_RELRO 0x04bcc7 0x000000000024bcc7 0x000000000024bcc7 0x002339 0x002339 R 0x1
#pass
Disassembly of section .plt:
0+1b0 <.plt>:
- +[a-f0-9]+: ff 35 32 0e 20 00 push 0x200e32\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+: ff 25 34 0e 20 00 jmp \*0x200e34\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ +[a-f0-9]+: ff 35 aa 01 20 00 push 0x2001aa\(%rip\) # 200360 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+: ff 25 ac 01 20 00 jmp \*0x2001ac\(%rip\) # 200368 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\)
Disassembly of section .plt.got:
0+1c0 <func@plt>:
- +[a-f0-9]+: ff 25 32 0e 20 00 jmp \*0x200e32\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: ff 25 aa 01 20 00 jmp \*0x2001aa\(%rip\) # 200370 <func>
+[a-f0-9]+: 66 90 xchg %ax,%ax
Disassembly of section .text:
0+1c8 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 1c0 <func@plt>
- +[a-f0-9]+: 48 8b 05 24 0e 20 00 mov 0x200e24\(%rip\),%rax # 200ff8 <func>
+ +[a-f0-9]+: 48 8b 05 9c 01 20 00 mov 0x20019c\(%rip\),%rax # 200370 <func>
#pass
Disassembly of section .plt.got:
0+1c0 <func@plt>:
- +[a-f0-9]+: ff 25 32 0e 20 00 jmp \*0x200e32\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: ff 25 72 01 20 00 jmp \*0x200172\(%rip\) # 200338 <func>
+[a-f0-9]+: 66 90 xchg %ax,%ax
Disassembly of section .text:
0+1c8 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 1c0 <func@plt>
- +[a-f0-9]+: 48 8b 05 24 0e 20 00 mov 0x200e24\(%rip\),%rax # 200ff8 <func>
+ +[a-f0-9]+: 48 8b 05 64 01 20 00 mov 0x200164\(%rip\),%rax # 200338 <func>
#pass
-#name: PR ld/20830 (.plt.got, -z now)
+#name: PR ld/20830 x32 (.plt.got, -z now)
#source: pr20830.s
#as: --x32
#ld: -z now -melf32_x86_64 -shared -z relro --ld-generated-unwind-info --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
Disassembly of section .plt:
0+120 <.plt>:
- +[a-f0-9]+: ff 35 c2 0e 20 00 push 0x200ec2\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+: ff 25 c4 0e 20 00 jmp \*0x200ec4\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ +[a-f0-9]+: ff 35 12 01 20 00 push 0x200112\(%rip\) # 200238 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+: ff 25 14 01 20 00 jmp \*0x200114\(%rip\) # 200240 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\)
Disassembly of section .plt.got:
0+130 <func@plt>:
- +[a-f0-9]+: ff 25 c2 0e 20 00 jmp \*0x200ec2\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: ff 25 12 01 20 00 jmp \*0x200112\(%rip\) # 200248 <func>
+[a-f0-9]+: 66 90 xchg %ax,%ax
Disassembly of section .text:
0+138 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 130 <func@plt>
- +[a-f0-9]+: 48 8b 05 b4 0e 20 00 mov 0x200eb4\(%rip\),%rax # 200ff8 <func>
+ +[a-f0-9]+: 48 8b 05 04 01 20 00 mov 0x200104\(%rip\),%rax # 200248 <func>
#pass
-#name: PR ld/20830 (.plt.got)
+#name: PR ld/20830 x32 (.plt.got)
#source: pr20830.s
#as: --x32
#ld: -melf32_x86_64 -shared -z relro --ld-generated-unwind-info --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
Disassembly of section .plt.got:
0+130 <func@plt>:
- +[a-f0-9]+: ff 25 c2 0e 20 00 jmp \*0x200ec2\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: ff 25 ea 00 20 00 jmp \*0x2000ea\(%rip\) # 200220 <func>
+[a-f0-9]+: 66 90 xchg %ax,%ax
Disassembly of section .text:
0+138 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 130 <func@plt>
- +[a-f0-9]+: 48 8b 05 b4 0e 20 00 mov 0x200eb4\(%rip\),%rax # 200ff8 <func>
+ +[a-f0-9]+: 48 8b 05 dc 00 20 00 mov 0x2000dc\(%rip\),%rax # 200220 <func>
#pass
Disassembly of section .plt:
0+1b0 <.plt>:
- +[a-f0-9]+: ff 35 32 0e 20 00 push 0x200e32\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+: f2 ff 25 33 0e 20 00 bnd jmp \*0x200e33\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ +[a-f0-9]+: ff 35 aa 01 20 00 push 0x2001aa\(%rip\) # 200360 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+: f2 ff 25 ab 01 20 00 bnd jmp \*0x2001ab\(%rip\) # 200368 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+: 0f 1f 00 nopl \(%rax\)
Disassembly of section .plt.got:
0+1c0 <func@plt>:
- +[a-f0-9]+: f2 ff 25 31 0e 20 00 bnd jmp \*0x200e31\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: f2 ff 25 a9 01 20 00 bnd jmp \*0x2001a9\(%rip\) # 200370 <func>
+[a-f0-9]+: 90 nop
Disassembly of section .text:
0+1c8 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 1c0 <func@plt>
- +[a-f0-9]+: 48 8b 05 24 0e 20 00 mov 0x200e24\(%rip\),%rax # 200ff8 <func>
+ +[a-f0-9]+: 48 8b 05 9c 01 20 00 mov 0x20019c\(%rip\),%rax # 200370 <func>
#pass
Disassembly of section .plt.got:
0+1c0 <func@plt>:
- +[a-f0-9]+: f2 ff 25 31 0e 20 00 bnd jmp \*0x200e31\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: f2 ff 25 71 01 20 00 bnd jmp \*0x200171\(%rip\) # 200338 <func>
+[a-f0-9]+: 90 nop
Disassembly of section .text:
0+1c8 <foo>:
+[a-f0-9]+: e8 f3 ff ff ff call 1c0 <func@plt>
- +[a-f0-9]+: 48 8b 05 24 0e 20 00 mov 0x200e24\(%rip\),%rax # 200ff8 <func>
+ +[a-f0-9]+: 48 8b 05 64 01 20 00 mov 0x200164\(%rip\),%rax # 200338 <func>
#pass
Disassembly of section .plt:
0+1b0 <.plt>:
- +[a-f0-9]+: ff 35 32 0e 20 00 push 0x200e32\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+: f2 ff 25 33 0e 20 00 bnd jmp \*0x200e33\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ +[a-f0-9]+: ff 35 b2 01 20 00 push 0x2001b2\(%rip\) # 200368 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+: f2 ff 25 b3 01 20 00 bnd jmp \*0x2001b3\(%rip\) # 200370 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+: 0f 1f 00 nopl \(%rax\)
+[a-f0-9]+: 68 00 00 00 00 push \$0x0
+[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmp 1b0 <func@plt-0x20>
Disassembly of section .plt.sec:
0+1d0 <func@plt>:
- +[a-f0-9]+: f2 ff 25 21 0e 20 00 bnd jmp \*0x200e21\(%rip\) # 200ff8 <func>
+ +[a-f0-9]+: f2 ff 25 a1 01 20 00 bnd jmp \*0x2001a1\(%rip\) # 200378 <func>
+[a-f0-9]+: 90 nop
Disassembly of section .text:
Disassembly of section .plt:
0+1f0 <.plt>:
- +[a-f0-9]+: ff 35 ea 0d 20 00 push 0x200dea\(%rip\) # 200fe0 <_GLOBAL_OFFSET_TABLE_\+0x8>
- +[a-f0-9]+: f2 ff 25 eb 0d 20 00 bnd jmp \*0x200deb\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x10>
+ +[a-f0-9]+: ff 35 12 02 20 00 push 0x200212\(%rip\) # 200408 <_GLOBAL_OFFSET_TABLE_\+0x8>
+ +[a-f0-9]+: f2 ff 25 13 02 20 00 bnd jmp \*0x200213\(%rip\) # 200410 <_GLOBAL_OFFSET_TABLE_\+0x10>
+[a-f0-9]+: 0f 1f 00 nopl \(%rax\)
+[a-f0-9]+: 68 00 00 00 00 push \$0x0
+[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmp 1f0 <func1@plt-0x20>
Disassembly of section .plt.got:
0+210 <func1@plt>:
- +[a-f0-9]+: f2 ff 25 e1 0d 20 00 bnd jmp \*0x200de1\(%rip\) # 200ff8 <func1>
+ +[a-f0-9]+: f2 ff 25 09 02 20 00 bnd jmp \*0x200209\(%rip\) # 200420 <func1>
+[a-f0-9]+: 90 nop
Disassembly of section .plt.sec:
0+218 <func2@plt>:
- +[a-f0-9]+: f2 ff 25 d1 0d 20 00 bnd jmp \*0x200dd1\(%rip\) # 200ff0 <func2>
+ +[a-f0-9]+: f2 ff 25 f9 01 20 00 bnd jmp \*0x2001f9\(%rip\) # 200418 <func2>
+[a-f0-9]+: 90 nop
Disassembly of section .text:
0+220 <foo>:
+[a-f0-9]+: e8 eb ff ff ff call 210 <func1@plt>
+[a-f0-9]+: e8 ee ff ff ff call 218 <func2@plt>
- +[a-f0-9]+: 48 8b 05 c7 0d 20 00 mov 0x200dc7\(%rip\),%rax # 200ff8 <func1>
+ +[a-f0-9]+: 48 8b 05 ef 01 20 00 mov 0x2001ef\(%rip\),%rax # 200420 <func1>
#pass
Disassembly of section .plt.got:
0+210 <func1@plt>:
- +[a-f0-9]+: f2 ff 25 e1 0d 20 00 bnd jmp \*0x200de1\(%rip\) # 200ff8 <func1>
+ +[a-f0-9]+: f2 ff 25 c9 01 20 00 bnd jmp \*0x2001c9\(%rip\) # 2003e0 <func1>
+[a-f0-9]+: 90 nop
Disassembly of section .plt.sec:
0+220 <foo>:
+[a-f0-9]+: e8 eb ff ff ff call 210 <func1@plt>
+[a-f0-9]+: e8 ee ff ff ff call 218 <func2@plt>
- +[a-f0-9]+: 48 8b 05 c7 0d 20 00 mov 0x200dc7\(%rip\),%rax # 200ff8 <func1>
+ +[a-f0-9]+: 48 8b 05 af 01 20 00 mov 0x2001af\(%rip\),%rax # 2003e0 <func1>
#pass