7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/bfd/elflink.c ./bfd/elflink.c
7bd7de7
--- ../binutils-2.20.51.0.2.original/bfd/elflink.c	2009-11-05 17:42:05.000000000 +0000
7bd7de7
+++ ./bfd/elflink.c	2009-11-05 17:48:23.000000000 +0000
7bd7de7
@@ -3918,6 +3918,7 @@ error_free_dyn:
7bd7de7
       bfd_boolean common;
7bd7de7
       unsigned int old_alignment;
7bd7de7
       bfd *old_bfd;
7bd7de7
+      bfd * undef_bfd = NULL;
7bd7de7
 
7bd7de7
       override = FALSE;
7bd7de7
 
7bd7de7
@@ -4149,6 +4150,20 @@ error_free_dyn:
7bd7de7
 	      name = newname;
7bd7de7
 	    }
7bd7de7
 
7bd7de7
+	  /* If this is a definition of a previously undefined symbol
7bd7de7
+	     make a note of the bfd that contained the reference in
7bd7de7
+	     case we need to refer to it later on in error messages.  */
7bd7de7
+	  if (! bfd_is_und_section (sec))
7bd7de7
+	    {
7bd7de7
+	      h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE);
7bd7de7
+
7bd7de7
+	      if (h != NULL
7bd7de7
+		  && (h->root.type == bfd_link_hash_undefined
7bd7de7
+		      || h->root.type == bfd_link_hash_undefweak)
7bd7de7
+		  && h->root.u.undef.abfd)
7bd7de7
+		undef_bfd = h->root.u.undef.abfd;
7bd7de7
+	    }
7bd7de7
+
7bd7de7
 	  if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec,
7bd7de7
 				      &value, &old_alignment,
7bd7de7
 				      sym_hash, &skip, &override,
