diff --git a/.cvsignore b/.cvsignore index 849e05d..587e1e4 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1,4 @@ binutils-2.20.51.0.2.tar.bz2 +binutils-2.20.51.0.2 +current-gcc +i386 diff --git a/binutils-2.20.51.0.2-add-needed.patch b/binutils-2.20.51.0.2-add-needed.patch new file mode 100644 index 0000000..c3e049d --- /dev/null +++ b/binutils-2.20.51.0.2-add-needed.patch @@ -0,0 +1,411 @@ +diff -rup ../binutils-2.20.51.0.2.original/bfd/elflink.c ./bfd/elflink.c +--- ../binutils-2.20.51.0.2.original/bfd/elflink.c 2009-11-05 17:42:05.000000000 +0000 ++++ ./bfd/elflink.c 2009-11-05 17:48:23.000000000 +0000 +@@ -3918,6 +3918,7 @@ error_free_dyn: + bfd_boolean common; + unsigned int old_alignment; + bfd *old_bfd; ++ bfd * undef_bfd = NULL; + + override = FALSE; + +@@ -4149,6 +4150,20 @@ error_free_dyn: + name = newname; + } + ++ /* If this is a definition of a previously undefined symbol ++ make a note of the bfd that contained the reference in ++ case we need to refer to it later on in error messages. */ ++ if (! bfd_is_und_section (sec)) ++ { ++ h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE); ++ ++ if (h != NULL ++ && (h->root.type == bfd_link_hash_undefined ++ || h->root.type == bfd_link_hash_undefweak) ++ && h->root.u.undef.abfd) ++ undef_bfd = h->root.u.undef.abfd; ++ } ++ + if (!_bfd_elf_merge_symbol (abfd, info, name, isym, &sec, + &value, &old_alignment, + sym_hash, &skip, &override, +@@ -4506,9 +4521,12 @@ error_free_dyn: + if ((elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0) + { + (*_bfd_error_handler) +- (_("%s: invalid DSO for symbol `%s' definition"), ++ (_("%B: undefined reference to symbol '%s'"), ++ undef_bfd == NULL ? info->output_bfd : undef_bfd, name); ++ (*_bfd_error_handler) ++ (_("note: '%s' is defined in DSO %B so try adding it to the linker command line"), + abfd, name); +- bfd_set_error (bfd_error_bad_value); ++ bfd_set_error (bfd_error_invalid_operation); + goto error_free_vers; + } + +diff -rup ../binutils-2.20.51.0.2.original/gas/testsuite/gas/elf/elf.exp ./gas/testsuite/gas/elf/elf.exp +--- ../binutils-2.20.51.0.2.original/gas/testsuite/gas/elf/elf.exp 2009-11-05 17:42:03.000000000 +0000 ++++ ./gas/testsuite/gas/elf/elf.exp 2009-11-05 18:11:55.000000000 +0000 +@@ -151,5 +151,4 @@ if { ([istarget "*-*-*elf*"] + run_dump_test "section7" + run_dump_test "dwarf2-1" + run_dump_test "dwarf2-2" +- run_dump_test "dwarf2-3" + } +diff -rup ../binutils-2.20.51.0.2.original/ld/emultempl/elf32.em ./ld/emultempl/elf32.em +--- ../binutils-2.20.51.0.2.original/ld/emultempl/elf32.em 2009-11-05 17:41:58.000000000 +0000 ++++ ./ld/emultempl/elf32.em 2009-11-05 17:45:22.000000000 +0000 +@@ -110,7 +110,7 @@ fi + + if test x"$LDEMUL_RECOGNIZED_FILE" != xgld"${EMULATION_NAME}"_load_symbols; then + fragment <as_needed) ++ 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_needed) ++ if (!entry->add_DT_NEEDED_for_dynamic) + link_class |= DYN_NO_ADD_NEEDED; + + if (entry->just_syms_flag +@@ -134,7 +134,7 @@ gld${EMULATION_NAME}_load_symbols (lang_ + einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"), + entry->the_bfd); + +- if (!link_class ++ if (link_class == 0 + || (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) == 0) + return FALSE; + +diff -rup ../binutils-2.20.51.0.2.original/ld/ldgram.y ./ld/ldgram.y +--- ../binutils-2.20.51.0.2.original/ld/ldgram.y 2009-11-05 17:42:00.000000000 +0000 ++++ ./ld/ldgram.y 2009-11-05 17:45:22.000000000 +0000 +@@ -378,17 +378,17 @@ input_list: + { lang_add_input_file($2,lang_input_file_is_l_enum, + (char *)NULL); } + | AS_NEEDED '(' +- { $$ = as_needed; as_needed = TRUE; } ++ { $$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; } + input_list ')' +- { as_needed = $3; } ++ { add_DT_NEEDED_for_regular = $3; } + | input_list ',' AS_NEEDED '(' +- { $$ = as_needed; as_needed = TRUE; } ++ { $$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; } + input_list ')' +- { as_needed = $5; } ++ { add_DT_NEEDED_for_regular = $5; } + | input_list AS_NEEDED '(' +- { $$ = as_needed; as_needed = TRUE; } ++ { $$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; } + input_list ')' +- { as_needed = $4; } ++ { add_DT_NEEDED_for_regular = $4; } + ; + + sections: +diff -rup ../binutils-2.20.51.0.2.original/ld/ldlang.c ./ld/ldlang.c +--- ../binutils-2.20.51.0.2.original/ld/ldlang.c 2009-11-05 17:42:00.000000000 +0000 ++++ ./ld/ldlang.c 2009-11-05 18:01:29.000000000 +0000 +@@ -1056,8 +1056,8 @@ new_afile (const char *name, + p->next_real_file = NULL; + p->next = NULL; + p->dynamic = config.dynamic_link; +- p->add_needed = add_needed; +- p->as_needed = as_needed; ++ 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, +@@ -2592,7 +2592,8 @@ load_symbols (lang_input_statement_type + { + bfd_error_type err; + bfd_boolean save_ldlang_sysrooted_script; +- bfd_boolean save_as_needed, save_add_needed; ++ bfd_boolean save_add_DT_NEEDED_for_regular; ++ bfd_boolean save_add_DT_NEEDED_for_dynamic; + + err = bfd_get_error (); + +@@ -2623,10 +2624,10 @@ load_symbols (lang_input_statement_type + 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_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; + + ldfile_assumed_script = TRUE; + parser_input = input_script; +@@ -2637,8 +2638,8 @@ load_symbols (lang_input_statement_type + ldfile_assumed_script = FALSE; + + ldlang_sysrooted_script = save_ldlang_sysrooted_script; +- as_needed = save_as_needed; +- add_needed = save_add_needed; ++ add_DT_NEEDED_for_regular = save_add_DT_NEEDED_for_regular; ++ add_DT_NEEDED_for_dynamic = save_add_DT_NEEDED_for_dynamic; + pop_stat_ptr (); + + return TRUE; +diff -rup ../binutils-2.20.51.0.2.original/ld/ldlang.h ./ld/ldlang.h +--- ../binutils-2.20.51.0.2.original/ld/ldlang.h 2009-11-05 17:41:58.000000000 +0000 ++++ ./ld/ldlang.h 2009-11-05 17:45:22.000000000 +0000 +@@ -270,11 +270,11 @@ typedef struct lang_input_statement_stru + + /* Whether DT_NEEDED tags should be added for dynamic libraries in + DT_NEEDED tags from this entry. */ +- unsigned int add_needed : 1; ++ 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 as_needed : 1; ++ unsigned int add_DT_NEEDED_for_regular : 1; + + /* Whether to include the entire contents of an archive. */ + unsigned int whole_archive : 1; +diff -rup ../binutils-2.20.51.0.2.original/ld/ldmain.c ./ld/ldmain.c +--- ../binutils-2.20.51.0.2.original/ld/ldmain.c 2009-11-05 17:42:00.000000000 +0000 ++++ ./ld/ldmain.c 2009-11-05 17:45:22.000000000 +0000 +@@ -93,13 +93,14 @@ bfd_boolean version_printed; + /* 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 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; +diff -rup ../binutils-2.20.51.0.2.original/ld/ldmain.h ./ld/ldmain.h +--- ../binutils-2.20.51.0.2.original/ld/ldmain.h 2009-11-05 17:41:58.000000000 +0000 ++++ ./ld/ldmain.h 2009-11-05 17:45:22.000000000 +0000 +@@ -1,6 +1,6 @@ + /* ldmain.h - + Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004, +- 2005, 2007, 2008 Free Software Foundation, Inc. ++ 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + + This file is part of the GNU Binutils. + +@@ -34,8 +34,8 @@ extern bfd_boolean trace_files; + 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 add_DT_NEEDED_for_regular; ++extern bfd_boolean add_DT_NEEDED_for_dynamic; + extern bfd_boolean demangling; + extern enum report_method how_to_report_unresolved_symbols; + extern int g_switch_value; +diff -rup ../binutils-2.20.51.0.2.original/ld/ld.texinfo ./ld/ld.texinfo +--- ../binutils-2.20.51.0.2.original/ld/ld.texinfo 2009-11-05 17:41:58.000000000 +0000 ++++ ./ld/ld.texinfo 2009-11-05 17:45:22.000000000 +0000 +@@ -1132,27 +1132,24 @@ restore the old behaviour. + @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, ++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. ++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 +-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. ++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} +@@ -1253,6 +1250,29 @@ Section overlap is not usually checked f + 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 +diff -rup ../binutils-2.20.51.0.2.original/ld/lexsup.c ./ld/lexsup.c +--- ../binutils-2.20.51.0.2.original/ld/lexsup.c 2009-11-05 17:42:00.000000000 +0000 ++++ ./ld/lexsup.c 2009-11-05 17:45:22.000000000 +0000 +@@ -125,10 +125,10 @@ enum option_values + 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_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, +@@ -333,19 +333,22 @@ static const struct ld_option ld_options + 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}, ++ ++ /* 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_AS_NEEDED}, +- '\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"), ++ { {"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 }, +@@ -373,6 +376,15 @@ static const struct ld_option ld_options + { {"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}, +@@ -1373,17 +1385,17 @@ parse_args (unsigned argc, char **argv) + case OPTION_WHOLE_ARCHIVE: + whole_archive = TRUE; + break; +- case OPTION_ADD_NEEDED: +- add_needed = TRUE; ++ case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC: ++ add_DT_NEEDED_for_dynamic = TRUE; + break; +- case OPTION_NO_ADD_NEEDED: +- add_needed = FALSE; ++ case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC: ++ add_DT_NEEDED_for_dynamic = FALSE; + break; +- case OPTION_AS_NEEDED: +- as_needed = TRUE; ++ case OPTION_ADD_DT_NEEDED_FOR_REGULAR: ++ add_DT_NEEDED_for_regular = TRUE; + break; +- case OPTION_NO_AS_NEEDED: +- as_needed = FALSE; ++ case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR: ++ add_DT_NEEDED_for_regular = FALSE; + break; + case OPTION_WRAP: + add_wrap (optarg); +diff -rup ../binutils-2.20.51.0.2.original/ld/NEWS ./ld/NEWS +--- ../binutils-2.20.51.0.2.original/ld/NEWS 2009-11-05 17:42:00.000000000 +0000 ++++ ./ld/NEWS 2009-11-05 17:45:59.000000000 +0000 +@@ -1,5 +1,8 @@ + -*- text -*- + ++* --add-needed renamed to --copy-dt-needed-entries in order to avoid confusion ++ with --as-needed option. ++ + * Add support for the Renesas RX processor. + + Changes in 2.20: diff --git a/binutils.spec b/binutils.spec index 120c623..a6ef57e 100644 --- a/binutils.spec +++ b/binutils.spec @@ -17,7 +17,7 @@ Summary: A GNU collection of binary utilities Name: %{?cross}binutils%{?_with_debug:-debug} Version: 2.20.51.0.2 -Release: 2%{?dist} +Release: 3%{?dist} License: GPLv3+ Group: Development/Tools URL: http://sources.redhat.com/binutils @@ -30,6 +30,7 @@ Patch04: binutils-2.20.51.0.2-envvar-revert.patch Patch05: binutils-2.20.51.0.2-version.patch Patch06: binutils-2.20.51.0.2-set-long-long.patch Patch07: binutils-2.20.51.0.2-build-id.patch +Patch08: binutils-2.20.51.0.2-add-needed.patch %if 0%{?_with_debug:1} # Define this if you want to skip the strip step and preserve debug info. @@ -101,6 +102,7 @@ to consider using libelf instead of BFD. %patch05 -p0 -b .version~ %patch06 -p0 -b .set-long-long~ %patch07 -p0 -b .build-id~ +%patch08 -p0 -b .add-needed~ # We cannot run autotools as there is an exact requirement of autoconf-2.59. @@ -368,6 +370,9 @@ exit 0 %endif # %{isnative} %changelog +* Thu Nov 05 2009 Nick CLifton 2.20.51.0.2-3 +- Rename --add-needed to --copy-dt-needed-entries and improve error message about unresolved symbols in DT_NEEDED DSOs. + * Tue Oct 27 2009 Jan Kratochvil 2.20.51.0.2-2 - Fix rpm --excludedocs (BZ 515922). - Fix spurious scriplet errors by `exit 0'. (BZ 517979, Nick Clifton)