Subject: Re: how rpath is set in gcc build
To: None <>
From: Jason R Thorpe <>
List: tech-toolchain
Date: 08/31/2002 08:09:42
On Sat, Aug 31, 2002 at 09:54:43AM -0400, wrote:

 > then ldd indicates that the rpath isn't set right.  So my question is,
 > how can I cause the gcc package to pre-pend
 > /usr/pkg/gcc-2.95.3/lib/gcc-lib/alpha--netbsd/2.95.3 to the rpath during
 > linking?  For that matter, how do I check what g++ thinks it should be?  

This is something I've brought up with the GCC folks before.  Basically,
their response was "encoding the rpath is too inflexible; use".

...which is, of course, a bogus answer :-/

I have a patch to GCC-current (should apply to 3.2 and 3.3) ... it's a
quick hack which simply causes the compiler driver to pass a corresponding
-R for every -L it passes to the linker.  This fixed the problem I was
having with GCC-current.  But it clearly won't be accepted back by the
GCC maintainers .. so I have to figure out a different way to solve it.

(I don't think it can be solved with specs, because the code that passes
-L to the linker doesn't really use specs to do its work...)

Please file a NetBSD PR for this problem, and I'll tidy up my GCC-current
patch to send you ... you can then merge it into 2.95.3 in pkgsrc and
check it in as a stop-gap (sorry, I don't really have time to do this
bit myself).  I'll work with the GCC folks to get this fixed properly for
GCC 3.3 (hopefully!).

 > c++ -dumpspecs shows
 > *link:
 > -m elf64alpha   -e __start   %{O*:-O3} %{!O*:-O1}   %{assert*} %{R*}
 > %{shared:-shared}   %{!shared:     -dc -dp     %{!nostdlib:%{!r*:%{!e*:-e
 > __start}}}     %{
 > !static:       %{rdynamic:-export-dynamic}
 > %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}
 > %{static:-static}}
 > but i'm not quite sure how to interpret that or if this is even the right
 > thing to look at.

Heh, I can explain it, but let me rewrite it to make it more clear:

-m elf64alpha
	This is passed directly to the linker.

-e __start
	So is this.

	If "-O<anything>" was given to the compiler,
	pass -O3 to the linker.

	If "-O<anything>" was not given to the compiler,
	pass -O1 to the linker.

%{assert*} %{R*}
	If "-assert<anything>" or "-R<anything>" are given to the
	compiler, pass them directly to the linker.

	If "-shared" is given to the compiler, pass it on to the linker.

%{!shared: -dc -dp
      %{!e*:-e __start}}}
    %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}

...and I think you can figure out what these mean given the above
explanation.  (Sorry, I haven't even finished my first cup of coffee
yet this morning :-)

        -- Jason R. Thorpe <>