Bug 16322

Summary: ld fails to generate GNU_RELRO segment
Product: binutils Reporter: H.J. Lu <hjl.tools>
Component: ldAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: 2.25   
Target Milestone: ---   
Host: Target:
Build: Last reconfirmed:

Description H.J. Lu 2013-12-12 01:12:04 UTC
[hjl@gnu-6 relro-6]$ cat x.c
extern void f1 (void);
#if 1
void * const p1 __attribute__ ((aligned(32))) = &f1;
#else
void * const p1 = &f1;
#endif
[hjl@gnu-6 relro-6]$ make libx.so LD=ld
gcc -fuse-ld=gold -B./  -O2 -fPIC   -c -o x.o x.c
ld -shared --gc-sections -z relro -o libx.so x.o
[hjl@gnu-6 relro-6]$ readelf -SWl libx.so
There are 12 section headers, starting at offset 0x1078:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .hash             HASH            0000000000000120 000120 000030 04   A  2   0  8
  [ 2] .dynsym           DYNSYM          0000000000000150 000150 0000a8 18   A  3   2  8
  [ 3] .dynstr           STRTAB          00000000000001f8 0001f8 00001f 00   A  0   0  1
  [ 4] .rela.dyn         RELA            0000000000000218 000218 000018 18   A  2   0  8
  [ 5] .eh_frame         PROGBITS        0000000000000230 000230 000000 00   A  0   0  8
  [ 6] .data.rel.ro      PROGBITS        0000000000200f00 000f00 000008 00  WA  0   0 32
  [ 7] .dynamic          DYNAMIC         0000000000200f08 000f08 0000e0 10  WA  3   0  8
  [ 8] .comment          PROGBITS        0000000000000000 000fe8 00002c 01  MS  0   0  1
  [ 9] .shstrtab         STRTAB          0000000000000000 001014 000064 00      0   0  1
  [10] .symtab           SYMTAB          0000000000000000 001378 0001b0 18     11  16  8
  [11] .strtab           STRTAB          0000000000000000 001528 000042 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Elf file type is DYN (Shared object file)
Entry point 0x0
There are 4 program headers, starting at offset 64

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x000230 0x000230 R   0x200000
  LOAD           0x000f00 0x0000000000200f00 0x0000000000200f00 0x0000e8 0x0000e8 RW  0x200000
  DYNAMIC        0x000f08 0x0000000000200f08 0x0000000000200f08 0x0000e0 0x0000e0 RW  0x8
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10

 Section to Segment mapping:
  Segment Sections...
   00     .hash .dynsym .dynstr .rela.dyn 
   01     .data.rel.ro .dynamic 
   02     .dynamic 
   03     
[hjl@gnu-6 relro-6]$
Comment 1 H.J. Lu 2013-12-12 13:24:48 UTC
That is invalid since ld can't align .data.rel.ro section
to 32-byte and make p_vaddr + ->p_filesz for RELO segment
on page boundary without padding .data.rel.ro section.
Comment 2 H.J. Lu 2013-12-12 17:34:29 UTC
We can do better,
Comment 3 Sourceware Commits 2014-01-08 14:01:08 UTC
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gdb and binutils".

The branch, master has been updated
       via  43a8475ca01b676fb764aaed0c4ed1cc16fc3c87 (commit)
      from  221fd5d598e7dcf7b953150986a501b462b99891 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=43a8475ca01b676fb764aaed0c4ed1cc16fc3c87

commit 43a8475ca01b676fb764aaed0c4ed1cc16fc3c87
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Dec 12 10:35:47 2013 -0800

    Adjust LOAD segment to generate GNU_RELRO segment
    
    This patch fixes 2 GNU_RELRO segment bugs:
    
    1. lang_size_sections didn't properly align base to the maximum
    alignment power of sections between DATA_SEGMENT_ALIGN and
    DATA_SEGMENT_RELRO_END.
    2. ld failed to adjust LOAD segment to generate GNU_RELRO segment
    when LOAD segment doesn't fit GNU_RELRO segment.  This is
    
    https://sourceware.org/bugzilla/show_bug.cgi?id=14207
    
    We "fixed" ld by not generating GNU_RELRO segment.  This patch
    adjusts LOAD segment to generate GNU_RELRO segment.  It fixes
    PR ld/16322 and at the same time it also fixes PR binutils/16323
    since now we can adjust LOAD segment if it is too small.
    
    bfd/
    
    	PR ld/14207
    	PR ld/16322
    	PR binutils/16323
    	* elf.c (_bfd_elf_map_sections_to_segments): Don't check section
    	size for PT_GNU_RELRO segment.
    	(assign_file_positions_for_load_sections): If PT_LOAD segment
    	doesn't fit PT_GNU_RELRO segment, adjust its p_filesz and p_memsz.
    
    ld/
    
    	PR ld/14207
    	PR ld/16322
    	PR binutils/16323
    	* ldlang.c (lang_size_sections): Properly align RELRO base.
    
    ld/testsuite/
    
    	PR ld/14207
    	PR ld/16322
    	PR binutils/16323
    	* ld-elf/pr16322.d: New file.
    	* ld-elf/pr16322.s: Likewise.
    
    	* ld-x86-64/pr14207.d: Expect PT_GNU_RELRO segment.

-----------------------------------------------------------------------

Summary of changes:
 bfd/ChangeLog                    |   10 +++++++++
 bfd/elf.c                        |   41 +++++++++++++++++++++++++++++++++----
 ld/ChangeLog                     |    7 ++++++
 ld/ldlang.c                      |    3 +-
 ld/testsuite/ChangeLog           |   10 +++++++++
 ld/testsuite/ld-elf/pr16322.d    |    7 ++++++
 ld/testsuite/ld-elf/pr16322.s    |    6 +++++
 ld/testsuite/ld-x86-64/pr14207.d |   23 +++++++++++++++++---
 8 files changed, 97 insertions(+), 10 deletions(-)
 create mode 100644 ld/testsuite/ld-elf/pr16322.d
 create mode 100644 ld/testsuite/ld-elf/pr16322.s
Comment 4 H.J. Lu 2014-01-08 14:06:36 UTC
Fixed.
Comment 5 Sourceware Commits 2014-01-10 11:21:04 UTC
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gdb and binutils".

The branch, master has been updated
       via  eec2f3ed9f053653ed5d629eb50e08e3ee61e9bd (commit)
      from  a2cd8cfed14491303eb8338f90e206034c5a3fe2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eec2f3ed9f053653ed5d629eb50e08e3ee61e9bd

commit eec2f3ed9f053653ed5d629eb50e08e3ee61e9bd
Author: Alan Modra <amodra@gmail.com>
Date:   Fri Jan 10 21:11:46 2014 +1030

    Don't adjust LOAD segment to match GNU_RELRO segment
    
    Instead, fix Jakub's original code setting up the PR_GNU_RELRO header
    from the PT_LOAD header.
    
    	PR ld/14207
    	PR ld/16322
    	PR binutils/16323
    bfd/
    	* elf.c (assign_file_positions_for_load_sections): Revert last change.
    	(assign_file_positions_for_non_load_sections): When setting up
    	PT_GNU_RELRO header, don't require a corresponding PT_LOAD
    	header that completely covers the relro region.
    ld/
    	* ldlang.c (lang_size_sections): Remove unneeded RELRO base
    	adjust.  Tidy comments.
    	* ld.texinfo (DATA_SEGMENT_RELRO_END): Correct description.
    ld/testsuite/
    	* ld-x86-64/pr14207.d: Adjust

-----------------------------------------------------------------------

Summary of changes:
 bfd/ChangeLog                    |   10 ++++++++++
 bfd/elf.c                        |   37 -------------------------------------
 ld/ChangeLog                     |    9 +++++++++
 ld/ld.texinfo                    |    6 ++++--
 ld/ldlang.c                      |   21 +++++++++------------
 ld/testsuite/ChangeLog           |    4 ++++
 ld/testsuite/ld-x86-64/pr14207.d |    2 +-
 7 files changed, 37 insertions(+), 52 deletions(-)