* Spurious undefined reference error?
@ 2012-12-20 19:22 Dan Kegel
2012-12-20 19:48 ` Dan Kegel
0 siblings, 1 reply; 5+ messages in thread
From: Dan Kegel @ 2012-12-20 19:22 UTC (permalink / raw)
To: binutils
The command (sanitized)
g++ -Wl,--verbose -v -pthread videos.C -Wl,-rpath,/opt/foo/bar/lib
-L/opt/foo/bar/lib \
-lxxx3 -lxxx6++ -llxxx7++ -lxxx6 -lxxx7 ../xxx8/xxx8.a -o videos
fails for me with
found libxxx6++.so at /opt/foo/bar/lib/libxxx6++.so
/usr/local/bin/ld: /opt/foo/bar/lib/libxxx3.so: undefined reference to
symbol 'foo::xxx6::bletch() const'
/usr/local/bin/ld: note: 'foo::xxx6::bletch() const' is defined in DSO
/opt/foo/bar/lib/libxxx6++.so so try adding it to the linker command
line
The commandline
g++ -Wl,--verbose -v -pthread videos.C -Wl,-rpath,/opt/foo/bar/lib
-L/opt/foo/bar/lib \
-lxxx3 -lxxx6++ -llxxx7++ -lxxx6 -lxxx7 ../xxx8/xxx8.a
/opt/foo/bar/lib/libxxx6++.so -o videos
works.
Why, if it was able to find the library, can't it use it without an
absolute path?
ld --version says 2.22; this is the stock linker on ubuntu 12.04 x86-64.
(Building a fresh binutils-2.23 from source in /usr/local doesn't seem
to help.... probably because even /usr/local/bin/ld --version still
says 2.22 then, so evidently it's not that easy to replace binutils.
A clue on how to gather more info would be appreciated.)
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Spurious undefined reference error?
2012-12-20 19:22 Spurious undefined reference error? Dan Kegel
@ 2012-12-20 19:48 ` Dan Kegel
2012-12-20 20:00 ` H.J. Lu
0 siblings, 1 reply; 5+ messages in thread
From: Dan Kegel @ 2012-12-20 19:48 UTC (permalink / raw)
To: binutils
On Thu, Dec 20, 2012 at 11:22 AM, Dan Kegel <dank@kegel.com> wrote:
>(Building a fresh binutils-2.23 from source in /usr/local doesn't seem
>to help.... probably because even /usr/local/bin/ld --version still
>says 2.22
Logging in again, I see that now ld --version says
GNU ld (GNU Binutils) 2.23.0.20121106
so I must have had a path problem. The new linker still doesn't help.
The problem was not present on ubuntu 10.04, where ld --version said
GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303
I guess I can now try a regression search.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Spurious undefined reference error?
2012-12-20 19:48 ` Dan Kegel
@ 2012-12-20 20:00 ` H.J. Lu
2012-12-20 23:19 ` Dan Kegel
0 siblings, 1 reply; 5+ messages in thread
From: H.J. Lu @ 2012-12-20 20:00 UTC (permalink / raw)
To: Dan Kegel; +Cc: binutils
On Thu, Dec 20, 2012 at 11:47 AM, Dan Kegel <dank@kegel.com> wrote:
> On Thu, Dec 20, 2012 at 11:22 AM, Dan Kegel <dank@kegel.com> wrote:
>>(Building a fresh binutils-2.23 from source in /usr/local doesn't seem
>>to help.... probably because even /usr/local/bin/ld --version still
>>says 2.22
>
> Logging in again, I see that now ld --version says
> GNU ld (GNU Binutils) 2.23.0.20121106
> so I must have had a path problem. The new linker still doesn't help.
>
> The problem was not present on ubuntu 10.04, where ld --version said
> GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303
>
> I guess I can now try a regression search.
I think Ubuntu changed linker command-line options passed from GCC
driver. Please compare the linker command-line options
--
H.J.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Spurious undefined reference error?
2012-12-20 20:00 ` H.J. Lu
@ 2012-12-20 23:19 ` Dan Kegel
2013-01-08 6:10 ` Alan Modra
0 siblings, 1 reply; 5+ messages in thread
From: Dan Kegel @ 2012-12-20 23:19 UTC (permalink / raw)
To: H.J. Lu; +Cc: binutils
On Thu, Dec 20, 2012 at 12:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> The problem was not present on ubuntu 10.04
>
> I think Ubuntu changed linker command-line options passed from GCC
> driver. Please compare the linker command-line options
On ubuntu 12.04, the extra options
--no-add-needed --as-needed
appear on the collect2 commandline.
Adding -Wl,--no-add-needed -Wl,--as-needed to the g++ commandline on
ubuntu 10.04 replicates the link failure on the previously working
system.
Adding -Wl,--no-as-needed on ubuntu 12.04 works around the problem.
On 10.04, 'readelf -d /opt/foo/bar/lib/libxxx3.so | grep NEEDED' showed
0x0000000000000001 (NEEDED) Shared library: [libxxx6++.so.2]
On 12.04, it didn't.
Adding the needed dependency in the Makefile for libxxx3
caused the NEEDED flag to appear, but that didn't seem solve the
linking problem,
even though from the doc for --as-needed, I would have thought it would.
( see thread http://sourceware.org/ml/binutils/2009-01/msg00413.html )
I'd kind of like to not need to pass --no-as-needed. I suppose the
next step is a small test case.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Spurious undefined reference error?
2012-12-20 23:19 ` Dan Kegel
@ 2013-01-08 6:10 ` Alan Modra
0 siblings, 0 replies; 5+ messages in thread
From: Alan Modra @ 2013-01-08 6:10 UTC (permalink / raw)
To: Dan Kegel; +Cc: H.J. Lu, binutils
On Thu, Dec 20, 2012 at 03:19:25PM -0800, Dan Kegel wrote:
> On Thu, Dec 20, 2012 at 12:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> >> The problem was not present on ubuntu 10.04
> >
> > I think Ubuntu changed linker command-line options passed from GCC
> > driver. Please compare the linker command-line options
>
> On ubuntu 12.04, the extra options
> --no-add-needed --as-needed
> appear on the collect2 commandline.
>
> Adding -Wl,--no-add-needed -Wl,--as-needed to the g++ commandline on
> ubuntu 10.04 replicates the link failure on the previously working
> system.
> Adding -Wl,--no-as-needed on ubuntu 12.04 works around the problem.
Using your testcase from
http://sourceware.org/bugzilla/show_bug.cgi?id=13141#c1
I could not reproduce this problem on my x86_64 Ubuntu 11.10 system.
ld says
GNU ld (GNU Binutils for Ubuntu) 2.21.53.20110810
Nor did I see a problem when using current mainline ld. For both
versions of ld, we get a DT_NEEDED entry for libm in both libf1.so and
the main app. Which is odd because --no-copy-dt-needed-entries was in
effect when linking app and there was no command line reference to
libm. So I dug around a little to see why libm is somehow special and
found we're picking up libm via elf32.em:check_ld_so_conf(), which
calls search_needed() with needed.by == NULL, and that results in this
piece of code in try_needed() not seeing libm as a dependent library.
/* Tell the ELF linker that we don't want the output file to have a
DT_NEEDED entry for this file at all if the entry is from a file
with DYN_NO_ADD_NEEDED. */
if (needed->by != NULL
&& (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0)
link_class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED;
Easily enough fixed. I'll probably be blamed for breaking a number
of projects with this change, but of course all I'm doing here is
making http://sourceware.org/ml/binutils/2011-08/msg00129.html
effective.
* emultempl/elf32.em (gld${EMULATION_NAME}_check_ld_so_conf): Replace
"name" param with a bfd_link_needed_list pointer. Update caller.
(gld${EMULATION_NAME}_check_ld_elf_hints): Likewise.
Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.234
diff -u -p -r1.234 elf32.em
--- ld/emultempl/elf32.em 6 Dec 2012 00:25:18 -0000 1.234
+++ ld/emultempl/elf32.em 8 Jan 2013 05:27:24 -0000
@@ -569,7 +569,8 @@ EOF
#endif
static bfd_boolean
-gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
+gld${EMULATION_NAME}_check_ld_elf_hints (const struct bfd_link_needed_list *l,
+ int force)
{
static bfd_boolean initialized;
static char *ld_elf_hints;
@@ -612,10 +613,9 @@ gld${EMULATION_NAME}_check_ld_elf_hints
if (ld_elf_hints == NULL)
return FALSE;
- needed.by = NULL;
- needed.name = name;
- return gld${EMULATION_NAME}_search_needed (ld_elf_hints, & needed,
- force);
+ needed.by = l->by;
+ needed.name = l->name;
+ return gld${EMULATION_NAME}_search_needed (ld_elf_hints, &needed, force);
}
EOF
# FreeBSD
@@ -787,7 +787,8 @@ gld${EMULATION_NAME}_parse_ld_so_conf
}
static bfd_boolean
-gld${EMULATION_NAME}_check_ld_so_conf (const char *name, int force)
+gld${EMULATION_NAME}_check_ld_so_conf (const struct bfd_link_needed_list *l,
+ int force)
{
static bfd_boolean initialized;
static char *ld_so_conf;
@@ -824,8 +825,8 @@ gld${EMULATION_NAME}_check_ld_so_conf (c
return FALSE;
- needed.by = NULL;
- needed.name = name;
+ needed.by = l->by;
+ needed.name = l->name;
return gld${EMULATION_NAME}_search_needed (ld_so_conf, &needed, force);
}
@@ -1308,7 +1309,7 @@ if [ "x${USE_LIBPATH}" = xyes ] ; then
case ${target} in
*-*-freebsd* | *-*-dragonfly*)
fragment <<EOF
- if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
+ if (gld${EMULATION_NAME}_check_ld_elf_hints (l, force))
break;
EOF
# FreeBSD
@@ -1317,7 +1318,7 @@ EOF
*-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
# Linux
fragment <<EOF
- if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
+ if (gld${EMULATION_NAME}_check_ld_so_conf (l, force))
break;
EOF
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-01-08 6:10 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-20 19:22 Spurious undefined reference error? Dan Kegel
2012-12-20 19:48 ` Dan Kegel
2012-12-20 20:00 ` H.J. Lu
2012-12-20 23:19 ` Dan Kegel
2013-01-08 6:10 ` Alan Modra
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).