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 #11 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  1798eb01da55411ce2c74ad0241801c03a1b67e6 (commit)

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

commit 1798eb01da55411ce2c74ad0241801c03a1b67e6
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=92709e13be16565c049fae273e480bf6080537ac

commit 92709e13be16565c049fae273e480bf6080537ac
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=02371ebc45799726f0cd61539859a89a5a92f168

commit 02371ebc45799726f0cd61539859a89a5a92f168
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=70223be575626b16969241ea2b869f8d9659f2d4

commit 70223be575626b16969241ea2b869f8d9659f2d4
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:12:52 2017 -0700

    m68k: Check PIC instead of SHARED in start.S

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

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

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

commit 99dd76116c3d50007bec9d0e12540de8865a6676
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:12:28 2017 -0700

    hppa: Check PIC instead of SHARED in start.S

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

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

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

commit 51e266da208f90754a236154479295e9408790dd
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 16:11:02 2017 -0700

    aarch64: Check PIC instead of SHARED in start.S

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

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

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

commit 62b05f154471fd11e08303e0380e0118873760ab
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=088b6db3931fe144b34ee206f319069b2eb5fffe

commit 088b6db3931fe144b34ee206f319069b2eb5fffe
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=5694e48f4572d5c74aad3c6f1bc404f71ee287e9

commit 5694e48f4572d5c74aad3c6f1bc404f71ee287e9
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:46:26 2017 -0700

    m68k: 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/m68k/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=e1664641e0807239bbcccd460e174a558f6c7cbc

commit e1664641e0807239bbcccd460e174a558f6c7cbc
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Sep 28 14:36:33 2017 -0700

    aarch64: 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/aarch64/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=83e95a0f4d5450816b968d04f846465caa6d511b

commit 83e95a0f4d5450816b968d04f846465caa6d511b
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]

    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.  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 allowed in static PIE.

    crt1.o, which is used to create dynamic and non-PIE static executables,
    is updated to include a dummy _dl_relocate_static_pie.  Pcrt1.o is added
    to create static PIE, which will link in the real _dl_relocate_static_pie.
    gPcrt1.o is also added to create static PIE with -pg.

    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 statice PIE are local functions.  If PIE start.S can't
    reach main () defined in a shared object, the code sequence:

        pass addess 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, m68k, s390 and sh.

    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 wether 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.

    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 i686 and x86-64.

    Build results of build-many-glibcs.py with --enable-static-pie with all
    patches for static PIE applied are

    PASS: glibcs-aarch64_be-linux-gnu build
    PASS: glibcs-aarch64-linux-gnu build
    PASS: glibcs-armeb-linux-gnueabi build
    PASS: glibcs-armeb-linux-gnueabi-be8 build
    PASS: glibcs-armeb-linux-gnueabihf build
    PASS: glibcs-armeb-linux-gnueabihf-be8 build
    PASS: glibcs-arm-linux-gnueabi build
    PASS: glibcs-arm-linux-gnueabihf build
    PASS: glibcs-hppa-linux-gnu build
    PASS: glibcs-i486-linux-gnu build
    PASS: glibcs-i586-linux-gnu build
    PASS: glibcs-i686-linux-gnu build
    PASS: glibcs-i686-linux-gnu-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-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-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-nios2-linux-gnu build
    PASS: glibcs-powerpc64le-linux-gnu build
    PASS: glibcs-powerpc64-linux-gnu build
    PASS: glibcs-s390x-linux-gnu build
    PASS: glibcs-x86_64-linux-gnu build
    PASS: glibcs-x86_64-linux-gnu-disable-multi-arch build
    PASS: glibcs-x86_64-linux-gnu-x32 build

    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-ia64-linux-gnu build

    elf/sln is failed to link due to:

    libc.a(sched_yield.o): non-pic code with imm relocation against dynamic
symbol `_dl_sysinfo'

    This is caused by non-PIC version of DO_CALL macro in ia64 sysdep.h.  PIE
    libc.a should use PIC version of DO_CALL, except during startup in static
    PIE.  An ia64 startup.h, similar to i386 startup.h, is needed to handle
    this.

    FAIL: glibcs-mips64el-linux-gnu-n32 build
    FAIL: glibcs-mips64el-linux-gnu-n32-nan2008 build
    FAIL: glibcs-mips64el-linux-gnu-n32-nan2008-soft build
    FAIL: glibcs-mips64el-linux-gnu-n32-soft build
    FAIL: glibcs-mips64-linux-gnu-n32 build
    FAIL: glibcs-mips64-linux-gnu-n32-nan2008 build
    FAIL: glibcs-mips64-linux-gnu-n32-nan2008-soft build
    FAIL: glibcs-mips64-linux-gnu-n32-soft build
    FAIL: glibcs-mipsel-linux-gnu build
    FAIL: glibcs-mipsel-linux-gnu-nan2008 build
    FAIL: glibcs-mipsel-linux-gnu-nan2008-soft build
    FAIL: glibcs-mipsel-linux-gnu-soft build
    FAIL: glibcs-mips-linux-gnu build
    FAIL: glibcs-mips-linux-gnu-nan2008 build
    FAIL: glibcs-mips-linux-gnu-nan2008-soft build
    FAIL: glibcs-mips-linux-gnu-soft build

    elf/sln is failed to link due to:

    crt1.o: relocation R_MIPS_HI16 against `_gp' can not be used when making a
shared object; recompile with -fPIC

    This is caused by linker bug and/or non-PIC code in crt1.o.

    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:14242

    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 (static-start-installed-name): Add the `P' prefix
        for --enable-static-pie.
        (pic-default): Updated for --enable-static-pie.
        (pie-default): New for --enable-static-pie.
        (default-pie-ldflag): Likewise.
        (+link-static-before-libc): Use the first of $(DEFAULT-LDFLAGS-$(@F))
        and $(default-pie-ldflag).
        (+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 P$(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)P$(start-installed-name)): New.
        ($(objpfx)g$(start-installed-name)): Also depend on
        $(objpfx)static-reloc.os.
        * 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.
        * 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.
        (CFLAGS-tst-gmon-static-pie.c): New.
        (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.
        * 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.

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

commit 75d3ab88fa26a4576c6cbf1610f493caeaf1136c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Oct 12 05:25:23 2017 -0700

    Add a test for profiling static executable

    The function, main, is added to profiling output of static executable
    which must link against gcrt1.o.

        * Makeconfig (+link-static-before-libc): Use the first of
        $(CRT-$(@F)) and $(csu-objpfx)$(static-start-installed-name).
        * gmon/Makefile (tests): Add tst-gmon-static.
        (tests-static): Likewise.
        (CFLAGS-tst-gmon-static.c): New.
        (CRT-tst-gmon-static): Likewise.
        (DEFAULT-LDFLAGS-tst-gmon-static): Likewise.
        (tst-gmon-static-ENV): Likewise.
        (tests-special): Likewise.
        ($(objpfx)tst-gmon-static.out): Likewise.
        (clean-tst-gmon-static-data): Likewise.
        ($(objpfx)tst-gmon-static-gprof.out): Likewise.
        * gmon/tst-gmon-static-gprof.sh: New file.
        * gmon/tst-gmon-static.c: Likewise.

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

-- 
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]