This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: finding libraries from linker via $ORIGIN
- From: Alan Modra <amodra at gmail dot com>
- To: Oliver Kiddle <okiddle at yahoo dot co dot uk>
- Cc: binutils <binutils at sourceware dot org>
- Date: Fri, 26 Apr 2013 10:54:49 +0930
- Subject: Re: finding libraries from linker via $ORIGIN
- References: <19133 dot 1365611488 at thecus dot kiddle dot eu> <20130411060556 dot GE363 at bubble dot grove dot modra dot org> <24265 dot 1365718325 at thecus dot kiddle dot eu>
On Fri, Apr 12, 2013 at 12:12:05AM +0200, Oliver Kiddle wrote:
> Alan Modra wrote:
> > It might be reasonable to omit loading DT_NEEDED libraries if both
> > --no-copy-dt-needed-entries *and* --allow-shlib-undefined is specified.
>
> That makes sense, thanks. It seems to work well as far as my testing
> goes. I've put the corresponding small patch below. Is there any chance
> of this change or a similar one being included?
When HJ added the code to skip loading DT_NEEDED libs when creating a
shared lib, http://sourceware.org/ml/binutils/2012-12/msg00060.html,
he used !link_info.executable. I didn't notice on review that what
really should be tested is the flag set by --allow-shlib-undefined.
For -shared the flag defaults to "ignore undefined syms", but you may
well want to build a shared lib reporting undefined syms, in which
case DT_NEEDED libs ought to be loaded. Fixed with the following
patch.
> I'd also be happy to put together a patch for expanding $ORIGIN when
> searching for DT_NEEDED libraries if there's any willingness to include
> such a change(?).
Yes, I think that would be reasonable.
* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Test
unresolved_syms_in_shared_libs rather than !executable to
determine whether to load DT_NEEDED libraries.
Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.242
diff -u -p -r1.242 elf32.em
--- ld/emultempl/elf32.em 4 Apr 2013 14:38:47 -0000 1.242
+++ ld/emultempl/elf32.em 25 Apr 2013 23:54:01 -0000
@@ -1178,13 +1178,16 @@ gld${EMULATION_NAME}_after_open (void)
int force;
/* If the lib that needs this one was --as-needed and wasn't
- found to be needed, then this lib isn't needed either. Skip
- the lib when creating a shared object unless we are copying
- DT_NEEDED entres. */
+ found to be needed, then this lib isn't needed either. */
if (l->by != NULL
- && ((bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0
- || (!link_info.executable
- && bfd_elf_get_dyn_lib_class (l->by) & DYN_NO_ADD_NEEDED) != 0))
+ && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0)
+ continue;
+
+ /* Skip the lib if --no-copy-dt-needed-entries and
+ --allow-shlib-undefined is in effect. */
+ if (l->by != NULL
+ && link_info.unresolved_syms_in_shared_libs == RM_IGNORE
+ && (bfd_elf_get_dyn_lib_class (l->by) & DYN_NO_ADD_NEEDED) != 0)
continue;
/* If we've already seen this file, skip it. */
--
Alan Modra
Australia Development Lab, IBM