X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldmisc.c;h=42adceeac3eecfa5eafae5f3ddaf18e90a7a4507;hb=3b16e843f2a75ccf8e7ecc5102e1217a122a05ad;hp=8fab22825f7add6f3aa29f374bbf3a269a43685d;hpb=5b64ad42d36e6d487e1f7287d37fbc243a178e72;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldmisc.c b/ld/ldmisc.c index 8fab22825f..42adceeac3 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -1,5 +1,6 @@ /* ldmisc.c - Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999 + Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2002 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support. @@ -27,10 +28,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifdef ANSI_PROTOTYPES #include -#define USE_STDARG 1 #else #include -#define USE_STDARG 0 #endif #include "ld.h" @@ -71,18 +70,20 @@ demangle (string) const char *string; { char *res; + const char *p; if (output_bfd != NULL && bfd_get_symbol_leading_char (output_bfd) == string[0]) ++string; - /* This is a hack for better error reporting on XCOFF, or the MS PE */ - /* format. Xcoff has a single '.', while the NT PE for PPC has '..'. */ - /* So we remove all of them. */ - while(string[0] == '.') - ++string; + /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF + or the MS PE format. These formats have a number of leading '.'s + on at least some symbols, so we remove all dots. */ + p = string; + while (*p == '.') + ++p; - res = cplus_demangle (string, DMGL_ANSI | DMGL_PARAMS); + res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS); return res ? res : xstrdup (string); } @@ -96,19 +97,19 @@ vfinfo (fp, fmt, arg) while (*fmt != '\0') { - while (*fmt != '%' && *fmt != '\0') + while (*fmt != '%' && *fmt != '\0') { putc (*fmt, fp); fmt++; } - if (*fmt == '%') + if (*fmt == '%') { - fmt ++; - switch (*fmt++) + fmt++; + switch (*fmt++) { default: - fprintf (fp,"%%%c", fmt[-1]); + fprintf (fp, "%%%c", fmt[-1]); break; case '%': @@ -191,7 +192,7 @@ vfinfo (fp, fmt, arg) case 'B': /* filename from a bfd */ - { + { bfd *abfd = va_arg (arg, bfd *); if (abfd->my_archive) fprintf (fp, "%s(%s)", abfd->my_archive->filename, @@ -202,18 +203,18 @@ vfinfo (fp, fmt, arg) break; case 'F': - /* error is fatal */ + /* Error is fatal. */ fatal = true; break; case 'P': - /* print program name */ + /* Print program name. */ fprintf (fp, "%s", program_name); break; case 'E': /* current bfd error or errno */ - fprintf (fp, bfd_errmsg (bfd_get_error ())); + fprintf (fp, "%s", bfd_errmsg (bfd_get_error ())); break; case 'I': @@ -233,7 +234,7 @@ vfinfo (fp, fmt, arg) break; case 'S': - /* print script file and linenumber */ + /* Print script file and linenumber. */ if (parsing_defsym) fprintf (fp, "--defsym %s", lex_string); else if (ldfile_input_filename != NULL) @@ -243,17 +244,17 @@ vfinfo (fp, fmt, arg) break; case 'R': - /* Print all that's interesting about a relent */ + /* Print all that's interesting about a relent. */ { arelent *relent = va_arg (arg, arelent *); - + lfinfo (fp, "%s+0x%v (type %s)", (*(relent->sym_ptr_ptr))->name, relent->addend, relent->howto->name); } break; - + case 'C': case 'D': case 'G': @@ -335,10 +336,10 @@ vfinfo (fp, fmt, arg) last_bfd = abfd; if (last_file != NULL) free (last_file); - last_file = buystring (filename); + last_file = xstrdup (filename); if (last_function != NULL) free (last_function); - last_function = buystring (functionname); + last_function = xstrdup (functionname); } discard_last = false; if (linenumber != 0) @@ -355,7 +356,7 @@ vfinfo (fp, fmt, arg) if (linenumber != 0) lfinfo (fp, ":%u", linenumber); } - else if (linenumber != 0) + else if (linenumber != 0) lfinfo (fp, "%B:%s:%u", abfd, filename, linenumber); else lfinfo (fp, "%B(%s+0x%v):%s", abfd, section->name, @@ -380,7 +381,7 @@ vfinfo (fp, fmt, arg) } } break; - + case 's': /* arbitrary string, like printf */ fprintf (fp, "%s", va_arg (arg, char *)); @@ -399,64 +400,41 @@ vfinfo (fp, fmt, arg) } } - if (fatal == true) - xexit(1); + if (config.fatal_warnings) + config.make_executable = false; + + if (fatal == true) + xexit (1); } -/* Format info message and print on stdout. */ +/* Format info message and print on stdout. */ /* (You would think this should be called just "info", but then you would hosed by LynxOS, which defines that name in its libc.) */ void -#if USE_STDARG -info_msg (const char *fmt, ...) -#else -info_msg (va_alist) - va_dcl -#endif +info_msg VPARAMS ((const char *fmt, ...)) { - va_list arg; - -#if ! USE_STDARG - const char *fmt; - - va_start (arg); - fmt = va_arg (arg, const char *); -#else - va_start (arg, fmt); -#endif + VA_OPEN (arg, fmt); + VA_FIXEDARG (arg, const char *, fmt); vfinfo (stdout, fmt, arg); - va_end (arg); + VA_CLOSE (arg); } -/* ('e' for error.) Format info message and print on stderr. */ +/* ('e' for error.) Format info message and print on stderr. */ void -#if USE_STDARG -einfo (const char *fmt, ...) -#else -einfo (va_alist) - va_dcl -#endif +einfo VPARAMS ((const char *fmt, ...)) { - va_list arg; - -#if ! USE_STDARG - const char *fmt; - - va_start (arg); - fmt = va_arg (arg, const char *); -#else - va_start (arg, fmt); -#endif + VA_OPEN (arg, fmt); + VA_FIXEDARG (arg, const char *, fmt); vfinfo (stderr, fmt, arg); - va_end (arg); + VA_CLOSE (arg); } -void +void info_assert (file, line) const char *file; unsigned int line; @@ -464,75 +442,58 @@ info_assert (file, line) einfo (_("%F%P: internal error %s %d\n"), file, line); } -char * -buystring (x) - CONST char *CONST x; -{ - size_t l = strlen(x)+1; - char *r = xmalloc(l); - memcpy(r, x,l); - return r; -} - -/* ('m' for map) Format info message and print on map. */ +/* ('m' for map) Format info message and print on map. */ void -#if USE_STDARG -minfo (const char *fmt, ...) -#else -minfo (va_alist) - va_dcl -#endif +minfo VPARAMS ((const char *fmt, ...)) { - va_list arg; - -#if ! USE_STDARG - const char *fmt; - va_start (arg); - fmt = va_arg (arg, const char *); -#else - va_start (arg, fmt); -#endif + VA_OPEN (arg, fmt); + VA_FIXEDARG (arg, const char *, fmt); vfinfo (config.map_file, fmt, arg); - va_end (arg); + VA_CLOSE (arg); } void -#if USE_STDARG -lfinfo (FILE *file, const char *fmt, ...) -#else -lfinfo (va_alist) - va_dcl -#endif +lfinfo VPARAMS ((FILE *file, const char *fmt, ...)) { - va_list arg; - -#if ! USE_STDARG - FILE *file; - const char *fmt; - - va_start (arg); - file = va_arg (arg, FILE *); - fmt = va_arg (arg, const char *); -#else - va_start (arg, fmt); -#endif + VA_OPEN (arg, fmt); + VA_FIXEDARG (arg, FILE *, file); + VA_FIXEDARG (arg, const char *, fmt); vfinfo (file, fmt, arg); - va_end (arg); + VA_CLOSE (arg); } /* Functions to print the link map. */ -void +void print_space () { fprintf (config.map_file, " "); } -void +void print_nl () { fprintf (config.map_file, "\n"); } + +/* A more or less friendly abort message. In ld.h abort is defined to + call this function. */ + +void +ld_abort (file, line, fn) + const char *file; + int line; + const char *fn; +{ + if (fn != NULL) + einfo (_("%P: internal error: aborting at %s line %d in %s\n"), + file, line, fn); + else + einfo (_("%P: internal error: aborting at %s line %d\n"), + file, line); + einfo (_("%P%F: please report this bug\n")); + xexit (1); +}