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?)
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
What has changed that gcc now needs to emit exception regions?
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.
Turned out it was a gcc bug after all. It was fixed yesterday. Closing this one as invalid.