This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Should ld consider -rpath '$ORIGIN' when finding dependencies?
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- Cc: Binutils <binutils at sourceware dot org>
- Date: Thu, 2 May 2013 13:04:52 -0700
- Subject: Re: Should ld consider -rpath '$ORIGIN' when finding dependencies?
- References: <CAH6eHdSMJ+CZ2GX_oUBHo6V18UvXoNd4W52PWcSV69uWrOzE+g at mail dot gmail dot com>
On Thu, May 2, 2013 at 12:29 PM, Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
> Consider this case (reproducable with the attached Makefile)
>
> echo 'int bar(); int main() { return bar(); }' > main.c
> echo 'int foo(); int bar() { return foo(); }' > bar.c
> echo 'int i; int foo() { return i; }' > foo.c
> cc -shared -Wl,-h,libfoo.so -fPIC foo.c -L. '-Wl,-rpath,$ORIGIN' -o libfoo.so
> cc -shared -Wl,-h,libbar.so -fPIC bar.c -L. '-Wl,-rpath,$ORIGIN' -lfoo
> -o libbar.so
> cc main.c -L. '-Wl,-rpath,$ORIGIN' -lbar -o main
> /usr/bin/ld: warning: libfoo.so, needed by ./libbar.so, not found (try
> using -rpath or -rpath-link)
> ./libbar.so: undefined reference to `foo'
> collect2: error: ld returned 1 exit status
> make: *** [main] Error 1
>
> libbar.so depends on libfoo.so, so when linking main to libbar.so the
> linker checks for libfoo.so, but fails.
>
> If I replace '-Wl,-rpath,$ORIGIN' with -Wl,-rpath,$PWD it works (using
> the attached Makefile that can be done with "make RPATH=$PWD") but
> that puts the wrong RPATH in the executable.
>
> If I add -Wl,-rpath-link,. it works.
>
> If I use Gold it works.
>
> So is this a ld bug, or just a difference between bfd and gold?
>
> I expected this to work given that ./libbar.so contains
> DT_RPATH=$ORIGIN and ./main is being given DT_RPATH=$ORIGIN too, both
> of which would allow finding ./libfoo.so at runtime, so I expect it to
> link successfully.
Since the build directory layout is independent of the run-time directory
layout, checking $ORIGIN may not always work at build time.
BTW, gold doesn't check undefined symbols in libbar.so.
--
H.J.