Bug 14925

Summary: libunwind enabled gcc generates incompatible libgcc_s.so.1
Product: gcc Reporter: H.J. Lu <hjl.tools>
Component: targetAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED INVALID    
Severity: enhancement CC: gcc-bugs, schwab
Priority: P2    
Version: 3.4.1   
Target Milestone: ---   
See Also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78251
Host: ia64-unknown-linux-gnu Target: ia64-unknown-linux-gnu
Build: ia64-unknown-linux-gnu Known to work:
Known to fail: Last reconfirmed:

Description H.J. Lu 2004-04-12 16:49:00 UTC
When libunwind is installed on the system, the gcc configure
will enable it automatically by default. As the result, the new
libgcc_s.so.1 is very different and not backward compatible with
the previous libgcc_s.so.1. The new libgcc_s.so.1 depends on
libunwind.so. Many symbols used to defined in libgcc_s.so.1 are
now provided by libunwind.so and unversioned. Anything referencing
those symbols won't work now like:

/usr/lib/gcc-lib/ia64-redhat-linux/3.2.3/adalib//libgnat.so: undefined reference
to `_Unwind_GetRegionStart@GCC_3.0'
/usr/lib/gcc-lib/ia64-redhat-linux/3.2.3/adalib//libgnat.so: undefined reference
to `_Unwind_SetGR@GCC_3.0'
/usr/lib/gcc-lib/ia64-redhat-linux/3.2.3/adalib//libgnat.so: undefined reference
to `_Unwind_GetLanguageSpecificData@GCC_3.0'
/usr/lib/gcc-lib/ia64-redhat-linux/3.2.3/adalib//libgnat.so: undefined reference
to `_Unwind_GetIP@GCC_3.0'
/usr/lib/gcc-lib/ia64-redhat-linux/3.2.3/adalib//libgnat.so: undefined reference
to `_Unwind_GetGR@GCC_3.0'
/usr/lib/gcc-lib/ia64-redhat-linux/3.2.3/adalib//libgnat.so: undefined reference
to `_Unwind_SetIP@GCC_3.0' collect2: ld returned 1 exit status
gnatlink: cannot call /usr/bin/gcc
Comment 1 Andrew Pinski 2004-04-12 17:12:00 UTC
I do not think there is any way around this.  Either use libunwind or not use it, do not build one 
compiler with and then one without or the other way around.
Comment 2 H.J. Lu 2004-04-12 21:50:59 UTC
I don't think gcc 3.4.0 should enable libunwind by default before
binary compatibility issue is resolved.
Comment 3 H.J. Lu 2004-04-12 22:13:51 UTC
A patch is posted at

http://gcc.gnu.org/ml/gcc-patches/2004-04/msg00751.html
Comment 4 Mark Mitchell 2004-04-12 22:45:07 UTC
Until someone (Richard Henderson?) says that this is really a defect, I'm not
going to treat it as a showstopper.

There's a backwards compatible fix for 3.4.1 -- have the new libgcc define the
old, versioned symbols even when using libunwind.  Since there's a backwards
compatible fix later, I'm not worried now: any distributors using 3.4.0 directly
can use --disable-libunwind.
Comment 5 Andrew Pinski 2004-05-26 13:45:18 UTC
I think this was decided this is not a bug, as anything changes the ABI is really not a bug if it is more 
correct.
Comment 6 H.J. Lu 2004-07-08 07:49:58 UTC
It is a real gcc bug. We have been working on it. A proposal will be submitted
soon.
Comment 7 Andrew Pinski 2004-07-08 07:59:35 UTC
How can an ABI change be a GCC bug?
Comment 8 H.J. Lu 2004-07-08 15:13:01 UTC
The proposed fix will be backward binary compatible.
Comment 9 Andrew Pinski 2004-08-15 03:56:31 UTC
I see the email was posted and nothing came out of it, basically this bug is invalid.  Not because it 
would change the ABI but the different between using libunwind and not using it is an ABI difference 
and an known one which means that you should be care full when trying to mix the binaries so closing 
as invalid.
Comment 10 H.J. Lu 2004-08-19 19:03:18 UTC
An updated patch is posted at

http://gcc.gnu.org/ml/gcc-patches/2004-08/msg01398.html
Comment 11 H.J. Lu 2004-08-19 19:06:24 UTC
With the patch

http://gcc.gnu.org/ml/gcc-patches/2004-08/msg01398.html

applied, the ABI-compliant 3rd party libunwind can be used in gcc without causing
any binary incompatibility. libunwind 0.98 from David Mosberger is one of such
libraries.
Comment 12 H.J. Lu 2004-08-24 16:14:37 UTC
The draft of the ia64 unwind extension is at

http://www.kernel.org/pub/linux/devel/gcc/unwind/
Comment 13 Andrew Pinski 2004-08-31 05:29:49 UTC
Note again this is not a bug in GCC at all so closing as invalid.
Comment 14 CVS Commits 2004-09-04 00:15:53 UTC
Subject: Bug 14925

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	hjl@gcc.gnu.org	2004-09-04 00:15:43

