Enable unwind info in libc-start.c and backtrace.c

Message ID DB6PR0801MB2053DFC14FB872257FCA400F838B0@DB6PR0801MB2053.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Wilco Dijkstra Aug. 9, 2017, 11:46 a.m.
After feedback on https://sourceware.org/ml/libc-alpha/2017-07/msg01010.html
here is the updated patch:

Add unwind info to __libc_start_main so that unwinding continues one
extra level to _start.  Similarly add unwind info to backtrace.
Given many targets require this, do this in a general way and remove
-funwind-tables (or -fexceptions - which is identical in C) from several
target makefiles.

ChangeLog:
2017-08-09  Wilco Dijkstra  <wdijkstr@arm.com>

        * sysdeps/aarch64/Makefile: Build libc-start.c with -fexceptions.
        * csu/Makefile: Add -funwind-tables to libc-start.c.
        * debug/Makefile: Add -funwind-tables to backtrace.c.
        * sysdeps/aarch64/Makefile: Remove CFLAGS-backtrace.c.
        * sysdeps/arm/Makefile: Likewise.
        * sysdeps/i386/Makefile: Likewise.
        * sysdeps/m68k/Makefile: Likewise.
        * sysdeps/mips/Makefile: Likewise.
        * sysdeps/nios2/Makefile: Likewise.
        * sysdeps/sh/Makefile: Likewise.
        * sysdeps/sparc/Makefile: Likewise.
--

Comments

Carlos O'Donell Aug. 9, 2017, 12:45 p.m. | #1
On 08/09/2017 07:46 AM, Wilco Dijkstra wrote:
> After feedback on https://sourceware.org/ml/libc-alpha/2017-07/msg01010.html
> here is the updated patch:
> 
> Add unwind info to __libc_start_main so that unwinding continues one
> extra level to _start.  Similarly add unwind info to backtrace.
> Given many targets require this, do this in a general way and remove
> -funwind-tables (or -fexceptions - which is identical in C) from several
> target makefiles.
> 
> ChangeLog:
> 2017-08-09  Wilco Dijkstra  <wdijkstr@arm.com>
> 
>         * sysdeps/aarch64/Makefile: Build libc-start.c with -fexceptions.
>         * csu/Makefile: Add -funwind-tables to libc-start.c.
>         * debug/Makefile: Add -funwind-tables to backtrace.c.
>         * sysdeps/aarch64/Makefile: Remove CFLAGS-backtrace.c.
>         * sysdeps/arm/Makefile: Likewise.
>         * sysdeps/i386/Makefile: Likewise.
>         * sysdeps/m68k/Makefile: Likewise.
>         * sysdeps/mips/Makefile: Likewise.
>         * sysdeps/nios2/Makefile: Likewise.
>         * sysdeps/sh/Makefile: Likewise.
>         * sysdeps/sparc/Makefile: Likewise.

This looks god to me, but I'd like to know what machines you've tested on?

If you tested on aarch64, i386, and arm (v7), then I'd say you've done enough
to show it work on 64-bit and 32-bit for relevant machines.
Andreas Schwab Aug. 9, 2017, 1 p.m. | #2
On Aug 09 2017, Wilco Dijkstra <Wilco.Dijkstra@arm.com> wrote:

>         * sysdeps/aarch64/Makefile: Build libc-start.c with -fexceptions.

This is no longer part of the patch.

Andreas.
Wilco Dijkstra Sept. 14, 2017, 1:46 p.m. | #3
Carlos O'Donell wrote:

> This looks god to me, but I'd like to know what machines you've tested on?
>
> If you tested on aarch64, i386, and arm (v7), then I'd say you've done enough
> to show it work on 64-bit and 32-bit for relevant machines.

I tried it on Arm, AArch64 and x64. I can't get GLIBC to build for i386 or i686 as
whatever magic config I try for 32-bit x86 fails during build (it gets past the config
with a newly built 64-bit GCC and binutils but then gets confused despite -m32 flags).

