From 6f6f27f842f3e82a92d651fb02c5b51b7686dc74 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 3 Jun 2003 18:15:05 +0000 Subject: [PATCH] bfd/ 2003-06-03 H.J. Lu * elflink.h (elf_link_input_bfd): Call linker error_handler for discarded definitions. include/ 2003-06-03 H.J. Lu * bfdlink.h (LD_DEFINITION_IN_DISCARDED_SECTION): New. ld/ 2003-06-03 H.J. Lu * ldmisc.c: Include "bfdlink.h". (error_handler): Handle LD_DEFINITION_IN_DISCARDED_SECTION and -LD_DEFINITION_IN_DISCARDED_SECTION. * Makefile.am: Rebuild dependency. * Makefile.in: Regenerated. ld/testsuite/ 2003-06-03 H.J. Lu * ld-discard/extern.d: Updated. * ld-discard/start.d: Likewise. * ld-discard/static.d: Likewise. --- bfd/ChangeLog | 5 ++++ bfd/elflink.h | 47 ++++++++++++++++------------------ include/ChangeLog | 4 +++ include/bfdlink.h | 3 +++ ld/ChangeLog | 9 +++++++ ld/Makefile.am | 8 +++--- ld/Makefile.in | 8 +++--- ld/ldmisc.c | 54 +++++++++++++++++++++++++++++++++++++++- ld/testsuite/ChangeLog | 6 +++++ ld/testsuite/ld-discard/extern.d | 2 +- ld/testsuite/ld-discard/start.d | 2 +- ld/testsuite/ld-discard/static.d | 2 +- 12 files changed, 112 insertions(+), 38 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cbd2b41..9ff266a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2003-06-03 H.J. Lu + + * elflink.h (elf_link_input_bfd): Call linker error_handler + for discarded definitions. + 2003-06-03 Elias Athanasopoulos * syms.c (decode_section_type): Return 'n' if section flags are diff --git a/bfd/elflink.h b/bfd/elflink.h index e7019f3..a7ef742 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -5003,13 +5003,13 @@ elf_link_input_bfd (finfo, input_bfd) memset (rel, 0, sizeof (*rel)); } else - { - if (! ((*finfo->info->callbacks->undefined_symbol) - (finfo->info, h->root.root.string, - input_bfd, o, rel->r_offset, - TRUE))) - return FALSE; - } + finfo->info->callbacks->error_handler + (LD_DEFINITION_IN_DISCARDED_SECTION, + _("%T: discarded in section `%s' from %s\n"), + h->root.root.string, + h->root.root.string, + h->root.u.def.section->name, + bfd_archive_filename (h->root.u.def.section->owner)); } } else @@ -5028,26 +5028,21 @@ elf_link_input_bfd (finfo, input_bfd) } else { - bfd_boolean ok; - const char *msg - = _("local symbols in discarded section %s"); - bfd_size_type amt - = strlen (sec->name) + strlen (msg) - 1; - char *buf = (char *) bfd_malloc (amt); - - if (buf != NULL) - sprintf (buf, msg, sec->name); - else - buf = (char *) sec->name; - ok = (*finfo->info->callbacks - ->undefined_symbol) (finfo->info, buf, - input_bfd, o, - rel->r_offset, - TRUE); - if (buf != sec->name) + static int count; + int ok; + char *buf; + + ok = asprintf (&buf, "local symbol %d", + count++); + if (ok <= 0) + buf = (char *) "local symbol"; + finfo->info->callbacks->error_handler + (LD_DEFINITION_IN_DISCARDED_SECTION, + _("%T: discarded in section `%s' from %s\n"), + buf, buf, sec->name, + bfd_archive_filename (input_bfd)); + if (ok != -1) free (buf); - if (!ok) - return FALSE; } } } diff --git a/include/ChangeLog b/include/ChangeLog index 41e67bc..96f1777 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2003-06-03 H.J. Lu + + * bfdlink.h (LD_DEFINITION_IN_DISCARDED_SECTION): New. + 2003-05-30 Ulrich Drepper Jakub Jelinek diff --git a/include/bfdlink.h b/include/bfdlink.h index 61fcf96..d68fe11 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -495,6 +495,9 @@ struct bfd_link_callbacks ld. */ bfd_boolean (*error_handler) PARAMS ((int id, const char * fmt, ...)); + +/* Identifiers of linker error messages used by error_handler. */ +#define LD_DEFINITION_IN_DISCARDED_SECTION 1 }; /* The linker builds link_order structures which tell the code how to diff --git a/ld/ChangeLog b/ld/ChangeLog index 731f6ec..2652c8d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2003-06-03 H.J. Lu + + * ldmisc.c: Include "bfdlink.h". + (error_handler): Handle LD_DEFINITION_IN_DISCARDED_SECTION + and -LD_DEFINITION_IN_DISCARDED_SECTION. + + * Makefile.am: Rebuild dependency. + * Makefile.in: Regenerated. + 2003-06-03 Kaz Kojima * emulparams/shlelf_linux.sh (GENERATE_PIE_SCRIPT): Set to yes. diff --git a/ld/Makefile.am b/ld/Makefile.am index a09ccfe..0ad0824 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -1662,10 +1662,10 @@ ldmain.o: ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ ldmain.h ldmisc.h ldwrite.h ldexp.h ldlang.h ldgram.h \ ldlex.h ldfile.h ldemul.h ldctor.h ldmisc.o: ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h $(INCDIR)/demangle.h ld.h $(INCDIR)/bin-bugs.h \ - ldmisc.h ldexp.h ldlang.h ldgram.h ldlex.h ldmain.h \ - ldfile.h + $(INCDIR)/symcat.h $(INCDIR)/bfdlink.h sysdep.h config.h \ + $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h $(INCDIR)/demangle.h \ + ld.h $(INCDIR)/bin-bugs.h ldmisc.h ldexp.h ldlang.h \ + ldgram.h ldlex.h ldmain.h ldfile.h ldver.o: ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h ../bfd/bfdver.h sysdep.h config.h \ $(INCDIR)/fopen-same.h ld.h $(INCDIR)/bin-bugs.h ldver.h \ diff --git a/ld/Makefile.in b/ld/Makefile.in index f3e7cc5..bd4b71c 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -2362,10 +2362,10 @@ ldmain.o: ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ ldmain.h ldmisc.h ldwrite.h ldexp.h ldlang.h ldgram.h \ ldlex.h ldfile.h ldemul.h ldctor.h ldmisc.o: ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h $(INCDIR)/demangle.h ld.h $(INCDIR)/bin-bugs.h \ - ldmisc.h ldexp.h ldlang.h ldgram.h ldlex.h ldmain.h \ - ldfile.h + $(INCDIR)/symcat.h $(INCDIR)/bfdlink.h sysdep.h config.h \ + $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h $(INCDIR)/demangle.h \ + ld.h $(INCDIR)/bin-bugs.h ldmisc.h ldexp.h ldlang.h \ + ldgram.h ldlex.h ldmain.h ldfile.h ldver.o: ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ $(INCDIR)/symcat.h ../bfd/bfdver.h sysdep.h config.h \ $(INCDIR)/fopen-same.h ld.h $(INCDIR)/bin-bugs.h ldver.h \ diff --git a/ld/ldmisc.c b/ld/ldmisc.c index a2e496d..461d697 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -22,6 +22,7 @@ 02111-1307, USA. */ #include "bfd.h" +#include "bfdlink.h" #include "sysdep.h" #include "libiberty.h" #include "demangle.h" @@ -508,12 +509,63 @@ ld_abort (file, line, fn) } bfd_boolean -error_handler VPARAMS ((int id ATTRIBUTE_UNUSED, const char *fmt, ...)) +error_handler VPARAMS ((int id, const char *fmt, ...)) { VA_OPEN (arg, fmt); VA_FIXEDARG (arg, const char *, fmt); + va_start (arg, fmt); + + switch (id) + { + default: + break; + + /* We can be called with + + error_handler (-LD_DEFINITION_IN_DISCARDED_SECTION, "", 0); + + to make this error non-fatal and + + error_handler (-LD_DEFINITION_IN_DISCARDED_SECTION, "", 1); + + to make this error fatal. */ + case -LD_DEFINITION_IN_DISCARDED_SECTION: + case LD_DEFINITION_IN_DISCARDED_SECTION: + { + static struct bfd_hash_table *hash; + static int fatal = 1; + const char *name; + + if (id == -LD_DEFINITION_IN_DISCARDED_SECTION) + { + fatal = va_arg (arg, int); + goto out; + } + + name = va_arg (arg, const char *); + /* Only warn once about a particular undefined symbol. */ + if (hash == NULL) + { + hash = ((struct bfd_hash_table *) + xmalloc (sizeof (struct bfd_hash_table))); + if (! bfd_hash_table_init (hash, bfd_hash_newfunc)) + einfo (_("%F%P: bfd_hash_table_init failed: %E\n")); + } + + if (bfd_hash_lookup (hash, name, FALSE, FALSE) != NULL) + goto out; + + if (bfd_hash_lookup (hash, name, TRUE, TRUE) == NULL) + einfo (_("%F%P: bfd_hash_lookup failed: %E\n")); + + if (fatal) + config.make_executable = FALSE; + } + break; + } vfinfo (stderr, fmt, arg); +out: VA_CLOSE (arg); return TRUE; } diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 8cdb4c4..cd38c94d 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2003-06-03 H.J. Lu + * ld-discard/extern.d: Updated. + * ld-discard/start.d: Likewise. + * ld-discard/static.d: Likewise. + +2003-06-03 H.J. Lu + * ld-elfcomm/elfcomm.exp: Mark tests untested if compiler is not available. diff --git a/ld/testsuite/ld-discard/extern.d b/ld/testsuite/ld-discard/extern.d index 76d4263..10fa0f7 100644 --- a/ld/testsuite/ld-discard/extern.d +++ b/ld/testsuite/ld-discard/extern.d @@ -1,3 +1,3 @@ #source: extern.s #ld: -T discard.ld -#error: undefined reference to `(data|local symbols in discarded section \.data\.exit)' +#error: data: discarded in section `\.data\.exit' from tmpdir/dump0.o diff --git a/ld/testsuite/ld-discard/start.d b/ld/testsuite/ld-discard/start.d index feef5ea..b8f46ae 100644 --- a/ld/testsuite/ld-discard/start.d +++ b/ld/testsuite/ld-discard/start.d @@ -1,4 +1,4 @@ #source: start.s #source: exit.s #ld: -T discard.ld -#error: undefined reference to `data' +#error: data: discarded in section `\.data\.exit' from tmpdir/dump1.o diff --git a/ld/testsuite/ld-discard/static.d b/ld/testsuite/ld-discard/static.d index 2253f1a..78b89b0 100644 --- a/ld/testsuite/ld-discard/static.d +++ b/ld/testsuite/ld-discard/static.d @@ -1,3 +1,3 @@ #source: static.s #ld: -T discard.ld -#error: undefined reference to `local symbols in discarded section \.data\.exit' +#error: local symbol 0: discarded in section `\.data\.exit' from tmpdir/dump0.o -- 2.7.4