7bd7de7
@@ -4506,9 +4521,12 @@ error_free_dyn:
7bd7de7
 	      if ((elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0)
7bd7de7
 		{
7bd7de7
 		  (*_bfd_error_handler)
7bd7de7
-		    (_("%s: invalid DSO for symbol `%s' definition"),
7bd7de7
+		    (_("%B: undefined reference to symbol '%s'"),
7bd7de7
+		     undef_bfd == NULL ? info->output_bfd : undef_bfd, name);
7bd7de7
+		  (*_bfd_error_handler)
7bd7de7
+		    (_("note: '%s' is defined in DSO %B so try adding it to the linker command line"),
7bd7de7
 		     abfd, name);
7bd7de7
-		  bfd_set_error (bfd_error_bad_value);
7bd7de7
+		  bfd_set_error (bfd_error_invalid_operation);
7bd7de7
 		  goto error_free_vers;
7bd7de7
 		}
7bd7de7
 
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/gas/testsuite/gas/elf/elf.exp ./gas/testsuite/gas/elf/elf.exp
7bd7de7
--- ../binutils-2.20.51.0.2.original/gas/testsuite/gas/elf/elf.exp	2009-11-05 17:42:03.000000000 +0000
7bd7de7
+++ ./gas/testsuite/gas/elf/elf.exp	2009-11-05 18:11:55.000000000 +0000
7bd7de7
@@ -151,5 +151,4 @@ if { ([istarget "*-*-*elf*"]		
7bd7de7
     run_dump_test "section7" 
7bd7de7
     run_dump_test "dwarf2-1" 
7bd7de7
     run_dump_test "dwarf2-2" 
7bd7de7
-    run_dump_test "dwarf2-3" 
7bd7de7
 }
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/emultempl/elf32.em ./ld/emultempl/elf32.em
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/emultempl/elf32.em	2009-11-05 17:41:58.000000000 +0000
7bd7de7
+++ ./ld/emultempl/elf32.em	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -110,7 +110,7 @@ fi
7bd7de7
 
7bd7de7
 if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
7bd7de7
 fragment <
7bd7de7
-/* Handle as_needed DT_NEEDED.  */
7bd7de7
+/* Handle the generation of DT_NEEDED tags.  */
7bd7de7
 
7bd7de7
 static bfd_boolean
7bd7de7
 gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
7bd7de7
@@ -120,13 +120,13 @@ gld${EMULATION_NAME}_load_symbols (lang_
7bd7de7
   /* Tell the ELF linker that we don't want the output file to have a
7bd7de7
      DT_NEEDED entry for this file, unless it is used to resolve
7bd7de7
      references in a regular object.  */
7bd7de7
-  if (entry->as_needed)
7bd7de7
+  if (entry->add_DT_NEEDED_for_regular)
7bd7de7
     link_class = DYN_AS_NEEDED;
7bd7de7
 
7bd7de7
   /* Tell the ELF linker that we don't want the output file to have a
7bd7de7
      DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
7bd7de7
      this file at all.  */
7bd7de7
-  if (!entry->add_needed)
7bd7de7
+  if (!entry->add_DT_NEEDED_for_dynamic)
7bd7de7
     link_class |= DYN_NO_ADD_NEEDED;
7bd7de7
 
7bd7de7
   if (entry->just_syms_flag
7bd7de7
@@ -134,7 +134,7 @@ gld${EMULATION_NAME}_load_symbols (lang_
7bd7de7
     einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
7bd7de7
 	   entry->the_bfd);
7bd7de7
 
7bd7de7
-  if (!link_class
7bd7de7
+  if (link_class == 0
7bd7de7
       || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
7bd7de7
     return FALSE;
7bd7de7
 
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/ldgram.y ./ld/ldgram.y
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/ldgram.y	2009-11-05 17:42:00.000000000 +0000
7bd7de7
+++ ./ld/ldgram.y	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -378,17 +378,17 @@ input_list:
7bd7de7
 		{ lang_add_input_file($2,lang_input_file_is_l_enum,
7bd7de7
 				 (char *)NULL); }
7bd7de7
 	|	AS_NEEDED '('
7bd7de7
-		  { $<integer>$ = as_needed; as_needed = TRUE; }
7bd7de7
+		  { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
7bd7de7
 		     input_list ')'
7bd7de7
-		  { as_needed = $<integer>3; }
7bd7de7
+		  { add_DT_NEEDED_for_regular = $<integer>3; }
7bd7de7
 	|	input_list ',' AS_NEEDED '('
7bd7de7
-		  { $<integer>$ = as_needed; as_needed = TRUE; }
7bd7de7
+		  { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
7bd7de7
 		     input_list ')'
7bd7de7
-		  { as_needed = $<integer>5; }
7bd7de7
+		  { add_DT_NEEDED_for_regular = $<integer>5; }
7bd7de7
 	|	input_list AS_NEEDED '('
7bd7de7
-		  { $<integer>$ = as_needed; as_needed = TRUE; }
7bd7de7
+		  { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
7bd7de7
 		     input_list ')'
7bd7de7
-		  { as_needed = $<integer>4; }
7bd7de7
+		  { add_DT_NEEDED_for_regular = $<integer>4; }
7bd7de7
 	;
7bd7de7
 
7bd7de7
 sections:
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/ldlang.c ./ld/ldlang.c
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/ldlang.c	2009-11-05 17:42:00.000000000 +0000
7bd7de7
+++ ./ld/ldlang.c	2009-11-05 18:01:29.000000000 +0000
7bd7de7
@@ -1056,8 +1056,8 @@ new_afile (const char *name,
7bd7de7
   p->next_real_file = NULL;
7bd7de7
   p->next = NULL;
7bd7de7
   p->dynamic = config.dynamic_link;
7bd7de7
-  p->add_needed = add_needed;
7bd7de7
-  p->as_needed = as_needed;
7bd7de7
+  p->add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
7bd7de7
+  p->add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
7bd7de7
   p->whole_archive = whole_archive;
7bd7de7
   p->loaded = FALSE;
7bd7de7
   lang_statement_append (&input_file_chain,
7bd7de7
@@ -2592,7 +2592,8 @@ load_symbols (lang_input_statement_type 
7bd7de7
     {
7bd7de7
       bfd_error_type err;
7bd7de7
       bfd_boolean save_ldlang_sysrooted_script;
7bd7de7
-      bfd_boolean save_as_needed, save_add_needed;
7bd7de7
+      bfd_boolean save_add_DT_NEEDED_for_regular;
7bd7de7
+      bfd_boolean save_add_DT_NEEDED_for_dynamic;
7bd7de7
 
7bd7de7
       err = bfd_get_error ();
7bd7de7
 
7bd7de7
@@ -2623,10 +2624,10 @@ load_symbols (lang_input_statement_type 
7bd7de7
       push_stat_ptr (place);
7bd7de7
       save_ldlang_sysrooted_script = ldlang_sysrooted_script;
7bd7de7
       ldlang_sysrooted_script = entry->sysrooted;
7bd7de7
-      save_as_needed = as_needed;
7bd7de7
-      as_needed = entry->as_needed;
7bd7de7
-      save_add_needed = add_needed;
7bd7de7
-      add_needed = entry->add_needed;
7bd7de7
+      save_add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
7bd7de7
+      add_DT_NEEDED_for_regular = entry->add_DT_NEEDED_for_regular;
7bd7de7
+      save_add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
7bd7de7
+      add_DT_NEEDED_for_dynamic = entry->add_DT_NEEDED_for_dynamic;
7bd7de7
 
7bd7de7
       ldfile_assumed_script = TRUE;
7bd7de7
       parser_input = input_script;
7bd7de7
@@ -2637,8 +2638,8 @@ load_symbols (lang_input_statement_type 
7bd7de7
       ldfile_assumed_script = FALSE;
7bd7de7
 
7bd7de7
       ldlang_sysrooted_script = save_ldlang_sysrooted_script;
7bd7de7
-      as_needed = save_as_needed;
7bd7de7
-      add_needed = save_add_needed;
7bd7de7
+      add_DT_NEEDED_for_regular = save_add_DT_NEEDED_for_regular;
7bd7de7
+      add_DT_NEEDED_for_dynamic = save_add_DT_NEEDED_for_dynamic;
7bd7de7
       pop_stat_ptr ();
7bd7de7
 
7bd7de7
       return TRUE;
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/ldlang.h ./ld/ldlang.h
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/ldlang.h	2009-11-05 17:41:58.000000000 +0000
7bd7de7
+++ ./ld/ldlang.h	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -270,11 +270,11 @@ typedef struct lang_input_statement_stru
7bd7de7
 
7bd7de7
   /* Whether DT_NEEDED tags should be added for dynamic libraries in
7bd7de7
      DT_NEEDED tags from this entry.  */
7bd7de7
-  unsigned int add_needed : 1;
7bd7de7
+  unsigned int add_DT_NEEDED_for_dynamic : 1;
7bd7de7
 
7bd7de7
   /* Whether this entry should cause a DT_NEEDED tag only when
7bd7de7
      satisfying references from regular files, or always.  */
7bd7de7
-  unsigned int as_needed : 1;
7bd7de7
+  unsigned int add_DT_NEEDED_for_regular : 1;
7bd7de7
 
7bd7de7
   /* Whether to include the entire contents of an archive.  */
7bd7de7
   unsigned int whole_archive : 1;
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/ldmain.c ./ld/ldmain.c
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/ldmain.c	2009-11-05 17:42:00.000000000 +0000
7bd7de7
+++ ./ld/ldmain.c	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -93,13 +93,14 @@ bfd_boolean version_printed;
7bd7de7
 /* Nonzero means link in every member of an archive.  */
7bd7de7
 bfd_boolean whole_archive;
7bd7de7
 
7bd7de7
-/* Nonzero means create DT_NEEDED entries only if a dynamic library
7bd7de7
-   actually satisfies some reference in a regular object.  */
7bd7de7
-bfd_boolean as_needed;
7bd7de7
-
7bd7de7
-/* Nonzero means never create DT_NEEDED entries for dynamic libraries
7bd7de7
-   in DT_NEEDED tags.  */
7bd7de7
-bfd_boolean add_needed = TRUE;
7bd7de7
+/* True means only create DT_NEEDED entries for dynamic libraries
7bd7de7
+   if they actually satisfy some reference in a regular object.  */
7bd7de7
+bfd_boolean add_DT_NEEDED_for_regular;
7bd7de7
+
7bd7de7
+/* True means create DT_NEEDED entries for dynamic libraries that
7bd7de7
+   are DT_NEEDED by dynamic libraries specifically mentioned on
7bd7de7
+   the command line.  */
eb06afa
+bfd_boolean add_DT_NEEDED_for_dynamic = TRUE;
7bd7de7
 
7bd7de7
 /* TRUE if we should demangle symbol names.  */
7bd7de7
 bfd_boolean demangling;
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/ldmain.h ./ld/ldmain.h
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/ldmain.h	2009-11-05 17:41:58.000000000 +0000
7bd7de7
+++ ./ld/ldmain.h	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -1,6 +1,6 @@
7bd7de7
 /* ldmain.h -
7bd7de7
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004,
7bd7de7
-   2005, 2007, 2008 Free Software Foundation, Inc.
7bd7de7
+   2005, 2007, 2008, 2009 Free Software Foundation, Inc.
7bd7de7
 
7bd7de7
    This file is part of the GNU Binutils.
7bd7de7
 
7bd7de7
@@ -34,8 +34,8 @@ extern bfd_boolean trace_files;
7bd7de7
 extern bfd_boolean trace_file_tries;
7bd7de7
 extern bfd_boolean version_printed;
7bd7de7
 extern bfd_boolean whole_archive;
7bd7de7
-extern bfd_boolean as_needed;
7bd7de7
-extern bfd_boolean add_needed;
7bd7de7
+extern bfd_boolean add_DT_NEEDED_for_regular;
7bd7de7
+extern bfd_boolean add_DT_NEEDED_for_dynamic;
7bd7de7
 extern bfd_boolean demangling;
7bd7de7
 extern enum report_method how_to_report_unresolved_symbols;
7bd7de7
 extern int g_switch_value;
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/ld.texinfo ./ld/ld.texinfo
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/ld.texinfo	2009-11-05 17:41:58.000000000 +0000
7bd7de7
+++ ./ld/ld.texinfo	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -1132,27 +1132,24 @@ restore the old behaviour.
7bd7de7
 @item --as-needed
7bd7de7
 @itemx --no-as-needed
7bd7de7
 This option affects ELF DT_NEEDED tags for dynamic libraries mentioned
7bd7de7
-on the command line after the @option{--as-needed} option.  Normally,
7bd7de7
+on the command line after the @option{--as-needed} option.  Normally
7bd7de7
 the linker will add a DT_NEEDED tag for each dynamic library mentioned
7bd7de7
 on the command line, regardless of whether the library is actually
7bd7de7
-needed.  @option{--as-needed} causes a DT_NEEDED tag to only be emitted
7bd7de7
-for a library that satisfies a symbol reference from regular objects
7bd7de7
-which is undefined at the point that the library was linked, or, if
7bd7de7
-the library is not found in the DT_NEEDED lists of other libraries
7bd7de7
-linked up to that point, a reference from another dynamic library.
7bd7de7
+needed or not.  @option{--as-needed} causes a DT_NEEDED tag to only be
7bd7de7
+emitted for a library that satisfies an undefined symbol reference
7bd7de7
+from a regular object file or, if the library is not found in the
7bd7de7
+DT_NEEDED lists of other libraries linked up to that point, an
7bd7de7
+undefined symbol reference from another dynamic library.
7bd7de7
 @option{--no-as-needed} restores the default behaviour.
7bd7de7
 
7bd7de7
 @kindex --add-needed
7bd7de7
 @kindex --no-add-needed
7bd7de7
 @item --add-needed
7bd7de7
 @itemx --no-add-needed
7bd7de7
-This option affects the treatment of dynamic libraries from ELF
7bd7de7
-DT_NEEDED tags in dynamic libraries mentioned on the command line after
7bd7de7
-the @option{--no-add-needed} option.  Normally, the linker will add
7bd7de7
-a DT_NEEDED tag for each dynamic library from DT_NEEDED tags.
7bd7de7
-@option{--no-add-needed} causes DT_NEEDED tags will never be emitted
7bd7de7
-for those libraries from DT_NEEDED tags. @option{--add-needed} restores
7bd7de7
-the default behaviour.
7bd7de7
+These two options have been deprecated because of the similarity of
7bd7de7
+their names to the @option{--as-needed} and @option{--no-as-needed}
7bd7de7
+options.  They have been replaced by @option{--copy-dt-needed-entries}
7bd7de7
+and @option{--no-copy-dt-needed-entries}.
7bd7de7
 
7bd7de7
 @kindex -assert @var{keyword}
7bd7de7
 @item -assert @var{keyword}
7bd7de7
@@ -1253,6 +1250,29 @@ Section overlap is not usually checked f
7bd7de7
 force checking in that case by using the @option{--check-sections}
7bd7de7
 option.
7bd7de7
 
7bd7de7
+@kindex --copy-dt-needed-entries
7bd7de7
+@kindex --no-copy-dt-needed-entries
7bd7de7
+@item --copy-dt-needed-entries
7bd7de7
+@itemx --no-copy-dt-needed-entries
7bd7de7
+This option affects the treatment of dynamic libraries referred to 
7bd7de7
+by DT_NEEDED tags @emph{inside} ELF dynamic libraries mentioned on the
7bd7de7
+command line.  Normally the linker will add a DT_NEEDED tag to the
7bd7de7
+output binary for each library mentioned in a DT_NEEDED tag in an
7bd7de7
+input dynamic library.  With @option{--no-copy-dt-needed-entries}
7bd7de7
+specified on the command line however any dynamic libraries that
7bd7de7
+follow it will have their DT_NEEDED entries ignored.  The default
7bd7de7
+behaviour can be restored with @option{--copy-dt-needed-entries}.
7bd7de7
+
7bd7de7
+This option also has an effect on the resolution of symbols in dynamic
7bd7de7
+libraries.  With the default setting dynamic libraries mentioned on
7bd7de7
+the command line will be recursively searched, following their
7bd7de7
+DT_NEEDED tags to other libraries, in order to resolve symbols
7bd7de7
+required by the output binary.  With
7bd7de7
+@option{--no-copy-dt-needed-entries} specified however the searching
7bd7de7
+of dynamic libraries that follow it will stop with the dynamic
7bd7de7
+library itself.  No DT_NEEDED links will be traversed to resolve
7bd7de7
+symbols.
7bd7de7
+
7bd7de7
 @cindex cross reference table
7bd7de7
 @kindex --cref
7bd7de7
 @item --cref
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/lexsup.c ./ld/lexsup.c
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/lexsup.c	2009-11-05 17:42:00.000000000 +0000
7bd7de7
+++ ./ld/lexsup.c	2009-11-05 17:45:22.000000000 +0000
7bd7de7
@@ -125,10 +125,10 @@ enum option_values
7bd7de7
   OPTION_SPLIT_BY_RELOC,
7bd7de7
   OPTION_SPLIT_BY_FILE ,
7bd7de7
   OPTION_WHOLE_ARCHIVE,
7bd7de7
-  OPTION_ADD_NEEDED,
7bd7de7
-  OPTION_NO_ADD_NEEDED,
7bd7de7
-  OPTION_AS_NEEDED,
7bd7de7
-  OPTION_NO_AS_NEEDED,
7bd7de7
+  OPTION_ADD_DT_NEEDED_FOR_DYNAMIC,
7bd7de7
+  OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC,
7bd7de7
+  OPTION_ADD_DT_NEEDED_FOR_REGULAR,
7bd7de7
+  OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR,
7bd7de7
   OPTION_WRAP,
7bd7de7
   OPTION_FORCE_EXE_SUFFIX,
7bd7de7
   OPTION_GC_SECTIONS,
7bd7de7
@@ -333,19 +333,22 @@ static const struct ld_option ld_options
7bd7de7
      OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH},
7bd7de7
     '\0', NULL, N_("Reject input files whose architecture is unknown"),
7bd7de7
     TWO_DASHES },
7bd7de7
-  { {"add-needed", no_argument, NULL, OPTION_ADD_NEEDED},
7bd7de7
-    '\0', NULL, N_("Set DT_NEEDED tags for DT_NEEDED entries in\n"
7bd7de7
-		   "                                following dynamic libs"),
7bd7de7
-    TWO_DASHES },
7bd7de7
-  { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_NEEDED},
7bd7de7
-    '\0', NULL, N_("Do not set DT_NEEDED tags for DT_NEEDED entries\n"
7bd7de7
-		   "                                in following dynamic libs"),
7bd7de7
-    TWO_DASHES },
7bd7de7
-  { {"as-needed", no_argument, NULL, OPTION_AS_NEEDED},
7bd7de7
+
7bd7de7
+  /* The next two options are deprecated because of their similarity to
7bd7de7
+     --as-needed and --no-as-needed.  They have been replaced by
7bd7de7
+     --resolve-implicit-dynamic-symbols and
7bd7de7
+     --no-resolve-implicit-dynamic-symbols.  */
7bd7de7
+  { {"add-needed", no_argument, NULL, OPTION_ADD_DT_NEEDED_FOR_DYNAMIC},
7bd7de7
+    '\0', NULL, NULL, NO_HELP },
7bd7de7
+  { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC},
7bd7de7
+    '\0', NULL, NULL, NO_HELP },
7bd7de7
+
7bd7de7
+  { {"as-needed", no_argument, NULL, OPTION_ADD_DT_NEEDED_FOR_REGULAR},
7bd7de7
     '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
7bd7de7
     TWO_DASHES },
7bd7de7
-  { {"no-as-needed", no_argument, NULL, OPTION_NO_AS_NEEDED},
7bd7de7
-    '\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"),
7bd7de7
+  { {"no-as-needed", no_argument, NULL, OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR},
7bd7de7
+    '\0', NULL, N_("Always set DT_NEEDED for dynamic libraries mentioned on\n"
7bd7de7
+		   "                                the command line"),
7bd7de7
     TWO_DASHES },
7bd7de7
   { {"assert", required_argument, NULL, OPTION_ASSERT},
7bd7de7
     '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
7bd7de7
@@ -373,6 +376,15 @@ static const struct ld_option ld_options
7bd7de7
   { {"no-check-sections", no_argument, NULL, OPTION_NO_CHECK_SECTIONS},
7bd7de7
     '\0', NULL, N_("Do not check section addresses for overlaps"),
7bd7de7
     TWO_DASHES },
7bd7de7
+  { {"copy-dt-needed-entries", no_argument, NULL,
7bd7de7
+     OPTION_ADD_DT_NEEDED_FOR_DYNAMIC},
7bd7de7
+    '\0', NULL, N_("Copy DT_NEEDED links mentioned inside DSOs that follow"),
7bd7de7
+    TWO_DASHES },
7bd7de7
+  { {"no-copy-dt-needed-entries", no_argument, NULL,
7bd7de7
+     OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC},
7bd7de7
+    '\0', NULL, N_("Do not copy DT_NEEDED links mentioned inside DSOs that follow"),
7bd7de7
+    TWO_DASHES },
7bd7de7
+
7bd7de7
   { {"cref", no_argument, NULL, OPTION_CREF},
7bd7de7
     '\0', NULL, N_("Output cross reference table"), TWO_DASHES },
7bd7de7
   { {"defsym", required_argument, NULL, OPTION_DEFSYM},
7bd7de7
@@ -1373,17 +1385,17 @@ parse_args (unsigned argc, char **argv)
7bd7de7
 	case OPTION_WHOLE_ARCHIVE:
7bd7de7
 	  whole_archive = TRUE;
7bd7de7
 	  break;
7bd7de7
-	case OPTION_ADD_NEEDED:
7bd7de7
-	  add_needed = TRUE;
7bd7de7
+	case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC:
7bd7de7
+	  add_DT_NEEDED_for_dynamic = TRUE;
7bd7de7
 	  break;
7bd7de7
-	case OPTION_NO_ADD_NEEDED:
7bd7de7
-	  add_needed = FALSE;
7bd7de7
+	case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC:
7bd7de7
+	  add_DT_NEEDED_for_dynamic = FALSE;
7bd7de7
 	  break;
7bd7de7
-	case OPTION_AS_NEEDED:
7bd7de7
-	  as_needed = TRUE;
7bd7de7
+	case OPTION_ADD_DT_NEEDED_FOR_REGULAR:
7bd7de7
+	  add_DT_NEEDED_for_regular = TRUE;
7bd7de7
 	  break;
7bd7de7
-	case OPTION_NO_AS_NEEDED:
7bd7de7
-	  as_needed = FALSE;
7bd7de7
+	case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR:
7bd7de7
+	  add_DT_NEEDED_for_regular = FALSE;
7bd7de7
 	  break;
7bd7de7
 	case OPTION_WRAP:
7bd7de7
 	  add_wrap (optarg);
7bd7de7
diff -rup ../binutils-2.20.51.0.2.original/ld/NEWS ./ld/NEWS
7bd7de7
--- ../binutils-2.20.51.0.2.original/ld/NEWS	2009-11-05 17:42:00.000000000 +0000
7bd7de7
+++ ./ld/NEWS	2009-11-05 17:45:59.000000000 +0000
7bd7de7
@@ -1,5 +1,8 @@
7bd7de7
 -*- text -*-
7bd7de7
 
7bd7de7
+* --add-needed renamed to --copy-dt-needed-entries in order to avoid confusion
7bd7de7
+  with --as-needed option.
7bd7de7
+
7bd7de7
 * Add support for the Renesas RX processor.
7bd7de7
 
7bd7de7
 Changes in 2.20: