This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Avoid use of libgcc_s and libgcc_eh when building glibc


Hi!

On Wed, 30 May 2012 10:59:46 +0000 (UTC), "Joseph S. Myers" <joseph@codesourcery.com> wrote:
> 2012-05-30  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* Makeconfig [!+link] (+link-before-libc): New variable.
> 	[!+link] (+link-after-libc): Likewise.
> 	[!+link] (+link-tests): Likewise.
> 	[!+link] (+link): Define in terms of $(+link-before-libc) and
> 	$(+link-after-libc).
> 	[!+link-static] (+link-static-before-libc): New variable.
> 	[!+link-static] (+link-static-after-libc): Likewise.
> 	[!+link-static] (+link-static-tests): Likewise.
> 	[!+link-static] (+link-static): Define in terms of
> 	$(+link-static-before-libc) and $(+link-static-after-libc).
> 	[build-shared] (link-libc-before-gnulib): New variable.
> 	[build-shared] (link-libc-tests): Likewise.
> 	[build-shared] (link-libc): Define in terms of
> 	$(link-libc-before-gnulib).
> 	[!build-shared] (link-libc-tests): New variable.
> 	(link-libc-static-tests): New variable.
> 	[!gnulib] (gnulib-arch): New variable.
> 	[!gnulib] (gnulib-tests): Likewise.
> 	[!gnulib] (static-gnulib-arch): Likewise.
> 	[!gnulib] (static-gnulib-tests): Likewise.
> 	[!gnulib] (gnulib): Use $(gnulib-arch).  Do not use $(libgcc_eh).
> 	Define with "=" instead of ":=".
> 	[!gnulib] (static-gnulib): Use $(static-gnulib-arch).  Do not use
> 	-lgcc_eh $(libunwind).  Define with "=" instead of ":=".
> 	* Rules (binaries-all-notests): New variable.
> 	(binaries-all-tests): Likewise.
> 	(binaries-static-notests): Likewise.
> 	(binaries-static-tests): Likewise.
> 	(binaries-all): Define using $(binaries-all-notests) and
> 	$(binaries-all-tests).
> 	(binaries-static): Define using $(binaries-static-notests) and
> 	$(binaries-static-tests).
> 	(binaries-shared-tests): New variable.
> 	(binaries-shared-notests): Likewise.
> 	(binaries-shared): Remove variable.
> 	($(addprefix $(objpfx),$(binaries-shared-notests))): New rule.
> 	($(addprefix $(objpfx),$(binaries-shared-tests))): Likewise.
> 	($(addprefix $(objpfx),$(binaries-shared))): Remove rule.
> 	($(addprefix $(objpfx),$(binaries-static-notests))): New rule.
> 	($(addprefix $(objpfx),$(binaries-static-tests))): Likewise.
> 	($(addprefix $(objpfx),$(binaries-static))): Remove rule.
> 	* elf/Makefile (sln-modules): New variable.
> 	(extra-objs): Add $(sln-modules:=.o).
> 	(ldconfig-modules): Add static-stubs.
> 	($(objpfx)sln): Depend on $(sln-modules:%=$(objpfx)%.o).
> 	* elf/static-stubs.c: New file.

This became commit 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 (2012-07-03).

> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -415,9 +415,9 @@ LDFLAGS.so += $(hashstyle-LDFLAGS)
>  LDFLAGS-rtld += $(hashstyle-LDFLAGS)
>  endif
>  
> -# Command for linking programs with the C library.
> +# Commands for linking programs with the C library.
>  ifndef +link
> -+link = $(CC) -nostdlib -nostartfiles -o $@ \
> ++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
>  	      $(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
>  	      $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
>  	      $(addprefix $(csu-objpfx),$(start-installed-name)) \
> @@ -426,7 +426,10 @@ ifndef +link
>  						     $(start-installed-name))\
>  			   $(+preinit) $(link-extra-libs) \
>  			   $(common-objpfx)libc% $(+postinit),$^) \
> -	      $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
> +	      $(link-extra-libs)
> ++link-after-libc = $(+postctor) $(+postinit)
> ++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
> ++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
>  endif
>  # Command for linking PIE programs with the C library.
>  ifndef +link-pie
> @@ -443,7 +446,7 @@ ifndef +link-pie
>  endif
>  # Command for statically linking programs with the C library.
>  ifndef +link-static
> -+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
> ++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
>  	      $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F))  \
>  	      $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
>  	      $(+preinit) $(+prector) \
> @@ -451,7 +454,12 @@ ifndef +link-static
>  						     $(start-installed-name))\
>  			   $(+preinit) $(link-extra-libs-static) \
>  			   $(common-objpfx)libc% $(+postinit),$^) \
> -	      $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
> +	      $(link-extra-libs-static) $(link-libc-static)
> ++link-static-after-libc = $(+postctor) $(+postinit)
> ++link-static = $(+link-static-before-libc) $(link-libc-static) \
> +	       $(+link-static-after-libc)
> ++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
> +		     $(+link-static-after-libc)
>  endif
>  # Command for statically linking bounded-pointer programs with the C library.
>  ifndef +link-bounded
> @@ -475,10 +483,12 @@ ifeq (yes,$(build-shared))
>  # We need the versioned name of libc.so in the deps of $(others) et al
>  # so that the symlink to libc.so is created before anything tries to
>  # run the linked programs.
> -link-libc = -Wl,-rpath-link=$(rpath-link) \
> +link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
>  	    $(common-objpfx)libc.so$(libc.so-version) \
>  	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) \
> -	    $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib)
> +	    $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed)
> +link-libc = $(link-libc-before-gnulib) $(gnulib)
> +link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
>  # This is how to find at build-time things that will be installed there.
>  rpath-dirs = math elf dlfcn nss nis rt resolv crypt
>  rpath-link = \
> @@ -488,6 +498,7 @@ else
>  nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
>  resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
>  link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
> +link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
>  endif
>  endif
>  
> @@ -513,8 +524,43 @@ endif
>  
>  # The static libraries.
>  link-libc-static = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib) -Wl,--end-group
> +link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib-tests) -Wl,--end-group
>  link-libc-bounded = $(common-objpfx)libc_b.a $(gnulib) $(common-objpfx)libc_b.a

