This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libc/19574] glibc should support building static PIE binaries


https://sourceware.org/bugzilla/show_bug.cgi?id=19574

--- Comment #27 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
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 "GNU C Library master sources".

The branch, hjl/pie/static has been created
        at  f7882894427b3d720892667418b5d97dc179c1e9 (commit)

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=f7882894427b3d720892667418b5d97dc179c1e9

commit f7882894427b3d720892667418b5d97dc179c1e9
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Sep 27 16:47:29 2017 -0700

    Add --enable-static-pie to build-many-glibcs.py

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=882a61c686b85cd1016c0909ca17cf508e307efc

commit 882a61c686b85cd1016c0909ca17cf508e307efc
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:13:54 2017 -0700

    sparc: Check PIC instead of SHARED in start.S

    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.

        * sysdeps/sparc/sparc32/start.S (_start): Check PIC instead of
        SHARED.
        * sysdeps/sparc/sparc64/start.S (_start): Likewise.

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=cbf62acd2955290b3bce6174e68b5a40afed5ed2

commit cbf62acd2955290b3bce6174e68b5a40afed5ed2
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:13:22 2017 -0700

    microblaze: Check PIC instead of SHARED in start.S

    Since start.o may be compiled as PIC, we should check PIC instead of
    SHARED.

        * sysdeps/microblaze/start.S (_start): Check PIC instead of SHARED.

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=c4e62403a180cc19785aab8b4a641fd5507dd156

commit c4e62403a180cc19785aab8b4a641fd5507dd156
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:55:18 2017 -0700

    sh: Update elf_machine_load_address for static PIE

    When --enable-static-pie is used to configure glibc, we need to use
    _dl_relocate_static_pie to compute load address in static PIE.

        * sysdeps/sh/dl-machine.h (elf_machine_load_address): Use
        _dl_relocate_static_pie instead of _dl_start to compute load
        address in static PIE.

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=4d7a746c98f130e78c33a8beb2d293d0312b53ad

commit 4d7a746c98f130e78c33a8beb2d293d0312b53ad
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:53:06 2017 -0700

    s390: Update elf_machine_load_address for static PIE

    When --enable-static-pie is used to configure glibc, we need to use
    _dl_relocate_static_pie to compute load address in static PIE.

        * sysdeps/s390/s390-32/dl-machine.h (elf_machine_dynamic): Use
        _dl_relocate_static_pie instead of _dl_start to compute load
        address in static PIE.
        * sysdeps/s390/s390-64/dl-machine.h (elf_machine_dynamic):
        Likewise.

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=44e46587845edfbfc58133037e1d90efca829cd6

