mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
static-pie: Skip the empty PT_LOAD segment at offset 0 [BZ #32763]
As shown in
https://sourceware.org/bugzilla/show_bug.cgi?id=25237
linker may generate an empty PT_LOAD segments at offset 0:
Elf file type is EXEC (Executable file)
Entry point 0x4000e8
There are 3 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000000f0 0x00000000000000f0 R E 0x1000
LOAD 0x0000000000000000 0x0000000000410000 0x0000000000410000
0x0000000000000000 0x0000000000b5dce8 RW 0x10000
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
Section to Segment mapping:
Segment Sections...
00 .text
01 .bss
02
Skip the empty PT_LOAD segment at offset 0 to support such binaries.
This fixes BZ #32763.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Sam James <sam@gentoo.org>
(cherry picked from commit 596130591a
)
This commit is contained in:
parent
56609f8df1
commit
746ef8e939
4 changed files with 56 additions and 1 deletions
|
@ -1135,12 +1135,14 @@ tests += \
|
|||
tst-dlopen-pie \
|
||||
tst-dlopen-self-pie \
|
||||
tst-dlopen-tlsmodid-pie \
|
||||
tst-pie-bss \
|
||||
tst-pie1 \
|
||||
tst-pie2 \
|
||||
# tests
|
||||
tests-pie += \
|
||||
tst-dlopen-self-pie \
|
||||
tst-dlopen-tlsmodid-pie \
|
||||
tst-pie-bss \
|
||||
tst-pie1 \
|
||||
tst-pie2 \
|
||||
# tests-pie
|
||||
|
@ -1155,9 +1157,11 @@ LDFLAGS-tst-pie-address += $(load-address-ldflag)=$(pde-load-address)
|
|||
ifeq (yes,$(enable-static-pie))
|
||||
tests += \
|
||||
tst-pie-address-static \
|
||||
tst-pie-bss-static \
|
||||
# tests
|
||||
tests-static += \
|
||||
tst-pie-address-static \
|
||||
tst-pie-bss-static \
|
||||
# tests-static
|
||||
LDFLAGS-tst-pie-address-static += \
|
||||
$(load-address-ldflag)=$(pde-load-address)
|
||||
|
@ -2080,6 +2084,7 @@ $(objpfx)tst-array5-static-cmp.out: tst-array5-static.exp \
|
|||
|
||||
CFLAGS-tst-pie1.c += $(pie-ccflag)
|
||||
CFLAGS-tst-pie2.c += $(pie-ccflag)
|
||||
CFLAGS-tst-pie-bss.c += $(pie-ccflag)
|
||||
CFLAGS-tst-pie-address.c += $(pie-ccflag)
|
||||
|
||||
$(objpfx)tst-piemod1.so: $(libsupport)
|
||||
|
|
|
@ -51,7 +51,8 @@ _dl_relocate_static_pie (void)
|
|||
switch (ph->p_type)
|
||||
{
|
||||
case PT_LOAD:
|
||||
if (ph->p_offset == 0)
|
||||
/* Skip the empty PT_LOAD segment at offset 0. */
|
||||
if (ph->p_filesz != 0 && ph->p_offset == 0)
|
||||
file_p_vaddr = ph->p_vaddr;
|
||||
break;
|
||||
case PT_DYNAMIC:
|
||||
|
|
19
elf/tst-pie-bss-static.c
Normal file
19
elf/tst-pie-bss-static.c
Normal file
|
@ -0,0 +1,19 @@
|
|||
/* Test static PIE with an empty PT_LOAD segment at offset 0.
|
||||
Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "tst-pie-bss.c"
|
30
elf/tst-pie-bss.c
Normal file
30
elf/tst-pie-bss.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* Test PIE with an empty PT_LOAD segment at offset 0.
|
||||
Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
char bss[0xb5dce8] __attribute__ ((aligned (65536)));
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
printf ("Hello\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
Loading…
Add table
Reference in a new issue