diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ldmisc.c | 147 |
1 files changed, 93 insertions, 54 deletions
diff --git a/ld/ldmisc.c b/ld/ldmisc.c index b35e021..8af24d9 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -41,6 +41,9 @@ extern int errno; extern int sys_nerr; extern char *sys_errlist[]; +/* VARARGS*/ +static void finfo (); + /* %F error is fatal %P print progam name @@ -51,10 +54,32 @@ extern char *sys_errlist[]; %T symbol table entry %X no object output, fail return %V hex bfd_vma + %v hex bfd_vma, no leading zeros %C Clever filename:linenumber %R info about a relent % */ +extern bfd *output_bfd; + +static char * +demangle(string, remove_underscore) +char *string; +int remove_underscore; +{ + char *res; + if (remove_underscore && output_bfd) + { + if (bfd_get_symbol_leading_char(output_bfd) == string[0]) + string++; + } + /* Note that there's a memory leak here, we keep buying memory + for demangled names, and never free. But if you have so many + errors that you run out of VM with the error messages, then + there's something up */ + res = cplus_demangle(string, DMGL_ANSI|DMGL_PARAMS); + return res ? res : string; +} + static void vfinfo(fp, fmt, arg) FILE *fp; @@ -83,6 +108,19 @@ vfinfo(fp, fmt, arg) fprintf_vma(fp, value); } break; + case 'v': + { + char buf[100]; + char *p = buf; + bfd_vma value = va_arg (arg, bfd_vma); + sprintf_vma (p, value); + while (*p == '0') + p++; + if (!*p) + p--; + fputs (p, fp); + } + break; case 'T': { asymbol *symbol = va_arg(arg, asymbol *); @@ -91,24 +129,16 @@ vfinfo(fp, fmt, arg) asection *section = symbol->section; - char *cplusname = - cplus_demangle(symbol->name, DMGL_ANSI|DMGL_PARAMS); + char *cplusname = demangle(symbol->name, 1); CONST char *section_name = section->name; if (section != &bfd_und_section) { - fprintf(fp,"%s (%s)", cplusname ? cplusname : - symbol->name, section_name); + fprintf(fp,"%s (%s)", cplusname, section_name); } else { - fprintf(fp,"%s", cplusname ? cplusname : symbol->name); - } - - if (cplusname) - { - free(cplusname); + fprintf(fp,"%s", cplusname); } - } else { @@ -173,12 +203,10 @@ vfinfo(fp, fmt, arg) { arelent *relent = va_arg(arg, arelent *); - fprintf(fp,"%s+0x%x (type %s)", - (*(relent->sym_ptr_ptr))->name, - relent->addend, - relent->howto->name); - - + finfo (fp, "%s+0x%v (type %s)", + (*(relent->sym_ptr_ptr))->name, + relent->addend, + relent->howto->name); } break; @@ -209,28 +237,19 @@ vfinfo(fp, fmt, arg) filename = abfd->filename; if (functionname != (char *)NULL) { - cplus_name = cplus_demangle(functionname, DMGL_ANSI|DMGL_PARAMS); - fprintf(fp,"%s:%u: (%s)", filename, linenumber, - cplus_name? cplus_name: functionname); - if (cplus_name) - free(cplus_name); - - + /* There is no initial '_' to remove here. */ + cplus_name = demangle(functionname, 0); + fprintf(fp,"%s:%u: (%s)", filename, linenumber, cplus_name); } else if (linenumber != 0) fprintf(fp,"%s:%u", filename, linenumber); else - fprintf(fp,"%s(%s+%0x)", filename, - section->name, - offset); + finfo (fp, "%s(%s+0x%v)", filename, section->name, offset); } - else { - fprintf(fp,"%s(%s+%0x)", abfd->filename, - section->name, - offset); - } + else + finfo (fp, "%s(%s+0x%v)", abfd->filename, section->name, offset); } break; @@ -301,14 +320,14 @@ unsigned int line; whose contents concatenate those of S1, S2, S3. */ char * -DEFUN(concat, (s1, s2, s3), - CONST char *s1 AND - CONST char *s2 AND - CONST char *s3) +concat (s1, s2, s3) + CONST char *s1; + CONST char *s2; + CONST char *s3; { - bfd_size_type len1 = strlen (s1); - bfd_size_type len2 = strlen (s2); - bfd_size_type len3 = strlen (s3); + size_t len1 = strlen (s1); + size_t len2 = strlen (s2); + size_t len3 = strlen (s3); char *result = ldmalloc (len1 + len2 + len3 + 1); if (len1 != 0) @@ -324,8 +343,8 @@ DEFUN(concat, (s1, s2, s3), PTR -DEFUN(ldmalloc, (size), -bfd_size_type size) +ldmalloc (size) + size_t size; { PTR result = malloc ((int)size); @@ -336,17 +355,17 @@ bfd_size_type size) } PTR -DEFUN(xmalloc,(size), -int size) +xmalloc (size) + int size; { return ldmalloc(size); } PTR -DEFUN(ldrealloc, (ptr, size), -PTR ptr AND -bfd_size_type size) +ldrealloc (ptr, size) + PTR ptr; + size_t size; { PTR result = realloc (ptr, (int)size); @@ -356,12 +375,20 @@ bfd_size_type size) return result; } +PTR +xrealloc (ptr, size) + PTR ptr; + size_t size; +{ +return ldrealloc(ptr, size); +} -char *DEFUN(buystring,(x), - CONST char *CONST x) +char * +buystring (x) + CONST char *CONST x; { - bfd_size_type l = strlen(x)+1; + size_t l = strlen(x)+1; char *r = ldmalloc(l); memcpy(r, x,l); return r; @@ -382,7 +409,19 @@ va_dcl } - +static void +finfo (va_alist) + va_dcl +{ + char *fmt; + FILE *file; + va_list arg; + va_start (arg); + file = va_arg (arg, FILE *); + fmt = va_arg (arg, char *); + vfinfo (file, fmt, arg); + va_end (arg); +} @@ -391,18 +430,18 @@ va_dcl */ void -DEFUN_VOID(print_space) +print_space () { fprintf(config.map_file, " "); } void -DEFUN_VOID(print_nl) +print_nl () { fprintf(config.map_file, "\n"); } void -DEFUN(print_address,(value), - bfd_vma value) +print_address (value) + bfd_vma value; { fprintf_vma(config.map_file, value); } |