glibc_2.25: fix building for x86 with -Os (or -fno-omit-frame-pointer)
Glibc 2.25 fails to build for x86 when frame pointers are enabled (ie when optimised for size or when -fno-omit-frame-pointer is explicitly included in CFLAGS etc). Backport the upstream fix from glibc 2.26. https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3b33d6ed6096c1d20d05a650b06026d673f7399a (From OE-Core rev: 81ba29c7b9c872d9a9c2efe5f9f8fe6a492af813) Signed-off-by: Andre McCurdy <armccurdy@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
2c03e1984a
commit
3413d7ac24
|
@ -0,0 +1,268 @@
|
||||||
|
From 1ea003d4fccc4646fd1848a182405a1c7000ab18 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
Date: Sun, 8 Jan 2017 11:38:23 -0200
|
||||||
|
Subject: [PATCH 28/28] Rework -fno-omit-frame-pointer support on i386
|
||||||
|
|
||||||
|
Commit 6b1df8b27f fixed the -OS build issue on i386 (BZ#20729) by
|
||||||
|
expliciting disabling frame pointer (-fomit-frame-pointer) on the
|
||||||
|
faulty objects. Although it does fix the issue, it is a subpar
|
||||||
|
workaround that adds complexity in build process (a rule for each
|
||||||
|
object to add the required compiler option and pontentially more
|
||||||
|
rules for objects that call {INLINE,INTERNAL}_SYSCALL) and does not
|
||||||
|
allow the implementations to get all the possible debug/calltrack
|
||||||
|
information possible (used mainly in debuggers and performance
|
||||||
|
measurement tools).
|
||||||
|
|
||||||
|
This patch fixes it by adding an explicit configure check to see
|
||||||
|
if -fno-omit-frame-pointer is set and to act accordingly (set or
|
||||||
|
not OPTIMIZE_FOR_GCC_5). The make rules is simplified and only
|
||||||
|
one is required: to add libc-do-syscall on loader due mmap
|
||||||
|
(which will be empty anyway for default build with
|
||||||
|
-fomit-frame-pointer).
|
||||||
|
|
||||||
|
Checked on i386-linux-gnu with GCC 6.2.1 with CFLAGS sets as
|
||||||
|
'-Os', '-O2 -fno-omit-frame-pointer', and '-O2 -fomit-frame-pointer'.
|
||||||
|
For '-Os' the testsuite issues described by BZ#19463 and BZ#15105
|
||||||
|
still applied.
|
||||||
|
|
||||||
|
It fixes BZ #21029, although it is marked as duplicated of #20729
|
||||||
|
(I reopened to track this cleanup).
|
||||||
|
|
||||||
|
[BZ #21029]
|
||||||
|
* config.h.in [CAN_USE_REGISTER_ASM_EBP]: New define.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/Makefile
|
||||||
|
[$(subdir) = elf] (sysdep-dl-routines): Add libc-do-syscall.
|
||||||
|
(uses-6-syscall-arguments): Remove.
|
||||||
|
[$(subdir) = misc] (CFLAGS-epoll_pwait.o): Likewise.
|
||||||
|
[$(subdir) = misc] (CFLAGS-epoll_pwait.os): Likewise.
|
||||||
|
[$(subdir) = misc] (CFLAGS-mmap.o): Likewise.
|
||||||
|
[$(subdir) = misc] (CFLAGS-mmap.os): Likewise.
|
||||||
|
[$(subdir) = misc] (CFLAGS-mmap64.o): Likewise.
|
||||||
|
[$(subdir) = misc] (CFLAGS-mmap64.os): Likewise.
|
||||||
|
[$(subdir) = misc] (CFLAGS-pselect.o): Likewise.
|
||||||
|
[$(subdir) = misc] (cflags-pselect.o): Likewise.
|
||||||
|
[$(subdir) = misc] (cflags-pselect.os): Likewise.
|
||||||
|
[$(subdir) = misc] (cflags-rtld-mmap.os): Likewise.
|
||||||
|
[$(subdir) = sysvipc] (cflags-semtimedop.o): Likewise.
|
||||||
|
[$(subdir) = sysvipc] (cflags-semtimedop.os): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-posix_fadvise64.o): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-posix_fadvise64.os): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-posix_fallocate.o): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-posix_fallocate.os): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-posix_fallocate64.o): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-posix_fallocate64.os): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-sync_file_range.o): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-sync_file_range.os): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-fallocate.o): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-fallocate.os): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-fallocate64.o): Likewise.
|
||||||
|
[$(subdir) = io] (CFLAGS-fallocate64.os): Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrdlock.o):
|
||||||
|
Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrdlock.os):
|
||||||
|
Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrwlock.o):
|
||||||
|
Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-pthread_rwlock_timedrwlock.os):
|
||||||
|
Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-sem_wait.o): Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-sem_wait.os): Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-sem_timedwait.o): Likewise.
|
||||||
|
[$(subdir) = nptl] (CFLAGS-sem_timedwait.os): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/configure.ac: Add check if compiler allows
|
||||||
|
ebp on inline assembly.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/configure: Regenerate.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/sysdep.h (OPTIMIZE_FOR_GCC_5):
|
||||||
|
Set if CAN_USE_REGISTER_ASM_EBP is set.
|
||||||
|
(check_consistency): Likewise.
|
||||||
|
|
||||||
|
Upstream-Status: Backport
|
||||||
|
|
||||||
|
https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3b33d6ed6096c1d20d05a650b06026d673f7399a
|
||||||
|
|
||||||
|
Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
|
||||||
|
---
|
||||||
|
config.h.in | 4 ++++
|
||||||
|
sysdeps/unix/sysv/linux/i386/Makefile | 39 +------------------------------
|
||||||
|
sysdeps/unix/sysv/linux/i386/configure | 39 +++++++++++++++++++++++++++++++
|
||||||
|
sysdeps/unix/sysv/linux/i386/configure.ac | 17 ++++++++++++++
|
||||||
|
sysdeps/unix/sysv/linux/i386/sysdep.h | 6 ++---
|
||||||
|
5 files changed, 64 insertions(+), 41 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config.h.in b/config.h.in
|
||||||
|
index 7bfe923..fb2cc51 100644
|
||||||
|
--- a/config.h.in
|
||||||
|
+++ b/config.h.in
|
||||||
|
@@ -259,4 +259,8 @@
|
||||||
|
/* Build glibc with tunables support. */
|
||||||
|
#define HAVE_TUNABLES 0
|
||||||
|
|
||||||
|
+/* Some compiler options may now allow to use ebp in __asm__ (used mainly
|
||||||
|
+ in i386 6 argument syscall issue). */
|
||||||
|
+#define CAN_USE_REGISTER_ASM_EBP 0
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
|
||||||
|
index 9609752..6aac0df 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/i386/Makefile
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/i386/Makefile
|
||||||
|
@@ -1,47 +1,18 @@
|
||||||
|
# The default ABI is 32.
|
||||||
|
default-abi := 32
|
||||||
|
|
||||||
|
-# %ebp is used to pass the 6th argument to system calls, so these
|
||||||
|
-# system calls are incompatible with a frame pointer.
|
||||||
|
-uses-6-syscall-arguments = -fomit-frame-pointer
|
||||||
|
-
|
||||||
|
ifeq ($(subdir),misc)
|
||||||
|
sysdep_routines += ioperm iopl vm86
|
||||||
|
-CFLAGS-epoll_pwait.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-epoll_pwait.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-mmap.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-mmap.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-mmap64.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-mmap64.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-pselect.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-pselect.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-rtld-mmap.os += $(uses-6-syscall-arguments)
|
||||||
|
-endif
|
||||||
|
-
|
||||||
|
-ifeq ($(subdir),sysvipc)
|
||||||
|
-CFLAGS-semtimedop.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-semtimedop.os += $(uses-6-syscall-arguments)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),elf)
|
||||||
|
+sysdep-dl-routines += libc-do-syscall
|
||||||
|
sysdep-others += lddlibc4
|
||||||
|
install-bin += lddlibc4
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),io)
|
||||||
|
sysdep_routines += libc-do-syscall
|
||||||
|
-CFLAGS-posix_fadvise64.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-posix_fadvise64.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-posix_fallocate.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-posix_fallocate.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-posix_fallocate64.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-posix_fallocate64.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-sync_file_range.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-sync_file_range.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-fallocate.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-fallocate.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-fallocate64.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-fallocate64.os += $(uses-6-syscall-arguments)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),nptl)
|
||||||
|
@@ -61,14 +32,6 @@ ifeq ($(subdir),nptl)
|
||||||
|
# pull in __syscall_error routine
|
||||||
|
libpthread-routines += sysdep
|
||||||
|
libpthread-shared-only-routines += sysdep
|
||||||
|
-CFLAGS-pthread_rwlock_timedrdlock.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-pthread_rwlock_timedrdlock.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-pthread_rwlock_timedwrlock.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-pthread_rwlock_timedwrlock.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-sem_wait.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-sem_wait.os += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-sem_timedwait.o += $(uses-6-syscall-arguments)
|
||||||
|
-CFLAGS-sem_timedwait.os += $(uses-6-syscall-arguments)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),rt)
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/i386/configure b/sysdeps/unix/sysv/linux/i386/configure
|
||||||
|
index eb72659..ae2c356 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/i386/configure
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/i386/configure
|
||||||
|
@@ -3,5 +3,44 @@
|
||||||
|
|
||||||
|
arch_minimum_kernel=2.6.32
|
||||||
|
|
||||||
|
+# Check if CFLAGS allows compiler to use ebp register in inline assembly.
|
||||||
|
+
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler flags allows ebp in inline assembly" >&5
|
||||||
|
+$as_echo_n "checking if compiler flags allows ebp in inline assembly... " >&6; }
|
||||||
|
+if ${libc_cv_can_use_register_asm_ebp+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+
|
||||||
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+
|
||||||
|
+ void foo (int i)
|
||||||
|
+ {
|
||||||
|
+ register int reg asm ("ebp") = i;
|
||||||
|
+ asm ("# %0" : : "r" (reg));
|
||||||
|
+ }
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+
|
||||||
|
+ ;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
+ libc_cv_can_use_register_asm_ebp=yes
|
||||||
|
+else
|
||||||
|
+ libc_cv_can_use_register_asm_ebp=no
|
||||||
|
+fi
|
||||||
|
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_can_use_register_asm_ebp" >&5
|
||||||
|
+$as_echo "$libc_cv_can_use_register_asm_ebp" >&6; }
|
||||||
|
+if test $libc_cv_can_use_register_asm_ebp = yes; then
|
||||||
|
+ $as_echo "#define CAN_USE_REGISTER_ASM_EBP 1" >>confdefs.h
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
|
ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/i386/configure.ac b/sysdeps/unix/sysv/linux/i386/configure.ac
|
||||||
|
index 1a11da6..1cd632e 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/i386/configure.ac
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/i386/configure.ac
|
||||||
|
@@ -3,5 +3,22 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
||||||
|
|
||||||
|
arch_minimum_kernel=2.6.32
|
||||||
|
|
||||||
|
+# Check if CFLAGS allows compiler to use ebp register in inline assembly.
|
||||||
|
+AC_CACHE_CHECK([if compiler flags allows ebp in inline assembly],
|
||||||
|
+ libc_cv_can_use_register_asm_ebp, [
|
||||||
|
+AC_COMPILE_IFELSE(
|
||||||
|
+ [AC_LANG_PROGRAM([
|
||||||
|
+ void foo (int i)
|
||||||
|
+ {
|
||||||
|
+ register int reg asm ("ebp") = i;
|
||||||
|
+ asm ("# %0" : : "r" (reg));
|
||||||
|
+ }])],
|
||||||
|
+ [libc_cv_can_use_register_asm_ebp=yes],
|
||||||
|
+ [libc_cv_can_use_register_asm_ebp=no])
|
||||||
|
+])
|
||||||
|
+if test $libc_cv_can_use_register_asm_ebp = yes; then
|
||||||
|
+ AC_DEFINE(CAN_USE_REGISTER_ASM_EBP)
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
|
ldd_rewrite_script=sysdeps/unix/sysv/linux/ldd-rewrite.sed
|
||||||
|
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
|
||||||
|
index baf4642..449b23e 100644
|
||||||
|
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
|
||||||
|
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
|
||||||
|
@@ -44,9 +44,9 @@
|
||||||
|
/* Since GCC 5 and above can properly spill %ebx with PIC when needed,
|
||||||
|
we can inline syscalls with 6 arguments if GCC 5 or above is used
|
||||||
|
to compile glibc. Disable GCC 5 optimization when compiling for
|
||||||
|
- profiling since asm ("ebp") can't be used to put the 6th argument
|
||||||
|
- in %ebp for syscall. */
|
||||||
|
-#if __GNUC_PREREQ (5,0) && !defined PROF
|
||||||
|
+ profiling or when -fno-omit-frame-pointer is used since asm ("ebp")
|
||||||
|
+ can't be used to put the 6th argument in %ebp for syscall. */
|
||||||
|
+#if __GNUC_PREREQ (5,0) && !defined PROF && CAN_USE_REGISTER_ASM_EBP
|
||||||
|
# define OPTIMIZE_FOR_GCC_5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
--
|
||||||
|
1.9.1
|
||||||
|
|
|
@ -42,6 +42,7 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
|
||||||
file://0025-Define-DUMMY_LOCALE_T-if-not-defined.patch \
|
file://0025-Define-DUMMY_LOCALE_T-if-not-defined.patch \
|
||||||
file://0026-elf-dl-deps.c-Make-_dl_build_local_scope-breadth-fir.patch \
|
file://0026-elf-dl-deps.c-Make-_dl_build_local_scope-breadth-fir.patch \
|
||||||
file://0027-locale-fix-hard-coded-reference-to-gcc-E.patch \
|
file://0027-locale-fix-hard-coded-reference-to-gcc-E.patch \
|
||||||
|
file://0028-Rework-fno-omit-frame-pointer-support-on-i386.patch \
|
||||||
"
|
"
|
||||||
|
|
||||||
NATIVESDKFIXES ?= ""
|
NATIVESDKFIXES ?= ""
|
||||||
|
|
Loading…
Reference in New Issue