Wilco
H.J. Lu Sept. 14, 2017, 1:52 p.m. | #4
On Thu, Sep 14, 2017 at 6:46 AM, Wilco Dijkstra <Wilco.Dijkstra@arm.com> wrote:
> Carlos O'Donell wrote:
>
>> This looks god to me, but I'd like to know what machines you've tested on?
>>
>> If you tested on aarch64, i386, and arm (v7), then I'd say you've done enough
>> to show it work on 64-bit and 32-bit for relevant machines.
>
> I tried it on Arm, AArch64 and x64. I can't get GLIBC to build for i386 or i686 as
> whatever magic config I try for 32-bit x86 fails during build (it gets past the config
> with a newly built 64-bit GCC and binutils but then gets confused despite -m32 flags).
>

I use

# CC="gcc -m32 -march=i686" CXX="g++ -m32 -march=i686"
/export/gnu/import/git/sources/glibc/configure --prefix=/usr
--target=i686-linux --build=i686-linux --host=i686-linux
--enable-hardcoded-path-in-tests

to configure glibc for i686 on Linux/x86-64.  It works fine.
Wilco Dijkstra Sept. 14, 2017, 2:57 p.m. | #5
H.J. Lu wrote:

> # CC="gcc -m32 -march=i686" CXX="g++ -m32 -march=i686"
> /export/gnu/import/git/sources/glibc/configure --prefix=/usr
> --target=i686-linux --build=i686-linux --host=i686-linux
> --enable-hardcoded-path-in-tests
>
> to configure glibc for i686 on Linux/x86-64.  It works fine.

Doing it exactly like that I get:

/work/install/binutils_x64/x86_64-linux-gnu/bin/ld: skipping incompatible /work/install/gcc_x64/lib/gcc/x86_64-linux-gnu/8.0.0/libgcc.a when searching for -lgcc
/work/install/binutils_x64/x86_64-linux-gnu/bin/ld: cannot find -lgcc

So it doesn't seem to be able to find a 32-bit libgcc although that GCC
supports -m32...

Wilco
H.J. Lu Sept. 14, 2017, 3:07 p.m. | #6
On Thu, Sep 14, 2017 at 7:57 AM, Wilco Dijkstra <Wilco.Dijkstra@arm.com> wrote:
> H.J. Lu wrote:
>
>> # CC="gcc -m32 -march=i686" CXX="g++ -m32 -march=i686"
>> /export/gnu/import/git/sources/glibc/configure --prefix=/usr
>> --target=i686-linux --build=i686-linux --host=i686-linux
>> --enable-hardcoded-path-in-tests
>>
>> to configure glibc for i686 on Linux/x86-64.  It works fine.
>
> Doing it exactly like that I get:
>
> /work/install/binutils_x64/x86_64-linux-gnu/bin/ld: skipping incompatible /work/install/gcc_x64/lib/gcc/x86_64-linux-gnu/8.0.0/libgcc.a when searching for -lgcc
> /work/install/binutils_x64/x86_64-linux-gnu/bin/ld: cannot find -lgcc
>
> So it doesn't seem to be able to find a 32-bit libgcc although that GCC
> supports -m32...

Please make sure that your GCC has 32-bit libgcc.a:

[hjl@gnu-6 i386]$  gcc -print-libgcc-file-name
/usr/lib/gcc/x86_64-redhat-linux/7/libgcc.a
[hjl@gnu-6 i386]$  gcc -m32 -print-libgcc-file-name
/usr/lib/gcc/x86_64-redhat-linux/7/32/libgcc.a
[hjl@gnu-6 i386]$
Joseph Myers Sept. 14, 2017, 3:12 p.m. | #7
On Thu, 14 Sep 2017, Wilco Dijkstra wrote:

> H.J. Lu wrote:
> 
> > # CC="gcc -m32 -march=i686" CXX="g++ -m32 -march=i686"
> > /export/gnu/import/git/sources/glibc/configure --prefix=/usr
> > --target=i686-linux --build=i686-linux --host=i686-linux
> > --enable-hardcoded-path-in-tests
> >
> > to configure glibc for i686 on Linux/x86-64.  It works fine.
> 
> Doing it exactly like that I get:
> 
> /work/install/binutils_x64/x86_64-linux-gnu/bin/ld: skipping incompatible /work/install/gcc_x64/lib/gcc/x86_64-linux-gnu/8.0.0/libgcc.a when searching for -lgcc
> /work/install/binutils_x64/x86_64-linux-gnu/bin/ld: cannot find -lgcc
> 
> So it doesn't seem to be able to find a 32-bit libgcc although that GCC
> supports -m32...