Modified files:
	gcc            : ChangeLog Makefile.in config.gcc config.in 
	                 configure configure.ac gcc.c mklibgcc.in 
	                 unwind-dw2-fde-glibc.c unwind-dw2.c 
	gcc/config     : t-libunwind 
	gcc/config/ia64: t-glibc t-hpux unwind-ia64.c 
	gcc/doc        : install.texi 
Added files:
	gcc            : unwind-compat.c unwind-compat.h 
	                 unwind-dw2-fde-compat.c 
	gcc/config     : t-libunwind-elf 
	gcc/config/ia64: t-glibc-libunwind 

Log message:
	2004-09-03  H.J. Lu  <hongjiu.lu@intel.com>
	
	PR target/14925:
	Makefile.in (LIB2ADDEHSTATIC): New.
	(LIB2ADDEHSHARED): New.
	(LIBUNWIND): New.
	(LIBUNWINDDEP): New.
	(SHLIBUNWIND_LINK): New.
	(SHLIBUNWIND_INSTALL): New.
	(libgcc.mk): Pass LIB2ADDEHSTATIC, LIB2ADDEHSHARED, LIBUNWIND,
	LIBUNWINDDEP, SHLIBUNWIND_LINK and SHLIBUNWIND_INSTALL.
	(clean): Remove libunwind*
	(stage1-start): Remove and copy stage1/libunwind*.
	(stage2-start): Remove and copy stage2/libunwind*.
	(stage3-start): Remove and copy stage3/libunwind*.
	(stage4-start): Remove and copy stage4/libunwind*.
	(stageprofile-start): Remove and copy stageprofile/libunwind*.
	(stagefeedback-start): Remove and copy stagefeedback/libunwind*.
	
	* config.gcc (ia64*-*-linux*): Always add t-libunwind to
	tmake_file. Add t-libunwind-elf and ia64/t-glibc-libunwind to
	tmake_file if --with-system-libunwind isn't used.
	
	* config/ia64/t-glibc-libunwind: New file.
	* config/t-libunwind-elf: Likewise.
	* unwind-compat.c: Likewise.
	* unwind-compat.h: Likewise.
	* unwind-dw2-fde-compat.c: Likewise.
	
	* config/ia64/t-glibc (LIB2ADDEH): Updated.
	* config/ia64/t-hpux (T_CFLAGS): Add -DUSE_LIBUNWIND_EXCEPTIONS.
	
	* config/ia64/unwind-ia64.c: Include "unwind-compat.h". Define
	aliases if needed.
	* unwind-dw2-fde-glibc.c: Likewise.
	* unwind-dw2.c: Likewise.
	
	* config/t-libunwind (LIB2ADDEH): Updated.
	(LIB2ADDEHSTATIC): New.
	(T_CFLAGS): Add -DUSE_LIBUNWIND_EXCEPTIONS.
	(TARGET_LIBGCC2_CFLAGS): Set to -DUSE_GAS_SYMVER.
	
	* configure.ac: Change --enable-libunwind-exceptions to
	--with-system-libunwind. Don't define USE_LIBUNWIND_EXCEPTIONS.
	* configure: Regenerated.
	* config.in: Updated.
	
	* doc/install.texi (ia64-*-linux): Require libunwind 0.98 or
	above and mention --with-system-libunwind.
	(ia64-*-hpux*): Mention --enable-libunwind-exceptions is
	removed in gcc 3.4.3 and later.
	
	* gcc.c (init_spec): Add -lunwind to -lgcc_s if
	USE_LIBUNWIND_EXCEPTIONS is defined.
	
	* mklibgcc.in: Support libunwind.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-compat.c.diff?cvsroot=gcc&r1=NONE&r2=2.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-compat.h.diff?cvsroot=gcc&r1=NONE&r2=2.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-dw2-fde-compat.c.diff?cvsroot=gcc&r1=NONE&r2=2.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.5245&r2=2.5246
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/Makefile.in.diff?cvsroot=gcc&r1=1.1368&r2=1.1369
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?cvsroot=gcc&r1=1.487&r2=1.488
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.in.diff?cvsroot=gcc&r1=1.195&r2=1.196
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/configure.diff?cvsroot=gcc&r1=1.850&r2=1.851
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/configure.ac.diff?cvsroot=gcc&r1=2.61&r2=2.62
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/gcc.c.diff?cvsroot=gcc&r1=1.430&r2=1.431
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/mklibgcc.in.diff?cvsroot=gcc&r1=1.70&r2=1.71
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-dw2-fde-glibc.c.diff?cvsroot=gcc&r1=1.14&r2=1.15
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-dw2.c.diff?cvsroot=gcc&r1=1.44&r2=1.45
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/t-libunwind-elf.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/t-libunwind.diff?cvsroot=gcc&r1=1.5&r2=1.6
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/t-glibc-libunwind.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/t-glibc.diff?cvsroot=gcc&r1=1.3&r2=1.4
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/t-hpux.diff?cvsroot=gcc&r1=1.8&r2=1.9
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/unwind-ia64.c.diff?cvsroot=gcc&r1=1.25&r2=1.26
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/doc/install.texi.diff?cvsroot=gcc&r1=1.313&r2=1.314

