X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldmisc.c;h=9b8f44f2ec162d2c35aac820c10080c34c7092c3;hb=e1fffbe6e9081f5d7b12fe6d591b00a8eb6d8897;hp=cc9131e424626dffddef79aac5e2f6b1bddbe1c5;hpb=98d87ee7098974945b6623bd45dbd18f02e61e57;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldmisc.c b/ld/ldmisc.c index cc9131e424..9b8f44f2ec 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -1,6 +1,6 @@ /* ldmisc.c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2002, 2003, 2004 + 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support. @@ -18,8 +18,8 @@ You should have received a copy of the GNU General Public License along with GLD; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ #include "bfd.h" #include "bfdlink.h" @@ -61,7 +61,7 @@ */ static void -vfinfo (FILE *fp, const char *fmt, va_list arg) +vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning) { bfd_boolean fatal = FALSE; @@ -190,7 +190,7 @@ vfinfo (FILE *fp, const char *fmt, va_list arg) bfd *abfd = va_arg (arg, bfd *); if (abfd == NULL) - fprintf (fp, ""); + fprintf (fp, "%s generated", program_name); else if (abfd->my_archive) fprintf (fp, "%s(%s)", abfd->my_archive->filename, abfd->filename); @@ -275,49 +275,62 @@ vfinfo (FILE *fp, const char *fmt, va_list arg) section = va_arg (arg, asection *); offset = va_arg (arg, bfd_vma); - entry = (lang_input_statement_type *) abfd->usrdata; - if (entry != (lang_input_statement_type *) NULL - && entry->asymbols != (asymbol **) NULL) - asymbols = entry->asymbols; + if (abfd == NULL) + { + entry = NULL; + asymbols = NULL; + } else { - long symsize; - long symbol_count; - - symsize = bfd_get_symtab_upper_bound (abfd); - if (symsize < 0) - einfo (_("%B%F: could not read symbols\n"), abfd); - asymbols = xmalloc (symsize); - symbol_count = bfd_canonicalize_symtab (abfd, asymbols); - if (symbol_count < 0) - einfo (_("%B%F: could not read symbols\n"), abfd); - if (entry != (lang_input_statement_type *) NULL) + entry = (lang_input_statement_type *) abfd->usrdata; + if (entry != (lang_input_statement_type *) NULL + && entry->asymbols != (asymbol **) NULL) + asymbols = entry->asymbols; + else { - entry->asymbols = asymbols; - entry->symbol_count = symbol_count; + long symsize; + long sym_count; + + symsize = bfd_get_symtab_upper_bound (abfd); + if (symsize < 0) + einfo (_("%B%F: could not read symbols\n"), abfd); + asymbols = xmalloc (symsize); + sym_count = bfd_canonicalize_symtab (abfd, asymbols); + if (sym_count < 0) + einfo (_("%B%F: could not read symbols\n"), abfd); + if (entry != (lang_input_statement_type *) NULL) + { + entry->asymbols = asymbols; + entry->symbol_count = sym_count; + } } } - /* The GNU Coding Standard requires that error messages be of the form: + /* The GNU Coding Standard requires that error messages + be of the form: source-file-name:lineno: message - We do not always have a line number available so if we cannot find - them we print out the section name and offset instread. */ + We do not always have a line number available so if + we cannot find them we print out the section name and + offset instread. */ discard_last = TRUE; - if (bfd_find_nearest_line (abfd, section, asymbols, offset, - &filename, &functionname, - &linenumber)) + if (abfd != NULL + && bfd_find_nearest_line (abfd, section, asymbols, offset, + &filename, &functionname, + &linenumber)) { if (functionname != NULL && fmt[-1] == 'C') { - /* Detect the case where we are printing out a message - for the same function as the last call to vinfo ("%C"). - In this situation do not print out the ABFD filename - or the function name again. Note - we do still print - out the source filename, as this will allow programs - that parse the linker's output (eg emacs) to correctly - locate multiple errors in the same source file. */ + /* Detect the case where we are printing out a + message for the same function as the last + call to vinfo ("%C"). In this situation do + not print out the ABFD filename or the + function name again. Note - we do still + print out the source filename, as this will + allow programs that parse the linker's output + (eg emacs) to correctly locate multiple + errors in the same source file. */ if (last_bfd == NULL || last_file == NULL || last_function == NULL @@ -398,7 +411,7 @@ vfinfo (FILE *fp, const char *fmt, va_list arg) } } - if (config.fatal_warnings) + if (is_warning && config.fatal_warnings) config.make_executable = FALSE; if (fatal) @@ -458,7 +471,7 @@ info_msg (const char *fmt, ...) va_list arg; va_start (arg, fmt); - vfinfo (stdout, fmt, arg); + vfinfo (stdout, fmt, arg, FALSE); va_end (arg); } @@ -470,7 +483,7 @@ einfo (const char *fmt, ...) va_list arg; va_start (arg, fmt); - vfinfo (stderr, fmt, arg); + vfinfo (stderr, fmt, arg, TRUE); va_end (arg); } @@ -488,7 +501,7 @@ minfo (const char *fmt, ...) va_list arg; va_start (arg, fmt); - vfinfo (config.map_file, fmt, arg); + vfinfo (config.map_file, fmt, arg, FALSE); va_end (arg); } @@ -498,7 +511,7 @@ lfinfo (FILE *file, const char *fmt, ...) va_list arg; va_start (arg, fmt); - vfinfo (file, fmt, arg); + vfinfo (file, fmt, arg, FALSE); va_end (arg); }