That suggests you have a --disable-multilib compiler.

You can use build-many-glibcs.py to build an x86_64 compiler that supports 
all of -m64, -m32, -mx32 (build-many-glibcs.py <dir> checkout; 
build-many-glibcs.py <dir> host-libraries; build-many-glibcs.py <dir> 
compilers x86_64-linux-gnu).  Having got that compiler (in 
<dir>/install/compilers/x86_64-linux-gnu) you can then use it for building 
/ testing glibc manually (including running execution tests in such a 
build - make sure to copy libstdc++ and libgcc_s shared libraries from the 
right multilib to the build directory before running make check) if you 
want.
Wilco Dijkstra Sept. 15, 2017, 1:26 p.m. | #8
Joseph Myers wrote:
> H.J. Lu wrote:
> 
> > # CC="gcc -m32 -march=i686" CXX="g++ -m32 -march=i686"
> > /export/gnu/import/git/sources/glibc/configure --prefix=/usr
> > --target=i686-linux --build=i686-linux --host=i686-linux
> > --enable-hardcoded-path-in-tests
> >
> > to configure glibc for i686 on Linux/x86-64.  It works fine.

> That suggests you have a --disable-multilib compiler.

Thanks, I've rebuilt everything and it now works perfectly.

So I can confirm x86 GLIBC unwinding also works as expected after
my patch.

OK for commit?

Wilco

Patch

diff --git a/csu/Makefile b/csu/Makefile
index 88646b6e8f068c09c5743fd908b08d15064294ee..490d0b0f3b63318381e59fc35038801f682d20a2 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -82,6 +82,9 @@  extra-objs += $(crtstuff:=.o)
 extra-objs += abi-note.o init.o
 asm-CPPFLAGS += -I$(objpfx).
 
+# Enable unwinding so backtrace unwinds to __libc_start_main
+CFLAGS-libc-start.c += -funwind-tables
+
 include ../Rules
 
 # Make these in the lib pass so they're available in time to link things with.
diff --git a/debug/Makefile b/debug/Makefile
index cd4975c35b70fe4c52fc6bbedb0f88179463af9c..620a0b71f5919d41cc5cb41d0943193d8e7b6ac5 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -59,7 +59,7 @@  static-only-routines := warning-nop stack_chk_fail_local
 CFLAGS-stack_chk_fail.c = $(no-stack-protector)
 CFLAGS-stack_chk_fail_local.c = $(no-stack-protector)
 
-CFLAGS-backtrace.c = -fno-omit-frame-pointer
+CFLAGS-backtrace.c = -fno-omit-frame-pointer -funwind-tables
 CFLAGS-sprintf_chk.c = $(libio-mtsafe)
 CFLAGS-snprintf_chk.c = $(libio-mtsafe)
 CFLAGS-vsprintf_chk.c = $(libio-mtsafe)
diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile
index 562c1373aebee6ffb4ff5c2071a23d007a8e07ba..5f3e20371accfb001de6dff342bb323b424324ca 100644
--- a/sysdeps/aarch64/Makefile
+++ b/sysdeps/aarch64/Makefile
@@ -1,9 +1,5 @@ 
 long-double-fcts = yes
 
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
-
 ifeq ($(subdir),elf)
 sysdep-dl-routines += tlsdesc dl-tlsdesc
 gen-as-const-headers += dl-link.sym
diff --git a/sysdeps/arm/Makefile b/sysdeps/arm/Makefile
index 2849aeda4238997975c5a8096da474e54da26932..ad2042b93a156867f586bedaaba4b120a93f676c 100644
--- a/sysdeps/arm/Makefile
+++ b/sysdeps/arm/Makefile
@@ -51,11 +51,6 @@  sysdep_routines += $(aeabi_constants) $(aeabi_routines)
 static-only-routines += $(aeabi_constants) aeabi_read_tp
 shared-only-routines += libc-aeabi_read_tp
 
