public inbox for libc-ports@sourceware.org
 help / color / mirror / Atom feed
From: Roland McGrath <roland@hack.frob.com>
To: "Joseph S. Myers" <joseph@codesourcery.com>
Cc: <libc-alpha@sourceware.org>,    <libc-ports@sourceware.org>
Subject: Re: Link extra-libs consistently with libc and ld.so
Date: Fri, 17 May 2013 20:24:00 -0000	[thread overview]
Message-ID: <20130517202428.B17DA2C0BE@topped-with-meat.com> (raw)
In-Reply-To: Joseph S. Myers's message of  Tuesday, 14 May 2013 00:32:44 +0000 <Pine.LNX.4.64.1305140032090.10338@digraph.polyomino.org.uk>

> * In Makerules I link with ld.so in the form
>   $(common-objpfx)elf/ld.so.  Other versions used in removed code
>   include $(elf-objpfx)$(rtld-installed-name) and $(elfobjdir)/ld.so.
>   Which is the best form to use in glibc makefiles?

elfobjdir and elf-objpfx are redundant.  We should consolidate on just one
or the other.  I don't think it matters which.  For linking, using ld.so
makes sense.  There is no need to use $(rtld-installed-name).

> * Some libraries need to link with the internal linkobj/libc.so,
>   rather than the normal libc.so, because of use of obsolete RPC
>   interfaces.  To support this, the rule in Makerules allows
>   $($(@F)-libc) to be used instead of the default
>   $(common-objpfx)libc.so.

What bad things would happen if we just always used linkobj/libc.so for
linking?

>   But a previous arrangement where
>   dependencies were generated for every library listed in $(services)
>   in nis/Makefile and nss/Makefile has been replaced by one where a
>   variable for each library is set separately (libnss_nis.so-libc,
>   libnss_nisplus.so-libc etc.) - is there a good way, without unduly
>   increasing complexity, to set such variables for everything in
>   $(services) without the repetition of the list of elements of
>   $(services)?

I can't come up with a decent way to do that.  But there are different
things you could do instead.  Instead of $(@F)-libc you could use a
constant-named variable, let's say libc-for-link.  Then you could get this
to expand differently for those targets in one of two ways:

Makerules: 
	libc-for-link = $(common-objpfx)libc.so

a) nis/Makefile:
	include ../Rules
	...
	standard-libc-for-link := $(libc-for-link)
	libc-for-link = $(if $(filter $(services),$(@F)),$(libnss-libc),$(standard-libc-for-link))

b) nis/Makefile:
	# Target-specific variable setting:
	$(services:%=$(objpfx)libnss_%.so): libc-for-link = $(libnss-libc)

The latter seems nicer.  We used to do more hacks like the former, but
nowadays we require a version of make that supports target-specific
variables anyway (and I think they may be used elsewhere in libc now).

> diff --git a/Makerules b/Makerules
> index d88bb62..c7a4720 100644
> --- a/Makerules
> +++ b/Makerules
> @@ -432,13 +432,29 @@ map-file = $(firstword $($(@F:.so=-map)) \
>  load-map-file = $(map-file:%=-Wl,--version-script=%)
>  endif
>  
> +# Compiler arguments to use to link a shared object with libc and
> +# ld.so.  This is intended to be as similar as possible to a default
> +# link with an installed libc.
> +link-libc-args = -Wl,--start-group \
> +		 $(if $($(@F)-libc),$($(@F)-libc),$(common-objpfx)libc.so) \
> +		 $(common-objpfx)libc_nonshared.a \
> +		 $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) \
> +		 -Wl,--end-group

Given the stated intent, perhaps an approach more likely to ensure it's
followed would be to generate a linker script with a rule sharing most of
its logic with the $(inst_libdir)/libc.so rule.  If that uses file names
without leading slash and -L$(common-objdir) before it, then I think it
will pick up the right builddir files.

>  build-module-helper-objlist = \
>  	$(patsubst %_pic.a,$(whole-archive) %_pic.a $(no-whole-archive),\
> -		   $(filter-out %.lds $(map-file) $(+preinit) $(+postinit),$^))
> +		   $(filter-out %.lds $(map-file) $(+preinit) $(+postinit) \
> +				$(if $($(@F)-no-libc-filter),,\
> +				     $(link-libc-deps)),$^))

Probably better done with:

$(common-objpfx)libc.so: link-libc-deps = # empty, with comment why

You said just, "Tested."  Does that mean you tested that all the object
came out completely unchanged from before the patch?


Thanks,
Roland

  parent reply	other threads:[~2013-05-17 20:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-09  0:22 Joseph S. Myers
2013-05-10  0:01 ` David Holsgrove
2013-05-14  0:32 ` Joseph S. Myers
2013-05-14  1:12   ` Roland McGrath
2013-05-17 20:24   ` Roland McGrath [this message]
2013-05-17 21:36     ` Joseph S. Myers
2013-05-17 21:42       ` Roland McGrath
2013-05-17 22:56         ` Joseph S. Myers
2013-05-17 23:12           ` Roland McGrath
2013-05-17 23:19     ` Joseph S. Myers
2013-05-28 23:58       ` Roland McGrath

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130517202428.B17DA2C0BE@topped-with-meat.com \
    --to=roland@hack.frob.com \
    --cc=joseph@codesourcery.com \
    --cc=libc-alpha@sourceware.org \
    --cc=libc-ports@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).