Comment 15 CVS Commits 2004-09-08 15:16:25 UTC
Subject: Bug 14925

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_4-branch
Changes by:	hjl@gcc.gnu.org	2004-09-08 15:16:17

Modified files:
	gcc            : ChangeLog Makefile.in config.gcc config.in 
	                 configure.ac gcc.c mklibgcc.in 
	                 unwind-dw2-fde-glibc.c unwind-dw2.c 
	gcc/config     : t-libunwind 
	gcc/config/ia64: t-glibc t-hpux unwind-ia64.c 
	gcc/doc        : install.texi 
Added files:
	gcc            : unwind-compat.c unwind-compat.h 
	                 unwind-dw2-fde-compat.c 
	gcc/config     : t-libunwind-elf 
	gcc/config/ia64: t-glibc-libunwind 

Log message:
	2004-09-08  H.J. Lu  <hongjiu.lu@intel.com>
	
	PR target/14925:
	Makefile.in (LIB2ADDEHSTATIC): New.
	(LIB2ADDEHSHARED): New.
	(LIBUNWIND): New.
	(LIBUNWINDDEP): New.
	(SHLIBUNWIND_LINK): New.
	(SHLIBUNWIND_INSTALL): New.
	(libgcc.mk): Pass LIB2ADDEHSTATIC, LIB2ADDEHSHARED, LIBUNWIND,
	LIBUNWINDDEP, SHLIBUNWIND_LINK and SHLIBUNWIND_INSTALL.
	(clean): Remove libunwind*
	(stage1-start): Remove and copy stage1/libunwind*.
	(stage2-start): Remove and copy stage2/libunwind*.
	(stage3-start): Remove and copy stage3/libunwind*.
	(stage4-start): Remove and copy stage4/libunwind*.
	(stageprofile-start): Remove and copy stageprofile/libunwind*.
	(stagefeedback-start): Remove and copy stagefeedback/libunwind*.
	
	* config.gcc (ia64*-*-linux*): Always add t-libunwind to
	tmake_file. Add t-libunwind-elf and ia64/t-glibc-libunwind to
	tmake_file if --with-system-libunwind isn't used.
	
	* config/ia64/t-glibc-libunwind: New file.
	* config/t-libunwind-elf: Likewise.
	* unwind-compat.c: Likewise.
	* unwind-compat.h: Likewise.
	* unwind-dw2-fde-compat.c: Likewise.
	
	* config/ia64/t-glibc (LIB2ADDEH): Updated.
	* config/ia64/t-hpux (T_CFLAGS): Add -DUSE_LIBUNWIND_EXCEPTIONS.
	
	* config/ia64/unwind-ia64.c: Include "unwind-compat.h". Define
	aliases if needed.
	* unwind-dw2-fde-glibc.c: Likewise.
	* unwind-dw2.c: Likewise.
	
	* config/t-libunwind (LIB2ADDEH): Updated.
	(LIB2ADDEHSTATIC): New.
	(T_CFLAGS): Add -DUSE_LIBUNWIND_EXCEPTIONS.
	(TARGET_LIBGCC2_CFLAGS): Set to -DUSE_GAS_SYMVER.
	
	* configure.ac: Change --enable-libunwind-exceptions to
	--with-system-libunwind. Don't define USE_LIBUNWIND_EXCEPTIONS.
	* configure: Regenerated.
	* config.in: Updated.
	
	* doc/install.texi (ia64-*-linux): Require libunwind 0.98 or
	above and mention --with-system-libunwind.
	(ia64-*-hpux*): Mention --enable-libunwind-exceptions is
	removed in gcc 3.4.3 and later.
	
	* gcc.c (init_spec): Add -lunwind to -lgcc_s if
	USE_LIBUNWIND_EXCEPTIONS is defined.
	
	* mklibgcc.in: Support libunwind.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-compat.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=2.1.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-compat.h.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=2.1.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-dw2-fde-compat.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=2.1.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.612&r2=2.2326.2.613
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/Makefile.in.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.1223.2.17&r2=1.1223.2.18
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.420.2.14&r2=1.420.2.15
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.in.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.181.4.3&r2=1.181.4.4
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/configure.ac.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.6.2.15&r2=2.6.2.16
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/gcc.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.403.4.8&r2=1.403.4.9
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/mklibgcc.in.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.67.4.1&r2=1.67.4.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-dw2-fde-glibc.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.12&r2=1.12.6.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/unwind-dw2.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.40&r2=1.40.6.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/t-libunwind-elf.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/t-libunwind.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.5&r2=1.5.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/t-glibc-libunwind.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/t-glibc.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3&r2=1.3.84.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/t-hpux.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.8&r2=1.8.4.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/ia64/unwind-ia64.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.21.4.1&r2=1.21.4.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/doc/install.texi.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.248.4.25&r2=1.248.4.26