RFC: Rename --add-needed to --copy-dt-needed-entries

View: New views
4 Messages — Rating Filter:   Alert me  

RFC: Rename --add-needed to --copy-dt-needed-entries

by Nick Clifton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi Guys,

  In Fedora-land we are thinking about adding --no-add-needed to the
  gcc command line when building all of the packages in order to force
  the packages to specifically mention all the dynamic libraries that
  they need.  As a prologue to this it has been suggested that it
  would be a good idea to rename the --add-needed option to something
  else as it is confusingly similar to the --as-needed option.

  So attached is a patch to rename --add-needed to
  --copy-dt-needed-entries.  (Of course --add-needed is still supported
  as a deprecated option).  The patch also updates the linker
  documentation to mention the affect of the --copy-dt-needed-entries
  option on the resolution of symbols in dynamic libraries.  (It is
  this effect which we anticipate will be the biggest hurdle to the
  acceptance of --no-copy-dt-needed-entries in Fedora-land).

  Any comments or criticisms ?

Cheers
  Nick

ld/ChangeLog
2009-10-28  Nick Clifton  <nickc@...>

        * lexsup.c: Rename --add-needed to --copy-dt-needed-entries.
        * ldlang.h (struct lang_input_statement_struct): Rename add_needed
        to add_DT_NEEDED_for_dynamic.  Rename as_needed to
        add_DT_NEEDED_for_regular.
        * ldlang.c: Likewise.
        * ldlang.h: Likewise.
        * ldlang.c: Use the new variable names.
        * ldgram.y: Likewise.
        * emultempl/elf32.em: Likewise.
        * ld.texinfo: Document the renamed option.  Also mention its
        affect on the resolution of dynamic symbols.
        * NEWS: Mention the changed option name.


Index: ld/NEWS
===================================================================
RCS file: /cvs/src/src/ld/NEWS,v
retrieving revision 1.110
diff -c -3 -p -r1.110 NEWS
*** ld/NEWS 23 Oct 2009 11:40:16 -0000 1.110
--- ld/NEWS 28 Oct 2009 17:03:00 -0000
***************
*** 1,5 ****
--- 1,8 ----
  -*- text -*-
 
+ * --add-needed renamed to --copy-dt-needed-entries in order to avoid confusion
+   with --as-needed option.
+
  * Extend .def file syntax by '== <ID>' for imports and exports. This allows
    to alias the import/export table name written in PE image.
 
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.252
diff -c -3 -p -r1.252 ld.texinfo
*** ld/ld.texinfo 23 Oct 2009 11:40:17 -0000 1.252
--- ld/ld.texinfo 28 Oct 2009 17:03:04 -0000
*************** restore the old behaviour.
*** 1132,1158 ****
  @item --as-needed
  @itemx --no-as-needed
  This option affects ELF DT_NEEDED tags for dynamic libraries mentioned
! on the command line after the @option{--as-needed} option.  Normally,
  the linker will add a DT_NEEDED tag for each dynamic library mentioned
  on the command line, regardless of whether the library is actually
! needed.  @option{--as-needed} causes a DT_NEEDED tag to only be emitted
! for a library that satisfies a symbol reference from regular objects
! which is undefined at the point that the library was linked, or, if
! the library is not found in the DT_NEEDED lists of other libraries
! linked up to that point, a reference from another dynamic library.
  @option{--no-as-needed} restores the default behaviour.
 
  @kindex --add-needed
  @kindex --no-add-needed
  @item --add-needed
  @itemx --no-add-needed
! This option affects the treatment of dynamic libraries from ELF
! DT_NEEDED tags in dynamic libraries mentioned on the command line after
! the @option{--no-add-needed} option.  Normally, the linker will add
! a DT_NEEDED tag for each dynamic library from DT_NEEDED tags.
! @option{--no-add-needed} causes DT_NEEDED tags will never be emitted
! for those libraries from DT_NEEDED tags. @option{--add-needed} restores
! the default behaviour.
 
  @kindex -assert @var{keyword}
  @item -assert @var{keyword}
--- 1132,1155 ----
  @item --as-needed
  @itemx --no-as-needed
  This option affects ELF DT_NEEDED tags for dynamic libraries mentioned
! on the command line after the @option{--as-needed} option.  Normally
  the linker will add a DT_NEEDED tag for each dynamic library mentioned
  on the command line, regardless of whether the library is actually
! needed or not.  @option{--as-needed} causes a DT_NEEDED tag to only be
! emitted for a library that satisfies an undefined symbol reference
! from a regular object file or, if the library is not found in the
! DT_NEEDED lists of other libraries linked up to that point, an
! undefined symbol reference from another dynamic library.
  @option{--no-as-needed} restores the default behaviour.
 
  @kindex --add-needed
  @kindex --no-add-needed
  @item --add-needed
  @itemx --no-add-needed
! These two options have been deprecated because of the similarity of
! their names to the @option{--as-needed} and @option{--no-as-needed}
! options.  They have been replaced by @option{--copy-dt-needed-entries}
! and @option{--no-copy-dt-needed-entries}.
 
  @kindex -assert @var{keyword}
  @item -assert @var{keyword}
*************** Section overlap is not usually checked f
*** 1253,1258 ****
--- 1250,1278 ----
  force checking in that case by using the @option{--check-sections}
  option.
 
+ @kindex --copy-dt-needed-entries
+ @kindex --no-copy-dt-needed-entries
+ @item --copy-dt-needed-entries
+ @itemx --no-copy-dt-needed-entries
+ This option affects the treatment of dynamic libraries referred to
+ by DT_NEEDED tags @emph{inside} ELF dynamic libraries mentioned on the
+ command line.  Normally the linker will add a DT_NEEDED tag to the
+ output binary for each library mentioned in a DT_NEEDED tag in an
+ input dynamic library.  With @option{--no-copy-dt-needed-entries}
+ specified on the command line however any dynamic libraries that
+ follow it will have their DT_NEEDED entries ignored.  The default
+ behaviour can be restored with @option{--copy-dt-needed-entries}.
+
+ This option also has an effect on the resolution of symbols in dynamic
+ libraries.  With the default setting dynamic libraries mentioned on
+ the command line will be recursively searched, following their
+ DT_NEEDED tags to other libraries, in order to resolve symbols
+ required by the output binary.  With
+ @option{--no-copy-dt-needed-entries} specified however the searching
+ of dynamic libraries that follow it will stop with the dynamic
+ library itself.  No DT_NEEDED links will be traversed to resolve
+ symbols.
+
  @cindex cross reference table
  @kindex --cref
  @item --cref
Index: ld/ldgram.y
===================================================================
RCS file: /cvs/src/src/ld/ldgram.y,v
retrieving revision 1.60
diff -c -3 -p -r1.60 ldgram.y
*** ld/ldgram.y 2 Sep 2009 07:25:35 -0000 1.60
--- ld/ldgram.y 28 Oct 2009 17:03:04 -0000
*************** input_list:
*** 378,394 ****
  { lang_add_input_file($2,lang_input_file_is_l_enum,
  (char *)NULL); }
  | AS_NEEDED '('
!  { $<integer>$ = as_needed; as_needed = TRUE; }
      input_list ')'
!  { as_needed = $<integer>3; }
  | input_list ',' AS_NEEDED '('
!  { $<integer>$ = as_needed; as_needed = TRUE; }
      input_list ')'
!  { as_needed = $<integer>5; }
  | input_list AS_NEEDED '('
!  { $<integer>$ = as_needed; as_needed = TRUE; }
      input_list ')'
!  { as_needed = $<integer>4; }
  ;
 
  sections:
--- 378,394 ----
  { lang_add_input_file($2,lang_input_file_is_l_enum,
  (char *)NULL); }
  | AS_NEEDED '('
!  { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
      input_list ')'
!  { add_DT_NEEDED_for_regular = $<integer>3; }
  | input_list ',' AS_NEEDED '('
!  { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
      input_list ')'
!  { add_DT_NEEDED_for_regular = $<integer>5; }
  | input_list AS_NEEDED '('
!  { $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
      input_list ')'
!  { add_DT_NEEDED_for_regular = $<integer>4; }
  ;
 
  sections:
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.324
diff -c -3 -p -r1.324 ldlang.c
*** ld/ldlang.c 14 Oct 2009 01:48:53 -0000 1.324
--- ld/ldlang.c 28 Oct 2009 17:03:07 -0000
*************** new_afile (const char *name,
*** 1056,1063 ****
    p->next_real_file = NULL;
    p->next = NULL;
    p->dynamic = config.dynamic_link;
!   p->add_needed = add_needed;
!   p->as_needed = as_needed;
    p->whole_archive = whole_archive;
    p->loaded = FALSE;
    lang_statement_append (&input_file_chain,
--- 1056,1063 ----
    p->next_real_file = NULL;
    p->next = NULL;
    p->dynamic = config.dynamic_link;
!   p->add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
!   p->add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
    p->whole_archive = whole_archive;
    p->loaded = FALSE;
    lang_statement_append (&input_file_chain,
*************** load_symbols (lang_input_statement_type
*** 2592,2598 ****
      {
        bfd_error_type err;
        bfd_boolean save_ldlang_sysrooted_script;
!       bfd_boolean save_as_needed, save_add_needed, save_whole_archive;
 
        err = bfd_get_error ();
 
--- 2592,2600 ----
      {
        bfd_error_type err;
        bfd_boolean save_ldlang_sysrooted_script;
!       bfd_boolean save_add_DT_NEEDED_for_regular;
!       bfd_boolean save_add_DT_NEEDED_for_dynamic;
!       bfd_boolean save_whole_archive;
 
        err = bfd_get_error ();
 
*************** load_symbols (lang_input_statement_type
*** 2623,2632 ****
        push_stat_ptr (place);
        save_ldlang_sysrooted_script = ldlang_sysrooted_script;
        ldlang_sysrooted_script = entry->sysrooted;
!       save_as_needed = as_needed;
!       as_needed = entry->as_needed;
!       save_add_needed = add_needed;
!       add_needed = entry->add_needed;
        save_whole_archive = whole_archive;
        whole_archive = entry->whole_archive;
 
--- 2625,2634 ----
        push_stat_ptr (place);
        save_ldlang_sysrooted_script = ldlang_sysrooted_script;
        ldlang_sysrooted_script = entry->sysrooted;
!       save_add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
!       add_DT_NEEDED_for_regular = entry->add_DT_NEEDED_for_regular;
!       save_add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
!       add_DT_NEEDED_for_dynamic = entry->add_DT_NEEDED_for_dynamic;
        save_whole_archive = whole_archive;
        whole_archive = entry->whole_archive;
 
*************** load_symbols (lang_input_statement_type
*** 2639,2646 ****
        ldfile_assumed_script = FALSE;
 
        ldlang_sysrooted_script = save_ldlang_sysrooted_script;
!       as_needed = save_as_needed;
!       add_needed = save_add_needed;
        whole_archive = save_whole_archive;
        pop_stat_ptr ();
 
--- 2641,2648 ----
        ldfile_assumed_script = FALSE;
 
        ldlang_sysrooted_script = save_ldlang_sysrooted_script;
!       add_DT_NEEDED_for_regular = save_add_DT_NEEDED_for_regular;
!       add_DT_NEEDED_for_dynamic = save_add_DT_NEEDED_for_dynamic;
        whole_archive = save_whole_archive;
        pop_stat_ptr ();
 
Index: ld/ldlang.h
===================================================================
RCS file: /cvs/src/src/ld/ldlang.h,v
retrieving revision 1.86
diff -c -3 -p -r1.86 ldlang.h
*** ld/ldlang.h 11 Sep 2009 15:27:35 -0000 1.86
--- ld/ldlang.h 28 Oct 2009 17:03:07 -0000
*************** typedef struct lang_input_statement_stru
*** 270,280 ****
 
    /* Whether DT_NEEDED tags should be added for dynamic libraries in
       DT_NEEDED tags from this entry.  */
!   unsigned int add_needed : 1;
 
    /* Whether this entry should cause a DT_NEEDED tag only when
       satisfying references from regular files, or always.  */
!   unsigned int as_needed : 1;
 
    /* Whether to include the entire contents of an archive.  */
    unsigned int whole_archive : 1;
--- 270,280 ----
 
    /* Whether DT_NEEDED tags should be added for dynamic libraries in
       DT_NEEDED tags from this entry.  */
!   unsigned int add_DT_NEEDED_for_dynamic : 1;
 
    /* Whether this entry should cause a DT_NEEDED tag only when
       satisfying references from regular files, or always.  */
!   unsigned int add_DT_NEEDED_for_regular : 1;
 
    /* Whether to include the entire contents of an archive.  */
    unsigned int whole_archive : 1;
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.139
diff -c -3 -p -r1.139 ldmain.c
*** ld/ldmain.c 11 Sep 2009 15:27:35 -0000 1.139
--- ld/ldmain.c 28 Oct 2009 17:03:08 -0000
*************** bfd_boolean version_printed;
*** 93,105 ****
  /* Nonzero means link in every member of an archive.  */
  bfd_boolean whole_archive;
 
! /* Nonzero means create DT_NEEDED entries only if a dynamic library
!    actually satisfies some reference in a regular object.  */
! bfd_boolean as_needed;
!
! /* Nonzero means never create DT_NEEDED entries for dynamic libraries
!    in DT_NEEDED tags.  */
! bfd_boolean add_needed = TRUE;
 
  /* TRUE if we should demangle symbol names.  */
  bfd_boolean demangling;
--- 93,106 ----
  /* Nonzero means link in every member of an archive.  */
  bfd_boolean whole_archive;
 
! /* True means only create DT_NEEDED entries for dynamic libraries
!    if they actually satisfy some reference in a regular object.  */
! bfd_boolean add_DT_NEEDED_for_regular;
!
! /* True means create DT_NEEDED entries for dynamic libraries that
!    are DT_NEEDED by dynamic libraries specifically mentioned on
!    the command line.  */
! bfd_boolean add_DT_NEEDED_for_dynamic;
 
  /* TRUE if we should demangle symbol names.  */
  bfd_boolean demangling;
Index: ld/ldmain.h
===================================================================
RCS file: /cvs/src/src/ld/ldmain.h,v
retrieving revision 1.15
diff -c -3 -p -r1.15 ldmain.h
*** ld/ldmain.h 15 Feb 2008 03:35:53 -0000 1.15
--- ld/ldmain.h 28 Oct 2009 17:03:08 -0000
***************
*** 1,6 ****
  /* ldmain.h -
     Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004,
!    2005, 2007, 2008 Free Software Foundation, Inc.
 
     This file is part of the GNU Binutils.
 
--- 1,6 ----
  /* ldmain.h -
     Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004,
!    2005, 2007, 2008, 2009 Free Software Foundation, Inc.
 
     This file is part of the GNU Binutils.
 
*************** extern bfd_boolean trace_files;
*** 34,41 ****
  extern bfd_boolean trace_file_tries;
  extern bfd_boolean version_printed;
  extern bfd_boolean whole_archive;
! extern bfd_boolean as_needed;
! extern bfd_boolean add_needed;
  extern bfd_boolean demangling;
  extern int g_switch_value;
  extern const char *output_filename;
--- 34,41 ----
  extern bfd_boolean trace_file_tries;
  extern bfd_boolean version_printed;
  extern bfd_boolean whole_archive;
! extern bfd_boolean add_DT_NEEDED_for_regular;
! extern bfd_boolean add_DT_NEEDED_for_dynamic;
  extern bfd_boolean demangling;
  extern int g_switch_value;
  extern const char *output_filename;
Index: ld/lexsup.c
===================================================================
RCS file: /cvs/src/src/ld/lexsup.c,v
retrieving revision 1.115
diff -c -3 -p -r1.115 lexsup.c
*** ld/lexsup.c 13 Sep 2009 07:19:18 -0000 1.115
--- ld/lexsup.c 28 Oct 2009 17:03:08 -0000
*************** enum option_values
*** 125,134 ****
    OPTION_SPLIT_BY_RELOC,
    OPTION_SPLIT_BY_FILE ,
    OPTION_WHOLE_ARCHIVE,
!   OPTION_ADD_NEEDED,
!   OPTION_NO_ADD_NEEDED,
!   OPTION_AS_NEEDED,
!   OPTION_NO_AS_NEEDED,
    OPTION_WRAP,
    OPTION_FORCE_EXE_SUFFIX,
    OPTION_GC_SECTIONS,
--- 125,134 ----
    OPTION_SPLIT_BY_RELOC,
    OPTION_SPLIT_BY_FILE ,
    OPTION_WHOLE_ARCHIVE,
!   OPTION_ADD_DT_NEEDED_FOR_DYNAMIC,
!   OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC,
!   OPTION_ADD_DT_NEEDED_FOR_REGULAR,
!   OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR,
    OPTION_WRAP,
    OPTION_FORCE_EXE_SUFFIX,
    OPTION_GC_SECTIONS,
*************** static const struct ld_option ld_options
*** 333,351 ****
       OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH},
      '\0', NULL, N_("Reject input files whose architecture is unknown"),
      TWO_DASHES },
!   { {"add-needed", no_argument, NULL, OPTION_ADD_NEEDED},
!     '\0', NULL, N_("Set DT_NEEDED tags for DT_NEEDED entries in\n"
!   "                                following dynamic libs"),
!     TWO_DASHES },
!   { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_NEEDED},
!     '\0', NULL, N_("Do not set DT_NEEDED tags for DT_NEEDED entries\n"
!   "                                in following dynamic libs"),
!     TWO_DASHES },
!   { {"as-needed", no_argument, NULL, OPTION_AS_NEEDED},
      '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
      TWO_DASHES },
!   { {"no-as-needed", no_argument, NULL, OPTION_NO_AS_NEEDED},
!     '\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"),
      TWO_DASHES },
    { {"assert", required_argument, NULL, OPTION_ASSERT},
      '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
--- 333,354 ----
       OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH},
      '\0', NULL, N_("Reject input files whose architecture is unknown"),
      TWO_DASHES },
!
!   /* The next two options are deprecated because of their similarity to
!      --as-needed and --no-as-needed.  They have been replaced by
!      --resolve-implicit-dynamic-symbols and
!      --no-resolve-implicit-dynamic-symbols.  */
!   { {"add-needed", no_argument, NULL, OPTION_ADD_DT_NEEDED_FOR_DYNAMIC},
!     '\0', NULL, NULL, NO_HELP },
!   { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC},
!     '\0', NULL, NULL, NO_HELP },
!
!   { {"as-needed", no_argument, NULL, OPTION_ADD_DT_NEEDED_FOR_REGULAR},
      '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
      TWO_DASHES },
!   { {"no-as-needed", no_argument, NULL, OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR},
!     '\0', NULL, N_("Always set DT_NEEDED for dynamic libraries mentioned on\n"
!   "                                the command line"),
      TWO_DASHES },
    { {"assert", required_argument, NULL, OPTION_ASSERT},
      '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
*************** static const struct ld_option ld_options
*** 373,378 ****
--- 376,390 ----
    { {"no-check-sections", no_argument, NULL, OPTION_NO_CHECK_SECTIONS},
      '\0', NULL, N_("Do not check section addresses for overlaps"),
      TWO_DASHES },
+   { {"copy-dt-needed-entries", no_argument, NULL,
+      OPTION_ADD_DT_NEEDED_FOR_DYNAMIC},
+     '\0', NULL, N_("Copy DT_NEEDED links mentioned inside DSOs that follow"),
+     TWO_DASHES },
+   { {"no-copy-dt-needed-entries", no_argument, NULL,
+      OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC},
+     '\0', NULL, N_("Do not copy DT_NEEDED links mentioned inside DSOs that follow"),
+     TWO_DASHES },
+
    { {"cref", no_argument, NULL, OPTION_CREF},
      '\0', NULL, N_("Output cross reference table"), TWO_DASHES },
    { {"defsym", required_argument, NULL, OPTION_DEFSYM},
*************** parse_args (unsigned argc, char **argv)
*** 1379,1395 ****
  case OPTION_WHOLE_ARCHIVE:
   whole_archive = TRUE;
   break;
! case OPTION_ADD_NEEDED:
!  add_needed = TRUE;
   break;
! case OPTION_NO_ADD_NEEDED:
!  add_needed = FALSE;
   break;
! case OPTION_AS_NEEDED:
!  as_needed = TRUE;
   break;
! case OPTION_NO_AS_NEEDED:
!  as_needed = FALSE;
   break;
  case OPTION_WRAP:
   add_wrap (optarg);
--- 1391,1407 ----
  case OPTION_WHOLE_ARCHIVE:
   whole_archive = TRUE;
   break;
! case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC:
!  add_DT_NEEDED_for_dynamic = TRUE;
   break;
! case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC:
!  add_DT_NEEDED_for_dynamic = FALSE;
   break;
! case OPTION_ADD_DT_NEEDED_FOR_REGULAR:
!  add_DT_NEEDED_for_regular = TRUE;
   break;
! case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR:
!  add_DT_NEEDED_for_regular = FALSE;
   break;
  case OPTION_WRAP:
   add_wrap (optarg);
Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.205
diff -c -3 -p -r1.205 elf32.em
*** ld/emultempl/elf32.em 23 Oct 2009 01:21:12 -0000 1.205
--- ld/emultempl/elf32.em 28 Oct 2009 17:03:09 -0000
*************** fi
*** 110,116 ****
 
  if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
  fragment <<EOF
! /* Handle as_needed DT_NEEDED.  */
 
  static bfd_boolean
  gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
--- 110,116 ----
 
  if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then
  fragment <<EOF
! /* Handle the generation of DT_NEEDED tags.  */
 
  static bfd_boolean
  gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
*************** gld${EMULATION_NAME}_load_symbols (lang_
*** 120,132 ****
    /* Tell the ELF linker that we don't want the output file to have a
       DT_NEEDED entry for this file, unless it is used to resolve
       references in a regular object.  */
!   if (entry->as_needed)
      link_class = DYN_AS_NEEDED;
 
    /* Tell the ELF linker that we don't want the output file to have a
       DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
       this file at all.  */
!   if (!entry->add_needed)
      link_class |= DYN_NO_ADD_NEEDED;
 
    if (entry->just_syms_flag
--- 120,132 ----
    /* Tell the ELF linker that we don't want the output file to have a
       DT_NEEDED entry for this file, unless it is used to resolve
       references in a regular object.  */
!   if (entry->add_DT_NEEDED_for_regular)
      link_class = DYN_AS_NEEDED;
 
    /* Tell the ELF linker that we don't want the output file to have a
       DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
       this file at all.  */
!   if (!entry->add_DT_NEEDED_for_dynamic)
      link_class |= DYN_NO_ADD_NEEDED;
 
    if (entry->just_syms_flag
*************** gld${EMULATION_NAME}_load_symbols (lang_
*** 134,140 ****
      einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
    entry->the_bfd);
 
!   if (!link_class
        || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
      return FALSE;
 
--- 134,140 ----
      einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
    entry->the_bfd);
 
!   if (link_class == 0
        || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0)
      return FALSE;
 

Re: RFC: Rename --add-needed to --copy-dt-needed-entries

by Nick Clifton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi Guys,

> ld/ChangeLog
> 2009-10-28  Nick Clifton  <nickc@...>
>
> * lexsup.c: Rename --add-needed to --copy-dt-needed-entries.
> * ldlang.h (struct lang_input_statement_struct): Rename add_needed
> to add_DT_NEEDED_for_dynamic.  Rename as_needed to
> add_DT_NEEDED_for_regular.
> * ldlang.c: Likewise.
> * ldlang.h: Likewise.
> * ldlang.c: Use the new variable names.
> * ldgram.y: Likewise.
> * emultempl/elf32.em: Likewise.
> * ld.texinfo: Document the renamed option.  Also mention its
> affect on the resolution of dynamic symbols.
> * NEWS: Mention the changed option name.

I have received no objections to this, so I have gone ahead and checked
it in.

Cheers
   Nick



Re: RFC: Rename --add-needed to --copy-dt-needed-entries

by H.J. Lu-30 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Thu, Nov 5, 2009 at 7:36 AM, Nick Clifton <nickc@...> wrote:

> Hi Guys,
>
>> ld/ChangeLog
>> 2009-10-28  Nick Clifton  <nickc@...>
>>
>>        * lexsup.c: Rename --add-needed to --copy-dt-needed-entries.
>>        * ldlang.h (struct lang_input_statement_struct): Rename add_needed
>>        to add_DT_NEEDED_for_dynamic.  Rename as_needed to
>>        add_DT_NEEDED_for_regular.
>>        * ldlang.c: Likewise.
>>        * ldlang.h: Likewise.
>>        * ldlang.c: Use the new variable names.
>>        * ldgram.y: Likewise.
>>        * emultempl/elf32.em: Likewise.
>>        * ld.texinfo: Document the renamed option.  Also mention its
>>        affect on the resolution of dynamic symbols.
>>        * NEWS: Mention the changed option name.
>
> I have received no objections to this, so I have gone ahead and checked it
> in.
>

This breaks the linker:

http://sourceware.org/bugzilla/show_bug.cgi?id=10912


--
H.J.

Re: RFC: Rename --add-needed to --copy-dt-needed-entries

by H.J. Lu-30 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Fri, Nov 6, 2009 at 7:44 AM, H.J. Lu <hjl.tools@...> wrote:

> On Thu, Nov 5, 2009 at 7:36 AM, Nick Clifton <nickc@...> wrote:
>> Hi Guys,
>>
>>> ld/ChangeLog
>>> 2009-10-28  Nick Clifton  <nickc@...>
>>>
>>>        * lexsup.c: Rename --add-needed to --copy-dt-needed-entries.
>>>        * ldlang.h (struct lang_input_statement_struct): Rename add_needed
>>>        to add_DT_NEEDED_for_dynamic.  Rename as_needed to
>>>        add_DT_NEEDED_for_regular.
>>>        * ldlang.c: Likewise.
>>>        * ldlang.h: Likewise.
>>>        * ldlang.c: Use the new variable names.
>>>        * ldgram.y: Likewise.
>>>        * emultempl/elf32.em: Likewise.
>>>        * ld.texinfo: Document the renamed option.  Also mention its
>>>        affect on the resolution of dynamic symbols.
>>>        * NEWS: Mention the changed option name.
>>
>> I have received no objections to this, so I have gone ahead and checked it
>> in.
>>
>
> This breaks the linker:
>
> http://sourceware.org/bugzilla/show_bug.cgi?id=10912
>

The bug is in:

diff -c -3 -p -r1.139 ldmain.c
*** ld/ldmain.c 11 Sep 2009 15:27:35 -0000 1.139
--- ld/ldmain.c 28 Oct 2009 17:03:08 -0000
*************** bfd_boolean version_printed;
*** 93,105 ****
  /* Nonzero means link in every member of an archive.  */
  bfd_boolean whole_archive;

! /* Nonzero means create DT_NEEDED entries only if a dynamic library
!    actually satisfies some reference in a regular object.  */
! bfd_boolean as_needed;
!
! /* Nonzero means never create DT_NEEDED entries for dynamic libraries
!    in DT_NEEDED tags.  */
! bfd_boolean add_needed = TRUE;

  /* TRUE if we should demangle symbol names.  */
  bfd_boolean demangling;
--- 93,106 ----
  /* Nonzero means link in every member of an archive.  */
  bfd_boolean whole_archive;

! /* True means only create DT_NEEDED entries for dynamic libraries
!    if they actually satisfy some reference in a regular object.  */
! bfd_boolean add_DT_NEEDED_for_regular;
!
! /* True means create DT_NEEDED entries for dynamic libraries that
!    are DT_NEEDED by dynamic libraries specifically mentioned on
!    the command line.  */
! bfd_boolean add_DT_NEEDED_for_dynamic;

  /* TRUE if we should demangle symbol names.  */
  bfd_boolean demangling;

It changes the default for add_needed/add_DT_NEEDED_for_dynamic.
I will check in this patch soon.

--
H.J.
--
Index: ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.140
diff -u -p -r1.140 ldmain.c
--- ldmain.c    5 Nov 2009 15:35:50 -0000       1.140
+++ ldmain.c    6 Nov 2009 15:48:38 -0000
@@ -100,7 +100,7 @@ bfd_boolean add_DT_NEEDED_for_regular;
 /* True means create DT_NEEDED entries for dynamic libraries that
    are DT_NEEDED by dynamic libraries specifically mentioned on
    the command line.  */
-bfd_boolean add_DT_NEEDED_for_dynamic;
+bfd_boolean add_DT_NEEDED_for_dynamic = TRUE;

 /* TRUE if we should demangle symbol names.  */
 bfd_boolean demangling;