Bug 81498

Summary: Support creating static PIE
Product: gcc Reporter: H.J. Lu <hjl.tools>
Component: driverAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P3    
Version: 8.0   
Target Milestone: 8.0   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed:
Bug Depends on: 81523    
Bug Blocks:    

Description H.J. Lu 2017-07-20 19:51:58 UTC
Glibc hjl/pie/static branch at

https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/hjl/pie/static

supports static PIE, which is similar to static executable, but can be loaded
at any address without a dynamic linker:

[hjl@gnu-6 elf]$ readelf -hl sln
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - GNU
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x8290
  Start of program headers:          64 (bytes into file)
  Start of section headers:          4532888 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         8
  Size of section headers:           64 (bytes)
  Number of section headers:         45
  Section header string table index: 44

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000099905 0x0000000000099905  R E    0x200000
  LOAD           0x000000000009a5a0 0x000000000029a5a0 0x000000000029a5a0
                 0x0000000000004d40 0x0000000000006230  RW     0x200000
  DYNAMIC        0x000000000009cd48 0x000000000029cd48 0x000000000029cd48
                 0x00000000000001a0 0x00000000000001a0  RW     0x8
  NOTE           0x0000000000000200 0x0000000000000200 0x0000000000000200
                 0x0000000000000044 0x0000000000000044  R      0x4
  TLS            0x000000000009a5a0 0x000000000029a5a0 0x000000000029a5a0
                 0x0000000000000020 0x0000000000000060  R      0x8
  GNU_EH_FRAME   0x000000000008ee18 0x000000000008ee18 0x000000000008ee18
                 0x00000000000018bc 0x00000000000018bc  R      0x4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     0x10
  GNU_RELRO      0x000000000009a5a0 0x000000000029a5a0 0x000000000029a5a0
                 0x0000000000002a60 0x0000000000002a60  R      0x1

 Section to Segment mapping:
  Segment Sections...
   00     .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .rela.dyn .rela.plt .init .plt .plt.got .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata .eh_frame_hdr .eh_frame .gcc_except_table 
   01     .tdata .init_array .fini_array .data.rel.ro .dynamic .got .got.plt .data __libc_subfreeres __libc_IO_vtables __libc_atexit __libc_thread_subfreeres .bss __libc_freeres_ptrs 
   02     .dynamic 
   03     .note.ABI-tag .note.gnu.build-id 
   04     .tdata .tbss 
   05     .eh_frame_hdr 
   06     
   07     .tdata .init_array .fini_array .data.rel.ro .dynamic .got 
[hjl@gnu-6 elf]$ sln
Usage: sln src dest|file

For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
[hjl@gnu-6 elf]$ 

To do that, we need to pass both -static and -pie as well as the PIE version
of crt*.o files to linker.
Comment 1 hjl@gcc.gnu.org 2017-09-12 16:31:00 UTC
Author: hjl
Date: Tue Sep 12 16:30:28 2017
New Revision: 252034

URL: https://gcc.gnu.org/viewcvs?rev=252034&root=gcc&view=rev
Log:
Add -static-pie to GCC driver to create static PIE

This patch adds -static-pie to GCC driver to create static PIE.  A static
position independent executable (PIE) is similar to static executable,
but can be loaded at any address without a dynamic linker.  All linker
input files must be compiled with -fpie or -fPIE and linker must support
--no-dynamic-linker to avoid linking with dynamic linker.  "-z text" is
also needed to prevent dynamic relocations in read-only segments.

	PR driver/81498
	* common.opt (-static-pie): New alias.
	(shared): Negate static-pie.
	(-no-pie): Update help text.
	(-pie): Likewise.
	(static-pie): New option.
	* config/gnu-user.h (GNU_USER_TARGET_STARTFILE_SPEC): Add
	-static-pie support.
	(GNU_USER_TARGET_ENDFILE_SPEC): Likewise.
	(LINK_EH_SPEC): Likewise.
	(LINK_GCC_C_SEQUENCE_SPEC): Likewise.
	* config/i386/gnu-user.h (GNU_USER_TARGET_LINK_SPEC): Likewise.
	* config/i386/gnu-user64.h (GNU_USER_TARGET_LINK_SPEC): Likewise.
	* gcc.c (LINK_COMMAND_SPEC): Likewise.
	(init_gcc_specs): Likewise.
	(init_spec): Likewise.
	(display_help): Update help message for -pie.
	* doc/invoke.texi: Update -pie, -no-pie and -static.  Document
	-static-pie.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/common.opt
    trunk/gcc/config/gnu-user.h
    trunk/gcc/config/i386/gnu-user.h
    trunk/gcc/config/i386/gnu-user64.h
    trunk/gcc/doc/invoke.texi
    trunk/gcc/gcc.c
Comment 2 H.J. Lu 2017-09-12 16:40:32 UTC
Fixed for GCC 8.