1*a9fa9459Szrj /* ldmisc.c 2*a9fa9459Szrj Copyright (C) 1991-2016 Free Software Foundation, Inc. 3*a9fa9459Szrj Written by Steve Chamberlain of Cygnus Support. 4*a9fa9459Szrj 5*a9fa9459Szrj This file is part of the GNU Binutils. 6*a9fa9459Szrj 7*a9fa9459Szrj This program is free software; you can redistribute it and/or modify 8*a9fa9459Szrj it under the terms of the GNU General Public License as published by 9*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or 10*a9fa9459Szrj (at your option) any later version. 11*a9fa9459Szrj 12*a9fa9459Szrj This program is distributed in the hope that it will be useful, 13*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 14*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*a9fa9459Szrj GNU General Public License for more details. 16*a9fa9459Szrj 17*a9fa9459Szrj You should have received a copy of the GNU General Public License 18*a9fa9459Szrj along with this program; if not, write to the Free Software 19*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20*a9fa9459Szrj MA 02110-1301, USA. */ 21*a9fa9459Szrj 22*a9fa9459Szrj #include "sysdep.h" 23*a9fa9459Szrj #include "bfd.h" 24*a9fa9459Szrj #include "bfdlink.h" 25*a9fa9459Szrj #include "libiberty.h" 26*a9fa9459Szrj #include "filenames.h" 27*a9fa9459Szrj #include "demangle.h" 28*a9fa9459Szrj #include <stdarg.h> 29*a9fa9459Szrj #include "ld.h" 30*a9fa9459Szrj #include "ldmisc.h" 31*a9fa9459Szrj #include "ldexp.h" 32*a9fa9459Szrj #include "ldlang.h" 33*a9fa9459Szrj #include <ldgram.h> 34*a9fa9459Szrj #include "ldlex.h" 35*a9fa9459Szrj #include "ldmain.h" 36*a9fa9459Szrj #include "ldfile.h" 37*a9fa9459Szrj #include "elf-bfd.h" 38*a9fa9459Szrj #include "coff-bfd.h" 39*a9fa9459Szrj 40*a9fa9459Szrj /* 41*a9fa9459Szrj %% literal % 42*a9fa9459Szrj %A section name from a section 43*a9fa9459Szrj %B filename from a bfd 44*a9fa9459Szrj %C clever filename:linenumber with function 45*a9fa9459Szrj %D like %C, but no function name 46*a9fa9459Szrj %E current bfd error or errno 47*a9fa9459Szrj %F error is fatal 48*a9fa9459Szrj %G like %D, but only function name 49*a9fa9459Szrj %H like %C but in addition emit section+offset 50*a9fa9459Szrj %I filename from a lang_input_statement_type 51*a9fa9459Szrj %P print program name 52*a9fa9459Szrj %R info about a relent 53*a9fa9459Szrj %S print script file and linenumber from etree_type. 54*a9fa9459Szrj %T symbol name 55*a9fa9459Szrj %V hex bfd_vma 56*a9fa9459Szrj %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces 57*a9fa9459Szrj %X no object output, fail return 58*a9fa9459Szrj %d integer, like printf 59*a9fa9459Szrj %ld long, like printf 60*a9fa9459Szrj %lu unsigned long, like printf 61*a9fa9459Szrj %p native (host) void* pointer, like printf 62*a9fa9459Szrj %s arbitrary string, like printf 63*a9fa9459Szrj %u integer, like printf 64*a9fa9459Szrj %v hex bfd_vma, no leading zeros 65*a9fa9459Szrj */ 66*a9fa9459Szrj 67*a9fa9459Szrj void 68*a9fa9459Szrj vfinfo (FILE *fp, const char *fmt, va_list arg, bfd_boolean is_warning) 69*a9fa9459Szrj { 70*a9fa9459Szrj bfd_boolean fatal = FALSE; 71*a9fa9459Szrj 72*a9fa9459Szrj while (*fmt != '\0') 73*a9fa9459Szrj { 74*a9fa9459Szrj const char *str = fmt; 75*a9fa9459Szrj while (*fmt != '%' && *fmt != '\0') 76*a9fa9459Szrj fmt++; 77*a9fa9459Szrj if (fmt != str) 78*a9fa9459Szrj if (fwrite (str, 1, fmt - str, fp)) 79*a9fa9459Szrj { 80*a9fa9459Szrj /* Ignore. */ 81*a9fa9459Szrj } 82*a9fa9459Szrj 83*a9fa9459Szrj if (*fmt == '%') 84*a9fa9459Szrj { 85*a9fa9459Szrj fmt++; 86*a9fa9459Szrj switch (*fmt++) 87*a9fa9459Szrj { 88*a9fa9459Szrj case '%': 89*a9fa9459Szrj /* literal % */ 90*a9fa9459Szrj putc ('%', fp); 91*a9fa9459Szrj break; 92*a9fa9459Szrj 93*a9fa9459Szrj case 'X': 94*a9fa9459Szrj /* no object output, fail return */ 95*a9fa9459Szrj config.make_executable = FALSE; 96*a9fa9459Szrj break; 97*a9fa9459Szrj 98*a9fa9459Szrj case 'V': 99*a9fa9459Szrj /* hex bfd_vma */ 100*a9fa9459Szrj { 101*a9fa9459Szrj bfd_vma value = va_arg (arg, bfd_vma); 102*a9fa9459Szrj fprintf_vma (fp, value); 103*a9fa9459Szrj } 104*a9fa9459Szrj break; 105*a9fa9459Szrj 106*a9fa9459Szrj case 'v': 107*a9fa9459Szrj /* hex bfd_vma, no leading zeros */ 108*a9fa9459Szrj { 109*a9fa9459Szrj char buf[100]; 110*a9fa9459Szrj char *p = buf; 111*a9fa9459Szrj bfd_vma value = va_arg (arg, bfd_vma); 112*a9fa9459Szrj sprintf_vma (p, value); 113*a9fa9459Szrj while (*p == '0') 114*a9fa9459Szrj p++; 115*a9fa9459Szrj if (!*p) 116*a9fa9459Szrj p--; 117*a9fa9459Szrj fputs (p, fp); 118*a9fa9459Szrj } 119*a9fa9459Szrj break; 120*a9fa9459Szrj 121*a9fa9459Szrj case 'W': 122*a9fa9459Szrj /* hex bfd_vma with 0x with no leading zeroes taking up 123*a9fa9459Szrj 8 spaces. */ 124*a9fa9459Szrj { 125*a9fa9459Szrj char buf[100]; 126*a9fa9459Szrj bfd_vma value; 127*a9fa9459Szrj char *p; 128*a9fa9459Szrj int len; 129*a9fa9459Szrj 130*a9fa9459Szrj value = va_arg (arg, bfd_vma); 131*a9fa9459Szrj sprintf_vma (buf, value); 132*a9fa9459Szrj for (p = buf; *p == '0'; ++p) 133*a9fa9459Szrj ; 134*a9fa9459Szrj if (*p == '\0') 135*a9fa9459Szrj --p; 136*a9fa9459Szrj len = strlen (p); 137*a9fa9459Szrj while (len < 8) 138*a9fa9459Szrj { 139*a9fa9459Szrj putc (' ', fp); 140*a9fa9459Szrj ++len; 141*a9fa9459Szrj } 142*a9fa9459Szrj fprintf (fp, "0x%s", p); 143*a9fa9459Szrj } 144*a9fa9459Szrj break; 145*a9fa9459Szrj 146*a9fa9459Szrj case 'T': 147*a9fa9459Szrj /* Symbol name. */ 148*a9fa9459Szrj { 149*a9fa9459Szrj const char *name = va_arg (arg, const char *); 150*a9fa9459Szrj 151*a9fa9459Szrj if (name == NULL || *name == 0) 152*a9fa9459Szrj { 153*a9fa9459Szrj fprintf (fp, _("no symbol")); 154*a9fa9459Szrj break; 155*a9fa9459Szrj } 156*a9fa9459Szrj else if (demangling) 157*a9fa9459Szrj { 158*a9fa9459Szrj char *demangled; 159*a9fa9459Szrj 160*a9fa9459Szrj demangled = bfd_demangle (link_info.output_bfd, name, 161*a9fa9459Szrj DMGL_ANSI | DMGL_PARAMS); 162*a9fa9459Szrj if (demangled != NULL) 163*a9fa9459Szrj { 164*a9fa9459Szrj fprintf (fp, "%s", demangled); 165*a9fa9459Szrj free (demangled); 166*a9fa9459Szrj break; 167*a9fa9459Szrj } 168*a9fa9459Szrj } 169*a9fa9459Szrj fprintf (fp, "%s", name); 170*a9fa9459Szrj } 171*a9fa9459Szrj break; 172*a9fa9459Szrj 173*a9fa9459Szrj case 'A': 174*a9fa9459Szrj /* section name from a section */ 175*a9fa9459Szrj { 176*a9fa9459Szrj asection *sec = va_arg (arg, asection *); 177*a9fa9459Szrj bfd *abfd = sec->owner; 178*a9fa9459Szrj const char *group = NULL; 179*a9fa9459Szrj struct coff_comdat_info *ci; 180*a9fa9459Szrj 181*a9fa9459Szrj fprintf (fp, "%s", sec->name); 182*a9fa9459Szrj if (abfd != NULL 183*a9fa9459Szrj && bfd_get_flavour (abfd) == bfd_target_elf_flavour 184*a9fa9459Szrj && elf_next_in_group (sec) != NULL 185*a9fa9459Szrj && (sec->flags & SEC_GROUP) == 0) 186*a9fa9459Szrj group = elf_group_name (sec); 187*a9fa9459Szrj else if (abfd != NULL 188*a9fa9459Szrj && bfd_get_flavour (abfd) == bfd_target_coff_flavour 189*a9fa9459Szrj && (ci = bfd_coff_get_comdat_section (sec->owner, 190*a9fa9459Szrj sec)) != NULL) 191*a9fa9459Szrj group = ci->name; 192*a9fa9459Szrj if (group != NULL) 193*a9fa9459Szrj fprintf (fp, "[%s]", group); 194*a9fa9459Szrj } 195*a9fa9459Szrj break; 196*a9fa9459Szrj 197*a9fa9459Szrj case 'B': 198*a9fa9459Szrj /* filename from a bfd */ 199*a9fa9459Szrj { 200*a9fa9459Szrj bfd *abfd = va_arg (arg, bfd *); 201*a9fa9459Szrj 202*a9fa9459Szrj if (abfd == NULL) 203*a9fa9459Szrj fprintf (fp, "%s generated", program_name); 204*a9fa9459Szrj else if (abfd->my_archive != NULL 205*a9fa9459Szrj && !bfd_is_thin_archive (abfd->my_archive)) 206*a9fa9459Szrj fprintf (fp, "%s(%s)", abfd->my_archive->filename, 207*a9fa9459Szrj abfd->filename); 208*a9fa9459Szrj else 209*a9fa9459Szrj fprintf (fp, "%s", abfd->filename); 210*a9fa9459Szrj } 211*a9fa9459Szrj break; 212*a9fa9459Szrj 213*a9fa9459Szrj case 'F': 214*a9fa9459Szrj /* Error is fatal. */ 215*a9fa9459Szrj fatal = TRUE; 216*a9fa9459Szrj break; 217*a9fa9459Szrj 218*a9fa9459Szrj case 'P': 219*a9fa9459Szrj /* Print program name. */ 220*a9fa9459Szrj fprintf (fp, "%s", program_name); 221*a9fa9459Szrj break; 222*a9fa9459Szrj 223*a9fa9459Szrj case 'E': 224*a9fa9459Szrj /* current bfd error or errno */ 225*a9fa9459Szrj fprintf (fp, "%s", bfd_errmsg (bfd_get_error ())); 226*a9fa9459Szrj break; 227*a9fa9459Szrj 228*a9fa9459Szrj case 'I': 229*a9fa9459Szrj /* filename from a lang_input_statement_type */ 230*a9fa9459Szrj { 231*a9fa9459Szrj lang_input_statement_type *i; 232*a9fa9459Szrj 233*a9fa9459Szrj i = va_arg (arg, lang_input_statement_type *); 234*a9fa9459Szrj if (i->the_bfd->my_archive != NULL 235*a9fa9459Szrj && !bfd_is_thin_archive (i->the_bfd->my_archive)) 236*a9fa9459Szrj fprintf (fp, "(%s)", 237*a9fa9459Szrj bfd_get_filename (i->the_bfd->my_archive)); 238*a9fa9459Szrj fprintf (fp, "%s", i->local_sym_name); 239*a9fa9459Szrj if ((i->the_bfd->my_archive == NULL 240*a9fa9459Szrj || bfd_is_thin_archive (i->the_bfd->my_archive)) 241*a9fa9459Szrj && filename_cmp (i->local_sym_name, i->filename) != 0) 242*a9fa9459Szrj fprintf (fp, " (%s)", i->filename); 243*a9fa9459Szrj } 244*a9fa9459Szrj break; 245*a9fa9459Szrj 246*a9fa9459Szrj case 'S': 247*a9fa9459Szrj /* Print script file and linenumber. */ 248*a9fa9459Szrj { 249*a9fa9459Szrj etree_type node; 250*a9fa9459Szrj etree_type *tp = va_arg (arg, etree_type *); 251*a9fa9459Szrj 252*a9fa9459Szrj if (tp == NULL) 253*a9fa9459Szrj { 254*a9fa9459Szrj tp = &node; 255*a9fa9459Szrj tp->type.filename = ldlex_filename (); 256*a9fa9459Szrj tp->type.lineno = lineno; 257*a9fa9459Szrj } 258*a9fa9459Szrj if (tp->type.filename != NULL) 259*a9fa9459Szrj fprintf (fp, "%s:%u", tp->type.filename, tp->type.lineno); 260*a9fa9459Szrj } 261*a9fa9459Szrj break; 262*a9fa9459Szrj 263*a9fa9459Szrj case 'R': 264*a9fa9459Szrj /* Print all that's interesting about a relent. */ 265*a9fa9459Szrj { 266*a9fa9459Szrj arelent *relent = va_arg (arg, arelent *); 267*a9fa9459Szrj 268*a9fa9459Szrj lfinfo (fp, "%s+0x%v (type %s)", 269*a9fa9459Szrj (*(relent->sym_ptr_ptr))->name, 270*a9fa9459Szrj relent->addend, 271*a9fa9459Szrj relent->howto->name); 272*a9fa9459Szrj } 273*a9fa9459Szrj break; 274*a9fa9459Szrj 275*a9fa9459Szrj case 'C': 276*a9fa9459Szrj case 'D': 277*a9fa9459Szrj case 'G': 278*a9fa9459Szrj case 'H': 279*a9fa9459Szrj /* Clever filename:linenumber with function name if possible. 280*a9fa9459Szrj The arguments are a BFD, a section, and an offset. */ 281*a9fa9459Szrj { 282*a9fa9459Szrj static bfd *last_bfd; 283*a9fa9459Szrj static char *last_file = NULL; 284*a9fa9459Szrj static char *last_function = NULL; 285*a9fa9459Szrj bfd *abfd; 286*a9fa9459Szrj asection *section; 287*a9fa9459Szrj bfd_vma offset; 288*a9fa9459Szrj asymbol **asymbols = NULL; 289*a9fa9459Szrj const char *filename; 290*a9fa9459Szrj const char *functionname; 291*a9fa9459Szrj unsigned int linenumber; 292*a9fa9459Szrj bfd_boolean discard_last; 293*a9fa9459Szrj bfd_boolean done; 294*a9fa9459Szrj 295*a9fa9459Szrj abfd = va_arg (arg, bfd *); 296*a9fa9459Szrj section = va_arg (arg, asection *); 297*a9fa9459Szrj offset = va_arg (arg, bfd_vma); 298*a9fa9459Szrj 299*a9fa9459Szrj if (abfd != NULL) 300*a9fa9459Szrj { 301*a9fa9459Szrj if (!bfd_generic_link_read_symbols (abfd)) 302*a9fa9459Szrj einfo (_("%B%F: could not read symbols: %E\n"), abfd); 303*a9fa9459Szrj 304*a9fa9459Szrj asymbols = bfd_get_outsymbols (abfd); 305*a9fa9459Szrj } 306*a9fa9459Szrj 307*a9fa9459Szrj /* The GNU Coding Standard requires that error messages 308*a9fa9459Szrj be of the form: 309*a9fa9459Szrj 310*a9fa9459Szrj source-file-name:lineno: message 311*a9fa9459Szrj 312*a9fa9459Szrj We do not always have a line number available so if 313*a9fa9459Szrj we cannot find them we print out the section name and 314*a9fa9459Szrj offset instead. */ 315*a9fa9459Szrj discard_last = TRUE; 316*a9fa9459Szrj if (abfd != NULL 317*a9fa9459Szrj && bfd_find_nearest_line (abfd, section, asymbols, offset, 318*a9fa9459Szrj &filename, &functionname, 319*a9fa9459Szrj &linenumber)) 320*a9fa9459Szrj { 321*a9fa9459Szrj if (functionname != NULL 322*a9fa9459Szrj && (fmt[-1] == 'C' || fmt[-1] == 'H')) 323*a9fa9459Szrj { 324*a9fa9459Szrj /* Detect the case where we are printing out a 325*a9fa9459Szrj message for the same function as the last 326*a9fa9459Szrj call to vinfo ("%C"). In this situation do 327*a9fa9459Szrj not print out the ABFD filename or the 328*a9fa9459Szrj function name again. Note - we do still 329*a9fa9459Szrj print out the source filename, as this will 330*a9fa9459Szrj allow programs that parse the linker's output 331*a9fa9459Szrj (eg emacs) to correctly locate multiple 332*a9fa9459Szrj errors in the same source file. */ 333*a9fa9459Szrj if (last_bfd == NULL 334*a9fa9459Szrj || last_file == NULL 335*a9fa9459Szrj || last_function == NULL 336*a9fa9459Szrj || last_bfd != abfd 337*a9fa9459Szrj || (filename != NULL 338*a9fa9459Szrj && filename_cmp (last_file, filename) != 0) 339*a9fa9459Szrj || strcmp (last_function, functionname) != 0) 340*a9fa9459Szrj { 341*a9fa9459Szrj lfinfo (fp, _("%B: In function `%T':\n"), 342*a9fa9459Szrj abfd, functionname); 343*a9fa9459Szrj 344*a9fa9459Szrj last_bfd = abfd; 345*a9fa9459Szrj if (last_file != NULL) 346*a9fa9459Szrj free (last_file); 347*a9fa9459Szrj last_file = NULL; 348*a9fa9459Szrj if (filename) 349*a9fa9459Szrj last_file = xstrdup (filename); 350*a9fa9459Szrj if (last_function != NULL) 351*a9fa9459Szrj free (last_function); 352*a9fa9459Szrj last_function = xstrdup (functionname); 353*a9fa9459Szrj } 354*a9fa9459Szrj discard_last = FALSE; 355*a9fa9459Szrj } 356*a9fa9459Szrj else 357*a9fa9459Szrj lfinfo (fp, "%B:", abfd); 358*a9fa9459Szrj 359*a9fa9459Szrj if (filename != NULL) 360*a9fa9459Szrj fprintf (fp, "%s:", filename); 361*a9fa9459Szrj 362*a9fa9459Szrj done = fmt[-1] != 'H'; 363*a9fa9459Szrj if (functionname != NULL && fmt[-1] == 'G') 364*a9fa9459Szrj lfinfo (fp, "%T", functionname); 365*a9fa9459Szrj else if (filename != NULL && linenumber != 0) 366*a9fa9459Szrj fprintf (fp, "%u%s", linenumber, done ? "" : ":"); 367*a9fa9459Szrj else 368*a9fa9459Szrj done = FALSE; 369*a9fa9459Szrj } 370*a9fa9459Szrj else 371*a9fa9459Szrj { 372*a9fa9459Szrj lfinfo (fp, "%B:", abfd); 373*a9fa9459Szrj done = FALSE; 374*a9fa9459Szrj } 375*a9fa9459Szrj if (!done) 376*a9fa9459Szrj lfinfo (fp, "(%A+0x%v)", section, offset); 377*a9fa9459Szrj 378*a9fa9459Szrj if (discard_last) 379*a9fa9459Szrj { 380*a9fa9459Szrj last_bfd = NULL; 381*a9fa9459Szrj if (last_file != NULL) 382*a9fa9459Szrj { 383*a9fa9459Szrj free (last_file); 384*a9fa9459Szrj last_file = NULL; 385*a9fa9459Szrj } 386*a9fa9459Szrj if (last_function != NULL) 387*a9fa9459Szrj { 388*a9fa9459Szrj free (last_function); 389*a9fa9459Szrj last_function = NULL; 390*a9fa9459Szrj } 391*a9fa9459Szrj } 392*a9fa9459Szrj } 393*a9fa9459Szrj break; 394*a9fa9459Szrj 395*a9fa9459Szrj case 'p': 396*a9fa9459Szrj /* native (host) void* pointer, like printf */ 397*a9fa9459Szrj fprintf (fp, "%p", va_arg (arg, void *)); 398*a9fa9459Szrj break; 399*a9fa9459Szrj 400*a9fa9459Szrj case 's': 401*a9fa9459Szrj /* arbitrary string, like printf */ 402*a9fa9459Szrj fprintf (fp, "%s", va_arg (arg, char *)); 403*a9fa9459Szrj break; 404*a9fa9459Szrj 405*a9fa9459Szrj case 'd': 406*a9fa9459Szrj /* integer, like printf */ 407*a9fa9459Szrj fprintf (fp, "%d", va_arg (arg, int)); 408*a9fa9459Szrj break; 409*a9fa9459Szrj 410*a9fa9459Szrj case 'u': 411*a9fa9459Szrj /* unsigned integer, like printf */ 412*a9fa9459Szrj fprintf (fp, "%u", va_arg (arg, unsigned int)); 413*a9fa9459Szrj break; 414*a9fa9459Szrj 415*a9fa9459Szrj case 'l': 416*a9fa9459Szrj if (*fmt == 'd') 417*a9fa9459Szrj { 418*a9fa9459Szrj fprintf (fp, "%ld", va_arg (arg, long)); 419*a9fa9459Szrj ++fmt; 420*a9fa9459Szrj break; 421*a9fa9459Szrj } 422*a9fa9459Szrj else if (*fmt == 'u') 423*a9fa9459Szrj { 424*a9fa9459Szrj fprintf (fp, "%lu", va_arg (arg, unsigned long)); 425*a9fa9459Szrj ++fmt; 426*a9fa9459Szrj break; 427*a9fa9459Szrj } 428*a9fa9459Szrj /* Fall thru */ 429*a9fa9459Szrj 430*a9fa9459Szrj default: 431*a9fa9459Szrj fprintf (fp, "%%%c", fmt[-1]); 432*a9fa9459Szrj break; 433*a9fa9459Szrj } 434*a9fa9459Szrj } 435*a9fa9459Szrj } 436*a9fa9459Szrj 437*a9fa9459Szrj if (is_warning && config.fatal_warnings) 438*a9fa9459Szrj config.make_executable = FALSE; 439*a9fa9459Szrj 440*a9fa9459Szrj if (fatal) 441*a9fa9459Szrj xexit (1); 442*a9fa9459Szrj } 443*a9fa9459Szrj 444*a9fa9459Szrj /* Format info message and print on stdout. */ 445*a9fa9459Szrj 446*a9fa9459Szrj /* (You would think this should be called just "info", but then you 447*a9fa9459Szrj would be hosed by LynxOS, which defines that name in its libc.) */ 448*a9fa9459Szrj 449*a9fa9459Szrj void 450*a9fa9459Szrj info_msg (const char *fmt, ...) 451*a9fa9459Szrj { 452*a9fa9459Szrj va_list arg; 453*a9fa9459Szrj 454*a9fa9459Szrj va_start (arg, fmt); 455*a9fa9459Szrj vfinfo (stdout, fmt, arg, FALSE); 456*a9fa9459Szrj va_end (arg); 457*a9fa9459Szrj } 458*a9fa9459Szrj 459*a9fa9459Szrj /* ('e' for error.) Format info message and print on stderr. */ 460*a9fa9459Szrj 461*a9fa9459Szrj void 462*a9fa9459Szrj einfo (const char *fmt, ...) 463*a9fa9459Szrj { 464*a9fa9459Szrj va_list arg; 465*a9fa9459Szrj 466*a9fa9459Szrj fflush (stdout); 467*a9fa9459Szrj va_start (arg, fmt); 468*a9fa9459Szrj vfinfo (stderr, fmt, arg, TRUE); 469*a9fa9459Szrj va_end (arg); 470*a9fa9459Szrj fflush (stderr); 471*a9fa9459Szrj } 472*a9fa9459Szrj 473*a9fa9459Szrj void 474*a9fa9459Szrj info_assert (const char *file, unsigned int line) 475*a9fa9459Szrj { 476*a9fa9459Szrj einfo (_("%F%P: internal error %s %d\n"), file, line); 477*a9fa9459Szrj } 478*a9fa9459Szrj 479*a9fa9459Szrj /* ('m' for map) Format info message and print on map. */ 480*a9fa9459Szrj 481*a9fa9459Szrj void 482*a9fa9459Szrj minfo (const char *fmt, ...) 483*a9fa9459Szrj { 484*a9fa9459Szrj if (config.map_file != NULL) 485*a9fa9459Szrj { 486*a9fa9459Szrj va_list arg; 487*a9fa9459Szrj 488*a9fa9459Szrj va_start (arg, fmt); 489*a9fa9459Szrj if (fmt[0] == '%' && fmt[1] == '!' && fmt[2] == 0) 490*a9fa9459Szrj { 491*a9fa9459Szrj /* Stash info about --as-needed shared libraries. Print 492*a9fa9459Szrj later so they don't appear intermingled with archive 493*a9fa9459Szrj library info. */ 494*a9fa9459Szrj struct asneeded_minfo *m = xmalloc (sizeof *m); 495*a9fa9459Szrj 496*a9fa9459Szrj m->next = NULL; 497*a9fa9459Szrj m->soname = va_arg (arg, const char *); 498*a9fa9459Szrj m->ref = va_arg (arg, bfd *); 499*a9fa9459Szrj m->name = va_arg (arg, const char *); 500*a9fa9459Szrj *asneeded_list_tail = m; 501*a9fa9459Szrj asneeded_list_tail = &m->next; 502*a9fa9459Szrj } 503*a9fa9459Szrj else 504*a9fa9459Szrj vfinfo (config.map_file, fmt, arg, FALSE); 505*a9fa9459Szrj va_end (arg); 506*a9fa9459Szrj } 507*a9fa9459Szrj } 508*a9fa9459Szrj 509*a9fa9459Szrj void 510*a9fa9459Szrj lfinfo (FILE *file, const char *fmt, ...) 511*a9fa9459Szrj { 512*a9fa9459Szrj va_list arg; 513*a9fa9459Szrj 514*a9fa9459Szrj va_start (arg, fmt); 515*a9fa9459Szrj vfinfo (file, fmt, arg, FALSE); 516*a9fa9459Szrj va_end (arg); 517*a9fa9459Szrj } 518*a9fa9459Szrj 519*a9fa9459Szrj /* Functions to print the link map. */ 520*a9fa9459Szrj 521*a9fa9459Szrj void 522*a9fa9459Szrj print_space (void) 523*a9fa9459Szrj { 524*a9fa9459Szrj fprintf (config.map_file, " "); 525*a9fa9459Szrj } 526*a9fa9459Szrj 527*a9fa9459Szrj void 528*a9fa9459Szrj print_nl (void) 529*a9fa9459Szrj { 530*a9fa9459Szrj fprintf (config.map_file, "\n"); 531*a9fa9459Szrj } 532*a9fa9459Szrj 533*a9fa9459Szrj /* A more or less friendly abort message. In ld.h abort is defined to 534*a9fa9459Szrj call this function. */ 535*a9fa9459Szrj 536*a9fa9459Szrj void 537*a9fa9459Szrj ld_abort (const char *file, int line, const char *fn) 538*a9fa9459Szrj { 539*a9fa9459Szrj if (fn != NULL) 540*a9fa9459Szrj einfo (_("%P: internal error: aborting at %s:%d in %s\n"), 541*a9fa9459Szrj file, line, fn); 542*a9fa9459Szrj else 543*a9fa9459Szrj einfo (_("%P: internal error: aborting at %s:%d\n"), 544*a9fa9459Szrj file, line); 545*a9fa9459Szrj einfo (_("%P%F: please report this bug\n")); 546*a9fa9459Szrj xexit (1); 547*a9fa9459Szrj } 548