commit 44e46587845edfbfc58133037e1d90efca829cd6
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Jul 17 08:17:32 2017 -0700

    Add --enable-static-pie configure option to build static PIE [BZ #19574]

    Static PIE extends address space layout randomization to static
    executables.  It provides additional security hardening benefits at
    the cost of some memory and performance.

    Dynamic linker, ld.so, is a standalone program which can be loaded at
    any address.  This patch adds a configure option, --enable-static-pie,
    to embed the part of ld.so in static executable to create static position
    independent executable (static PIE).  A static PIE is similar to static
    executable, but can be loaded at any address without help from a dynamic
    linker.  When --enable-static-pie is used to configure glibc, libc.a is
    built as PIE and all static executables, including tests, are built as
    static PIE.  The resulting libc.a can be used together with GCC 8 or
    above to build static PIE with the compiler option, -static-pie.  But
    GCC 8 isn't required to build glibc with --enable-static-pie.  Only GCC
    with PIE support is needed.  When an older GCC is used to build glibc
    with --enable-static-pie, proper input files are passed to linker to
    create static executables as static PIE, together with "-z text" to
    prevent dynamic relocations in read-only segments, which are not allowed
    in static PIE.

    The following changes are made for static PIE:

    1. Add a new function, _dl_relocate_static_pie, to:
       a. Get the run-time load address.
       b. Read the dynamic section.
       c. Perform dynamic relocations.
    Dynamic linker also performs these steps.  But static PIE doesn't load
    any shared objects.
    2. Call _dl_relocate_static_pie at entrance of LIBC_START_MAIN in
    libc.a.  crt1.o, which is used to create dynamic and non-PIE static
    executables, is updated to include a dummy _dl_relocate_static_pie.
    rcrt1.o is added to create static PIE, which will link in the real
    _dl_relocate_static_pie.  grcrt1.o is also added to create static PIE
    with -pg.  GCC 8 has been updated to support rcrt1.o and grcrt1.o for
    static PIE.

    Static PIE can work on all architectures which support PIE, provided:

    1. Target must support accessing of local functions without dynamic
    relocations, which is needed in start.S to call __libc_start_main with
    function addresses of __libc_csu_init, __libc_csu_fini and main.  All
    functions in static PIE are local functions.  If PIE start.S can't reach
    main () defined in a shared object, the code sequence:

        pass address of local_main to __libc_start_main
        ...

    local_main:
        tail call to main via PLT

    can be used.
    2. start.S is updated to check PIC instead SHARED for PIC code path and
    avoid dynamic relocation, when PIC is defined and SHARED isn't defined,
    to support static PIE.  Patches are submitted for aarch64, hppa, m68k,
    microblaze and sparc.
    3. All assembly codes are updated check PIC instead SHARED for PIC code
    path to avoid dynamic relocations in read-only sections.
    4. All assembly codes are updated check SHARED instead PIC for static
    symbol name.  A patch is submitted for tile.
    5. elf_machine_load_address in dl-machine.h are updated to support static
    PIE.  Patches are submitted for aarch64, s390 and sh.
    6. __brk works without TLS nor dynamic relocations in read-only section
    so that it can be used by __libc_setup_tls to initializes TLS in static
    PIE.

    NB: When glibc is built with GCC defaulted to PIE, libc.a is compiled
    with -fPIE, regardless if --enable-static-pie is used to configure glibc.
    When glibc is configured with --enable-static-pie, libc.a is compiled
    with -fPIE, regardless whether GCC defaults to PIE or not.  The same
    libc.a can be used to build both static executable and static PIE.
    There is no need for separate PIE copy of libc.a.

    On x86-64, the normal static sln:

       text        data     bss     dec     hex filename
     625425        8284    5456  639165   9c0bd elf/sln

    the static PIE sln:

       text        data     bss     dec     hex filename
     657626       20636    5392  683654   a6e86 elf/sln

    The code size is increased by 5% and the binary size is increased by 7%.

    Linker requirements to build glibc with --enable-static-pie:

    1. Linker supports --no-dynamic-linker to remove PT_INTERP segment from
    static PIE.
    2. Linker can create working static PIE.  The x86-64 linker needs the
    fix for

    https://sourceware.org/bugzilla/show_bug.cgi?id=21782

    The i386 linker needs to be able to convert "movl main@GOT(%ebx), %eax"
    to "leal main@GOTOFF(%ebx), %eax" if main is defined locally.

    Binutils 2.29 or above are OK for i686 and x86-64.  But linker status for
    other targets need to be verified.

    3. Linker should resolve undefined weak symbols to 0 in static PIE:

    https://sourceware.org/bugzilla/show_bug.cgi?id=22269

    4. Many ELF backend linkers incorrectly check bfd_link_pic for TLS
    relocations, which should check bfd_link_executable instead:

    https://sourceware.org/bugzilla/show_bug.cgi?id=22263

    Tested on aarch64, i686 and x86-64.

    Using GCC 7 and binutils master branch, build-many-glibcs.py with
    --enable-static-pie with all patches for static PIE applied have the
    following build successes:

    PASS: glibcs-aarch64_be-linux-gnu build
    PASS: glibcs-aarch64-linux-gnu build
    PASS: glibcs-armeb-linux-gnueabi-be8 build
    PASS: glibcs-armeb-linux-gnueabi build
    PASS: glibcs-armeb-linux-gnueabihf-be8 build
    PASS: glibcs-armeb-linux-gnueabihf build
    PASS: glibcs-arm-linux-gnueabi build
    PASS: glibcs-arm-linux-gnueabihf build
    PASS: glibcs-arm-linux-gnueabihf-v7a build
    PASS: glibcs-arm-linux-gnueabihf-v7a-disable-multi-arch build
    PASS: glibcs-m68k-linux-gnu build
    PASS: glibcs-microblazeel-linux-gnu build
    PASS: glibcs-microblaze-linux-gnu build
    PASS: glibcs-mips64el-linux-gnu-n32 build
    PASS: glibcs-mips64el-linux-gnu-n32-nan2008 build
    PASS: glibcs-mips64el-linux-gnu-n32-nan2008-soft build
    PASS: glibcs-mips64el-linux-gnu-n32-soft build
    PASS: glibcs-mips64el-linux-gnu-n64 build
    PASS: glibcs-mips64el-linux-gnu-n64-nan2008 build
    PASS: glibcs-mips64el-linux-gnu-n64-nan2008-soft build
    PASS: glibcs-mips64el-linux-gnu-n64-soft build
    PASS: glibcs-mips64-linux-gnu-n32 build
    PASS: glibcs-mips64-linux-gnu-n32-nan2008 build
    PASS: glibcs-mips64-linux-gnu-n32-nan2008-soft build
    PASS: glibcs-mips64-linux-gnu-n32-soft build
    PASS: glibcs-mips64-linux-gnu-n64 build
    PASS: glibcs-mips64-linux-gnu-n64-nan2008 build
    PASS: glibcs-mips64-linux-gnu-n64-nan2008-soft build
    PASS: glibcs-mips64-linux-gnu-n64-soft build
    PASS: glibcs-mipsel-linux-gnu build
    PASS: glibcs-mipsel-linux-gnu-nan2008 build
    PASS: glibcs-mipsel-linux-gnu-nan2008-soft build
    PASS: glibcs-mipsel-linux-gnu-soft build
    PASS: glibcs-mips-linux-gnu build
    PASS: glibcs-mips-linux-gnu-nan2008 build
    PASS: glibcs-mips-linux-gnu-nan2008-soft build
    PASS: glibcs-mips-linux-gnu-soft build
    PASS: glibcs-nios2-linux-gnu build
    PASS: glibcs-powerpc64le-linux-gnu build
    PASS: glibcs-powerpc64-linux-gnu build
    PASS: glibcs-tilegxbe-linux-gnu-32 build
    PASS: glibcs-tilegxbe-linux-gnu build
    PASS: glibcs-tilegx-linux-gnu-32 build
    PASS: glibcs-tilegx-linux-gnu build
    PASS: glibcs-tilepro-linux-gnu build

    and the following build failures:

    FAIL: glibcs-alpha-linux-gnu build

    elf/sln is failed to link due to:

    assertion fail bfd/elf64-alpha.c:4125

    This is caused by linker bug and/or non-PIC code in PIE libc.a.

    FAIL: glibcs-hppa-linux-gnu build

    elf/sln is failed to link due to:

    collect2: fatal error: ld terminated with signal 11 [Segmentation fault]

    https://sourceware.org/bugzilla/show_bug.cgi?id=22537

    FAIL: glibcs-ia64-linux-gnu build

    elf/sln is failed to link due to:

    collect2: fatal error: ld terminated with signal 11 [Segmentation fault]

    FAIL: glibcs-powerpc-linux-gnu build
    FAIL: glibcs-powerpc-linux-gnu-soft build
    FAIL: glibcs-powerpc-linux-gnuspe build
    FAIL: glibcs-powerpc-linux-gnuspe-e500v1 build

    elf/sln is failed to link due to:

    ld: read-only segment has dynamic relocations.

    This is caused by linker bug and/or non-PIC code in PIE libc.a.  See:

    https://sourceware.org/bugzilla/show_bug.cgi?id=22264

    FAIL: glibcs-powerpc-linux-gnu-power4 build

    elf/sln is failed to link due to:

    findlocale.c:96:(.text+0x22c): @local call to ifunc memchr

    This is caused by linker bug and/or non-PIC code in PIE libc.a.

    FAIL: glibcs-s390-linux-gnu build

    elf/sln is failed to link due to:

    collect2: fatal error: ld terminated with signal 11 [Segmentation fault],
core dumped

    assertion fail bfd/elflink.c:14299

    This is caused by linker bug and/or non-PIC code in PIE libc.a.

    FAIL: glibcs-sh3eb-linux-gnu build
    FAIL: glibcs-sh3-linux-gnu build
    FAIL: glibcs-sh4eb-linux-gnu build
    FAIL: glibcs-sh4eb-linux-gnu-soft build
    FAIL: glibcs-sh4-linux-gnu build
    FAIL: glibcs-sh4-linux-gnu-soft build

    elf/sln is failed to link due to:

    ld: read-only segment has dynamic relocations.

    This is caused by linker bug and/or non-PIC code in PIE libc.a.  See:

    https://sourceware.org/bugzilla/show_bug.cgi?id=22263

    Also TLS code sequence in SH assembly syscalls in glibc doesn't match TLS
    code sequence expected by ld:

    https://sourceware.org/bugzilla/show_bug.cgi?id=22270

    FAIL: glibcs-sparc64-linux-gnu build
    FAIL: glibcs-sparcv9-linux-gnu build
    FAIL: glibcs-tilegxbe-linux-gnu build
    FAIL: glibcs-tilegxbe-linux-gnu-32 build
    FAIL: glibcs-tilegx-linux-gnu build
    FAIL: glibcs-tilegx-linux-gnu-32 build
    FAIL: glibcs-tilepro-linux-gnu build

    elf/sln is failed to link due to:

    ld: read-only segment has dynamic relocations.

    This is caused by linker bug and/or non-PIC code in PIE libc.a.  See:

    https://sourceware.org/bugzilla/show_bug.cgi?id=22263

        [BZ #19574]
        * INSTALL: Regenerated.
        * Makeconfig (real-static-start-installed-name): New.
        (pic-default): Updated for --enable-static-pie.
        (pie-default): New for --enable-static-pie.
        (default-pie-ldflag): Likewise.
        (+link-static-before-libc): Replace $(DEFAULT-LDFLAGS-$(@F))
        with $(if $($(@F)-no-pie),$(no-pie-ldflag),$(default-pie-ldflag)).
        Replace $(static-start-installed-name) with
        $(real-static-start-installed-name).
        (+prectorT): Updated for --enable-static-pie.
        (+postctorT): Likewise.
        (CFLAGS-.o): Add $(pie-default).
        (CFLAGS-.op): Likewise.
        * NEWS: Mention --enable-static-pie.
        * config.h.in (ENABLE_STATIC_PIE): New.
        * configure.ac (--enable-static-pie): New configure option.
        (have-no-dynamic-linker): New LIBC_CONFIG_VAR.
        (have-static-pie): Likewise.
        Enable static PIE if linker supports --no-dynamic-linker.
        (ENABLE_STATIC_PIE): New AC_DEFINE.
        (enable-static-pie): New LIBC_CONFIG_VAR.
        * configure: Regenerated.
        * csu/Makefile (omit-deps): Add r$(start-installed-name) and
        gr$(start-installed-name) for --enable-static-pie.
        (extra-objs): Likewise.
        (install-lib): Likewise.
        (extra-objs): Add static-reloc.o and static-reloc.os
        ($(objpfx)$(start-installed-name)): Also depend on
        $(objpfx)static-reloc.o.
        ($(objpfx)r$(start-installed-name)): New.
        ($(objpfx)g$(start-installed-name)): Also depend on
        $(objpfx)static-reloc.os.
        ($(objpfx)gr$(start-installed-name)): New.
        * csu/libc-start.c (LIBC_START_MAIN): Call _dl_relocate_static_pie
        in libc.a.
        * csu/libc-tls.c (__libc_setup_tls): Add main_map->l_addr to
        initimage.
        * csu/static-reloc.c: New file.
        * elf/Makefile (routines): Add dl-reloc-static-pie.
        (elide-routines.os): Likewise.
        (DEFAULT-LDFLAGS-tst-tls1-static-non-pie): Removed.
        (tst-tls1-static-non-pie-no-pie): New.
        * elf/dl-reloc-static-pie.c: New file.
        * elf/dl-support.c (_dl_get_dl_main_map): New function.
        * elf/dynamic-link.h (ELF_DURING_STARTUP): Also check
        STATIC_PIE_BOOTSTRAP.
        * elf/get-dynamic-info.h (elf_get_dynamic_info): Likewise.
        * gmon/Makefile (tests): Add tst-gmon-static-pie.
        (tests-static): Likewise.
        (DEFAULT-LDFLAGS-tst-gmon-static): Removed.
        (tst-gmon-static-no-pie): New.
        (CFLAGS-tst-gmon-static-pie.c): Likewise.
        (CRT-tst-gmon-static-pie): Likewise.
        (tst-gmon-static-pie-ENV): Likewise.
        (tests-special): Likewise.
        ($(objpfx)tst-gmon-static-pie.out): Likewise.
        (clean-tst-gmon-static-pie-data): Likewise.
        ($(objpfx)tst-gmon-static-pie-gprof.out): Likewise.
        * gmon/tst-gmon-static-pie.c: New file.
        * manual/install.texi: Document --enable-static-pie.
        * sysdeps/generic/ldsodefs.h (_dl_relocate_static_pie): New.
        (_dl_get_dl_main_map): Likewise.
        * sysdeps/i386/configure.ac: Check if linker supports static PIE.
        * sysdeps/x86_64/configure.ac: Likewise.
        * sysdeps/i386/configure: Regenerated.
        * sysdeps/x86_64/configure: Likewise.
        * sysdeps/mips/Makefile (ASFLAGS-.o): Add $(pie-default).
        (ASFLAGS-.op): Likewise.

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8116d0e4a14422efda45fd5292db1a58b3ce6f98

commit 8116d0e4a14422efda45fd5292db1a58b3ce6f98
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Fri Nov 24 07:13:10 2017 -0800

    aarch64: fix start code for static pie

    with upcoming static pie patches there are three flavors of the crt startup
code:

    1) crt1.o used for non-pie static linking (executable has no relocs),
    2) Scrt1.o used for dynamic linking (dynamic linker relocates),
    3) rcrt1.o used for static pie linking (self relocation is needed)

    when crt1.o and rcrt1.o is built in the --enable-static-pie case -DPIC is
passed,
    when Scrt1.o is built then -DPIC -DSHARED is passed.

    (crt1.o gets a dummy _dl_relocate_static_pie that interposes the one in
    libc so no self-relocation is done in that case in __libc_start_main)

    the Scrt1.o code is position independent but it relies on GOT entries that
    need to be relocated which happens later and the static linker cannot relax
    the GOT loads, so rcrt1.o needs separate implementation.

    This implementation works with .text <= 4G files, which is fine, currently
    the toolchain does not support larger position independent executables.

    tests pass with ld/22269 and ld/22263 binutils bugs fixed.
    this patch is on top of master but assumes the static pie patches.

        * sysdeps/aarch64/start.S (_start): Handle PIC && !SHARED case.

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=adda173d26aad05529a82ff9997584e5541ae42e

commit adda173d26aad05529a82ff9997584e5541ae42e
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Dec 1 09:49:25 2017 -0800

    nios2: Don't use MIN in dl-machine.h

    MIN is used, but param.h may not be included, so expand its single use
    inline.

        * sysdeps/nios2/dl-machine.h (elf_machine_rela): Expand MIN.

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

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]