Bug 13411 - glibc fails to build with gcc 4.7
Summary: glibc fails to build with gcc 4.7
Status: RESOLVED INVALID
Alias: None
Product: glibc
Classification: Unclassified
Component: libc (show other bugs)
Version: 2.14
: P2 normal
Target Milestone: ---
Assignee: Ulrich Drepper
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-11-15 15:22 UTC by Michael Matz
Modified: 2014-06-27 11:35 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Matz 2011-11-15 15:22:23 UTC
This is also http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51117 .
gcc can emit calls to _Unwind_Resume for files compiled with -fexceptions,
new GCCs do this more often than earlier.  This currently leads to a linking
failure due to symbols defined twice:

cc   -nostdlib -nostartfiles -r -o /var/tmp/glibc-build/libc_pic.os \
 -Wl,-d -Wl,--whole-archive /var/tmp/glibc-build/libc_pic.a -o
/var/tmp/glibc-build/libc_pic.os
gcc   -nostdlib -nostartfiles -r -o /var/tmp/glibc-build/elf/librtld.map.o
'-Wl,-(' /var/tmp/glibc-build/elf/dl-allobjs.os /var/tmp/glibc-build/libc_
pic.a -lgcc '-Wl,-)' -Wl,-Map,/var/tmp/glibc-build/elf/librtld.mapT
/var/tmp/glibc-build/libc_pic.a(dl-addr.os): In function `_dl_addr_inside_object':
/var/tmp/glibc/elf/dl-addr.c:155: multiple definition of `_dl_addr_inside_object'
/var/tmp/glibc-build/elf/dl-allobjs.os:/var/tmp/glibc/elf/dl-open.c:673: first
defined here

The problem is that dl-addr.so is included in the link, due to this
symbol requirement chain:

dl-allobjs.os (_Unwind_Resume)
unwind-resume.os (__GI___libc_fatal)
libc_fatal.os (__GI___backtrace_symbols_fd)
backtracesymfd.os (__GI__dl_addr)
dl-addr.os

Somehow this chains needs to be broken by either providing one of these
symbols from dl-allobjs.os already, or by not compiling the respective files
with -fexceptions.

I'm not sure why they are compiled with -fexceptions, -fasynchronous-unwind-tables ought to be enough to make
unwinding through these routines work (it's related to cancellation points,
right?)
Comment 1 Michael Matz 2011-11-15 15:48:12 UTC
This patch (removing some -fexceptions, but retaining the unwind tables)
lets me build current git glibc without adverse effects on the testsuite:

diff --git a/elf/Makefile b/elf/Makefile
index f20f52d..3fe9f06 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -126,8 +126,8 @@ distribute  := rtld-Rules \
                   tst-initorder.c \
                   tst-initorder2.c

-CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
-CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-dl-runtime.c = -fasynchronous-unwind-tables
+CFLAGS-dl-lookup.c = -fasynchronous-unwind-tables
 CFLAGS-dl-iterate-phdr.c = $(uses-callbacks)

 include ../Makeconfig
diff --git a/io/Makefile b/io/Makefile
index 0f3b555..c905823 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -76,7 +76,7 @@ distribute    := ftwtest-sh

 include ../Rules

-CFLAGS-fcntl.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-fcntl.c = -fasynchronous-unwind-tables
 CFLAGS-poll.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-ppoll.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-lockf.c = -fexceptions
Comment 2 Andreas Schwab 2011-11-17 08:40:50 UTC
What has changed that gcc now needs to emit exception regions?
Comment 3 Michael Matz 2011-11-17 15:15:01 UTC
Since r179618 GCC uses cleanup regions to implement proper tracking of
points where scopes are left.  Under -fexceptions this includes exception
edges leading from possibly throwing calls to outside the containing scope.
Comment 4 Octoploid 2011-12-14 10:48:19 UTC
Turned out it was a gcc bug after all. It was fixed yesterday.
Closing this one as invalid.