-# In order for unwinding to fail when it falls out of main, we need a
-# cantunwind marker.  There's one in start.S.  To make sure we reach it, add
-# unwind tables for __libc_start_main.
-CFLAGS-libc-start.c += -fexceptions
-
 sysdep_routines += arm-unwind-resume
 shared-only-routines += arm-unwind-resume
 endif
@@ -64,10 +59,6 @@  ifeq ($(subdir),gmon)
 sysdep_routines += arm-mcount
 endif
 
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
-
 ifeq ($(subdir),rt)
 librt-sysdep_routines += rt-aeabi_unwind_cpp_pr1 rt-arm-unwind-resume
 librt-shared-only-routines += rt-aeabi_unwind_cpp_pr1 rt-arm-unwind-resume
diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile
index e30e1339f0554dd53be1ab881cb4df04de820792..a1500454e5a977415b8bd120326f3db104d18df2 100644
--- a/sysdeps/i386/Makefile
+++ b/sysdeps/i386/Makefile
@@ -19,10 +19,6 @@  CFLAGS-dl-load.c += -Wno-unused
 CFLAGS-dl-reloc.c += -Wno-unused
 endif
 
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -fexceptions
-endif
-
 # Most of the glibc routines don't ever call user defined callbacks
 # nor use any FPU or SSE* and as such don't need bigger %esp alignment
 # than 4 bytes.
diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile
index 26539fa01d38a5ba1260cb1fda153470513d2e29..b6910014f8fe75591026381d4b6a9e02301740d7 100644
--- a/sysdeps/m68k/Makefile
+++ b/sysdeps/m68k/Makefile
@@ -40,10 +40,6 @@  ifeq ($(subdir),setjmp)
 CFLAGS-setjmp.c := -fno-omit-frame-pointer
 endif
 
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
-
 ifeq ($(subdir),elf)
 CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
 endif
diff --git a/sysdeps/mips/Makefile b/sysdeps/mips/Makefile
index 7c1d77941ec154b460af9b2581cec7e82141acdf..fd891ddf09855adaac3d50f57ca9bd245fbc16e2 100644
--- a/sysdeps/mips/Makefile
+++ b/sysdeps/mips/Makefile
@@ -12,10 +12,6 @@  librt-sysdep_routines += rt-sysdep
 librt-shared-only-routines += rt-sysdep
 endif
 
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
-
 ifeq ($(subdir),csu)
 CPPFLAGS-crti.S += $(pic-ccflag)
 CPPFLAGS-crtn.S += $(pic-ccflag)
diff --git a/sysdeps/nios2/Makefile b/sysdeps/nios2/Makefile
index 75cab5e5b8fc04e916ced8e1b9c3a8ecc657b85d..9ceab11297a7d215e3a30d3ecf2210029a89a51b 100644
--- a/sysdeps/nios2/Makefile
+++ b/sysdeps/nios2/Makefile
@@ -29,7 +29,3 @@  endif
 ifeq ($(subdir),csu)
 gen-as-const-headers += tcb-offsets.sym
 endif
-
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
diff --git a/sysdeps/sh/Makefile b/sysdeps/sh/Makefile
index 0c6db9a9d41d56defb946fcc31e0767c7a853611..de8fa0bc0e81e8b7e1ef946b7106408cf4ac7cd1 100644
--- a/sysdeps/sh/Makefile
+++ b/sysdeps/sh/Makefile
@@ -5,7 +5,3 @@  endif
 ifeq ($(subdir),gmon)
 sysdep_routines += _mcount
 endif
-
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile
index 31aaeaed8f8e601b578908e13a6f99352346f753..3f0c0964002560f03817905f390821aef176d52c 100644
--- a/sysdeps/sparc/Makefile
+++ b/sysdeps/sparc/Makefile
@@ -3,10 +3,6 @@  long-double-fcts = yes
 
 pie-ccflag = -fPIE
 
-ifeq ($(subdir),debug)
-CFLAGS-backtrace.c += -funwind-tables
-endif
-
 ifeq ($(subdir),gmon)
 sysdep_routines += sparc-mcount
 endif