As made apparent with Joseph's recent (and appropriate) commit
d173d12e77c2ba9c46717353891f817333ce4995 ÂDon't include link-libc-static
in +link-static-before-libc. (see
<http://news.gmane.org/find-root.php?message_id=%3CPine.LNX.4.64.1210102027320.26853@digraph.polyomino.org.uk%3E>),
we need to override link-libc-static-tests for GNU Hurd as done with
link-libc-static in sysdeps/mach/hurd/Makefile.

For example, for csu/tst-empty until recently we had:

    gcc-4.6 -nostdlib -nostartfiles -static [-o tst-empty crt0 crti crtbegin tst-empty.o] -Wl,-\( [...]/libc.a [...]/mach/libmachuser.a [...]/hurd/libhurduser.a -lgcc  -Wl,-\) -Wl,--start-group [...]/libc.a -lgcc -lgcc_eh  -Wl,--end-group [crtend crtn]

After d173d12e77c2ba9c46717353891f817333ce4995, we got:

    gcc-4.6 -nostdlib -nostartfiles -static [-o tst-empty crt0 crti crtbegin tst-empty.o] -Wl,--start-group [...]/libc.a -lgcc -lgcc_eh  -Wl,--end-group [crtend crtn]
    [...]/libc.a(check_fds.o): In function `_hurd_critical_section_unlock':
    [...]/csu/../hurd/hurd/signal.h:242: undefined reference to `__msg_sig_post'
    [...]/libc.a(dl-load.o): In function `_hurd_tls_init':
    [...]/elf/../sysdeps/mach/hurd/i386/tls.h:73: undefined reference to `__i386_set_gdt'
    [...]

With the following patch, we againt get:

    gcc-4.6 -nostdlib -nostartfiles -static [-o tst-empty crt0 crti crtbegin tst-empty.o] -Wl,--start-group [...]/libc.a [...]/mach/libmachuser.a [...]/hurd/libhurduser.a -lgcc -lgcc_eh  -Wl,--end-group [crtend crtn]

..., which does link and seems reasonable to me (final tests still
running), but I'd like Joseph/Roland to confirm this is the correct
approach.

diff --git sysdeps/mach/hurd/Makefile sysdeps/mach/hurd/Makefile
index 107eaaf..ed77903 100644
--- sysdeps/mach/hurd/Makefile
+++ sysdeps/mach/hurd/Makefile
@@ -167,11 +167,15 @@ $(objpfx)librtld.map: $(rpcuserlibs:.so=_pic.a)
 CFLAGS-dl-load.c = -DEXTERNAL_MAP_FROM_FD
 endif
 
-# We need these libs to link static programs in the libc source tree, too.
-link-libc-static := -Wl,-\( \
+# Override the generic Makeconfig values so we link against the RPC libs.
+link-libc-static := -Wl,--start-group \
 		    $(patsubst %,$(common-objpfx)%.a,\
 			       libc mach/libmachuser hurd/libhurduser) \
-		    $(static-gnulib) -Wl,-\)
+		    $(static-gnulib) -Wl,--end-group
+link-libc-static-tests := -Wl,--start-group \
+		    $(patsubst %,$(common-objpfx)%.a,\
+			       libc mach/libmachuser hurd/libhurduser) \
+		    $(static-gnulib-tests) -Wl,--end-group

 ifeq ($(subdir),csu)
 

The new comment, by the way, is verbatim from Roland's 1998-08-18 ;-)
ChangeLog snippet when sysdeps/mach/hurd/Makefile:link-libc-static was
added, and I consider it to better describe what these overrides are
needed for.


GrÃÃe,
 Thomas

Attachment: pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]