Subversion Repositories Kolibri OS

Rev

Rev 5199 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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