Subversion Repositories Kolibri OS

Rev

Rev 5197 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5197 serge 1
/* Generic BFD library interface and support routines.
6324 serge 2
   Copyright (C) 1990-2015 Free Software Foundation, Inc.
5197 serge 3
   Written by Cygnus Support.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
/*
23
INODE
24
typedef bfd, Error reporting, BFD front end, BFD front end
25
 
26
SECTION
27
	<>
28
 
29
	A BFD has type <>; objects of this type are the
30
	cornerstone of any application using BFD. Using BFD
31
	consists of making references though the BFD and to data in the BFD.
32
 
33
	Here is the structure that defines the type <>.  It
34
	contains the major data about the file and pointers
35
	to the rest of the data.
36
 
37
CODE_FRAGMENT
38
.
39
.enum bfd_direction
40
.  {
41
.    no_direction = 0,
42
.    read_direction = 1,
43
.    write_direction = 2,
44
.    both_direction = 3
45
.  };
46
.
6324 serge 47
.enum bfd_plugin_format
48
.  {
49
.    bfd_plugin_uknown = 0,
50
.    bfd_plugin_yes = 1,
51
.    bfd_plugin_no = 2
52
.  };
53
.
54
.struct bfd_build_id
55
.  {
56
.    bfd_size_type size;
57
.    bfd_byte data[1];
58
.  };
59
.
5197 serge 60
.struct bfd
61
.{
62
.  {* The filename the application opened the BFD with.  *}
63
.  const char *filename;
64
.
65
.  {* A pointer to the target jump table.  *}
66
.  const struct bfd_target *xvec;
67
.
68
.  {* The IOSTREAM, and corresponding IO vector that provide access
69
.     to the file backing the BFD.  *}
70
.  void *iostream;
71
.  const struct bfd_iovec *iovec;
72
.
73
.  {* The caching routines use these to maintain a
74
.     least-recently-used list of BFDs.  *}
75
.  struct bfd *lru_prev, *lru_next;
76
.
77
.  {* When a file is closed by the caching routines, BFD retains
78
.     state information on the file here...  *}
79
.  ufile_ptr where;
80
.
81
.  {* File modified time, if mtime_set is TRUE.  *}
82
.  long mtime;
83
.
6324 serge 84
.  {* A unique identifier of the BFD  *}
85
.  unsigned int id;
5197 serge 86
.
87
.  {* The format which belongs to the BFD. (object, core, etc.)  *}
6324 serge 88
.  ENUM_BITFIELD (bfd_format) format : 3;
5197 serge 89
.
90
.  {* The direction with which the BFD was opened.  *}
6324 serge 91
.  ENUM_BITFIELD (bfd_direction) direction : 2;
5197 serge 92
.
93
.  {* Format_specific flags.  *}
6324 serge 94
.  flagword flags : 18;
5197 serge 95
.
96
.  {* Values that may appear in the flags field of a BFD.  These also
97
.     appear in the object_flags field of the bfd_target structure, where
98
.     they indicate the set of flags used by that backend (not all flags
99
.     are meaningful for all object file formats) (FIXME: at the moment,
100
.     the object_flags values have mostly just been copied from backend
101
.     to another, and are not necessarily correct).  *}
102
.
103
.#define BFD_NO_FLAGS	0x00
104
.
105
.  {* BFD contains relocation entries.  *}
106
.#define HAS_RELOC   	0x01
107
.
108
.  {* BFD is directly executable.  *}
109
.#define EXEC_P      	0x02
110
.
111
.  {* BFD has line number information (basically used for F_LNNO in a
112
.     COFF header).  *}
113
.#define HAS_LINENO  	0x04
114
.
115
.  {* BFD has debugging information.  *}
116
.#define HAS_DEBUG   	0x08
117
.
118
.  {* BFD has symbols.  *}
119
.#define HAS_SYMS    	0x10
120
.
121
.  {* BFD has local symbols (basically used for F_LSYMS in a COFF
122
.     header).  *}
123
.#define HAS_LOCALS  	0x20
124
.
125
.  {* BFD is a dynamic object.  *}
126
.#define DYNAMIC     	0x40
127
.
128
.  {* Text section is write protected (if D_PAGED is not set, this is
129
.     like an a.out NMAGIC file) (the linker sets this by default, but
130
.     clears it for -r or -N).  *}
131
.#define WP_TEXT     	0x80
132
.
133
.  {* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
134
.     linker sets this by default, but clears it for -r or -n or -N).  *}
135
.#define D_PAGED     	0x100
136
.
137
.  {* BFD is relaxable (this means that bfd_relax_section may be able to
138
.     do something) (sometimes bfd_relax_section can do something even if
139
.     this is not set).  *}
140
.#define BFD_IS_RELAXABLE 0x200
141
.
142
.  {* This may be set before writing out a BFD to request using a
143
.     traditional format.  For example, this is used to request that when
144
.     writing out an a.out object the symbols not be hashed to eliminate
145
.     duplicates.  *}
146
.#define BFD_TRADITIONAL_FORMAT 0x400
147
.
148
.  {* This flag indicates that the BFD contents are actually cached
149
.     in memory.  If this is set, iostream points to a bfd_in_memory
150
.     struct.  *}
151
.#define BFD_IN_MEMORY 0x800
152
.
153
.  {* This BFD has been created by the linker and doesn't correspond
154
.     to any input file.  *}
6324 serge 155
.#define BFD_LINKER_CREATED 0x1000
5197 serge 156
.
157
.  {* This may be set before writing out a BFD to request that it
158
.     be written using values for UIDs, GIDs, timestamps, etc. that
159
.     will be consistent from run to run.  *}
6324 serge 160
.#define BFD_DETERMINISTIC_OUTPUT 0x2000
5197 serge 161
.
162
.  {* Compress sections in this BFD.  *}
6324 serge 163
.#define BFD_COMPRESS 0x4000
5197 serge 164
.
165
.  {* Decompress sections in this BFD.  *}
6324 serge 166
.#define BFD_DECOMPRESS 0x8000
5197 serge 167
.
168
.  {* BFD is a dummy, for plugins.  *}
6324 serge 169
.#define BFD_PLUGIN 0x10000
5197 serge 170
.
6324 serge 171
.  {* Compress sections in this BFD with SHF_COMPRESSED from gABI.  *}
172
.#define BFD_COMPRESS_GABI 0x20000
173
.
5197 serge 174
.  {* Flags bits to be saved in bfd_preserve_save.  *}
175
.#define BFD_FLAGS_SAVED \
6324 serge 176
.  (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_PLUGIN \
177
.   | BFD_COMPRESS_GABI)
5197 serge 178
.
179
.  {* Flags bits which are for BFD use only.  *}
180
.#define BFD_FLAGS_FOR_BFD_USE_MASK \
181
.  (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
6324 serge 182
.   | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT \
183
.   | BFD_COMPRESS_GABI)
5197 serge 184
.
6324 serge 185
.  {* Is the file descriptor being cached?  That is, can it be closed as
186
.     needed, and re-opened when accessed later?  *}
187
.  unsigned int cacheable : 1;
188
.
189
.  {* Marks whether there was a default target specified when the
190
.     BFD was opened. This is used to select which matching algorithm
191
.     to use to choose the back end.  *}
192
.  unsigned int target_defaulted : 1;
193
.
194
.  {* ... and here: (``once'' means at least once).  *}
195
.  unsigned int opened_once : 1;
196
.
197
.  {* Set if we have a locally maintained mtime value, rather than
198
.     getting it from the file each time.  *}
199
.  unsigned int mtime_set : 1;
200
.
201
.  {* Flag set if symbols from this BFD should not be exported.  *}
202
.  unsigned int no_export : 1;
203
.
204
.  {* Remember when output has begun, to stop strange things
205
.     from happening.  *}
206
.  unsigned int output_has_begun : 1;
207
.
208
.  {* Have archive map.  *}
209
.  unsigned int has_armap : 1;
210
.
211
.  {* Set if this is a thin archive.  *}
212
.  unsigned int is_thin_archive : 1;
213
.
214
.  {* Set if only required symbols should be added in the link hash table for
215
.     this object.  Used by VMS linkers.  *}
216
.  unsigned int selective_search : 1;
217
.
218
.  {* Set if this is the linker output BFD.  *}
219
.  unsigned int is_linker_output : 1;
220
.
221
.  {* Set if this is the linker input BFD.  *}
222
.  unsigned int is_linker_input : 1;
223
.
224
.  {* If this is an input for a compiler plug-in library.  *}
225
.  ENUM_BITFIELD (bfd_plugin_format) plugin_format : 2;
226
.
227
.  {* Set if this is a plugin output file.  *}
228
.  unsigned int lto_output : 1;
229
.
230
.  {* Set to dummy BFD created when claimed by a compiler plug-in
231
.     library.  *}
232
.  bfd *plugin_dummy_bfd;
233
.
5197 serge 234
.  {* Currently my_archive is tested before adding origin to
235
.     anything. I believe that this can become always an add of
236
.     origin, with origin set to 0 for non archive files.  *}
237
.  ufile_ptr origin;
238
.
239
.  {* The origin in the archive of the proxy entry.  This will
240
.     normally be the same as origin, except for thin archives,
241
.     when it will contain the current offset of the proxy in the
242
.     thin archive rather than the offset of the bfd in its actual
243
.     container.  *}
244
.  ufile_ptr proxy_origin;
245
.
246
.  {* A hash table for section names.  *}
247
.  struct bfd_hash_table section_htab;
248
.
249
.  {* Pointer to linked list of sections.  *}
250
.  struct bfd_section *sections;
251
.
252
.  {* The last section on the section list.  *}
253
.  struct bfd_section *section_last;
254
.
255
.  {* The number of sections.  *}
256
.  unsigned int section_count;
257
.
6324 serge 258
.  {* A field used by _bfd_generic_link_add_archive_symbols.  This will
259
.     be used only for archive elements.  *}
260
.  int archive_pass;
261
.
5197 serge 262
.  {* Stuff only useful for object files:
263
.     The start address.  *}
264
.  bfd_vma start_address;
265
.
266
.  {* Symbol table for output BFD (with symcount entries).
267
.     Also used by the linker to cache input BFD symbols.  *}
268
.  struct bfd_symbol  **outsymbols;
269
.
6324 serge 270
.  {* Used for input and output.  *}
271
.  unsigned int symcount;
272
.
5197 serge 273
.  {* Used for slurped dynamic symbol tables.  *}
274
.  unsigned int dynsymcount;
275
.
276
.  {* Pointer to structure which contains architecture information.  *}
277
.  const struct bfd_arch_info *arch_info;
278
.
279
.  {* Stuff only useful for archives.  *}
280
.  void *arelt_data;
281
.  struct bfd *my_archive;      {* The containing archive BFD.  *}
282
.  struct bfd *archive_next;    {* The next BFD in the archive.  *}
283
.  struct bfd *archive_head;    {* The first BFD in the archive.  *}
284
.  struct bfd *nested_archives; {* List of nested archive in a flattened
285
.                                  thin archive.  *}
286
.
6324 serge 287
.  union {
288
.    {* For input BFDs, a chain of BFDs involved in a link.  *}
289
.    struct bfd *next;
290
.    {* For output BFD, the linker hash table.  *}
291
.    struct bfd_link_hash_table *hash;
292
.  } link;
5197 serge 293
.
294
.  {* Used by the back end to hold private data.  *}
295
.  union
296
.    {
297
.      struct aout_data_struct *aout_data;
298
.      struct artdata *aout_ar_data;
299
.      struct _oasys_data *oasys_obj_data;
300
.      struct _oasys_ar_data *oasys_ar_data;
301
.      struct coff_tdata *coff_obj_data;
302
.      struct pe_tdata *pe_obj_data;
303
.      struct xcoff_tdata *xcoff_obj_data;
304
.      struct ecoff_tdata *ecoff_obj_data;
305
.      struct ieee_data_struct *ieee_data;
306
.      struct ieee_ar_data_struct *ieee_ar_data;
307
.      struct srec_data_struct *srec_data;
308
.      struct verilog_data_struct *verilog_data;
309
.      struct ihex_data_struct *ihex_data;
310
.      struct tekhex_data_struct *tekhex_data;
311
.      struct elf_obj_tdata *elf_obj_data;
312
.      struct nlm_obj_tdata *nlm_obj_data;
313
.      struct bout_data_struct *bout_data;
314
.      struct mmo_data_struct *mmo_data;
315
.      struct sun_core_struct *sun_core_data;
316
.      struct sco5_core_struct *sco5_core_data;
317
.      struct trad_core_struct *trad_core_data;
318
.      struct som_data_struct *som_data;
319
.      struct hpux_core_struct *hpux_core_data;
320
.      struct hppabsd_core_struct *hppabsd_core_data;
321
.      struct sgi_core_struct *sgi_core_data;
322
.      struct lynx_core_struct *lynx_core_data;
323
.      struct osf_core_struct *osf_core_data;
324
.      struct cisco_core_struct *cisco_core_data;
325
.      struct versados_data_struct *versados_data;
326
.      struct netbsd_core_struct *netbsd_core_data;
327
.      struct mach_o_data_struct *mach_o_data;
328
.      struct mach_o_fat_data_struct *mach_o_fat_data;
329
.      struct plugin_data_struct *plugin_data;
330
.      struct bfd_pef_data_struct *pef_data;
331
.      struct bfd_pef_xlib_data_struct *pef_xlib_data;
332
.      struct bfd_sym_data_struct *sym_data;
333
.      void *any;
334
.    }
335
.  tdata;
336
.
337
.  {* Used by the application to hold private data.  *}
338
.  void *usrdata;
339
.
340
.  {* Where all the allocated stuff under this BFD goes.  This is a
341
.     struct objalloc *, but we use void * to avoid requiring the inclusion
342
.     of objalloc.h.  *}
343
.  void *memory;
344
.
6324 serge 345
.  {* For input BFDs, the build ID, if the object has one. *}
346
.  const struct bfd_build_id *build_id;
347
.};
5197 serge 348
.
6324 serge 349
.{* See note beside bfd_set_section_userdata.  *}
350
.static inline bfd_boolean
351
.bfd_set_cacheable (bfd * abfd, bfd_boolean val)
352
.{
353
.  abfd->cacheable = val;
354
.  return TRUE;
355
.}
5197 serge 356
.
357
*/
358
 
359
#include "sysdep.h"
360
#include 
361
#include "bfd.h"
362
#include "bfdver.h"
363
#include "libiberty.h"
364
#include "demangle.h"
365
#include "safe-ctype.h"
366
#include "bfdlink.h"
367
#include "libbfd.h"
368
#include "coff/internal.h"
369
#include "coff/sym.h"
370
#include "libcoff.h"
371
#include "libecoff.h"
372
#undef obj_symbols
373
#include "elf-bfd.h"
374
 
375
#ifndef EXIT_FAILURE
376
#define EXIT_FAILURE 1
377
#endif
378
 
379
 
380
/* provide storage for subsystem, stack and heap data which may have been
381
   passed in on the command line.  Ld puts this data into a bfd_link_info
382
   struct which ultimately gets passed in to the bfd.  When it arrives, copy
383
   it to the following struct so that the data will be available in coffcode.h
384
   where it is needed.  The typedef's used are defined in bfd.h */
385
 
386
/*
387
INODE
388
Error reporting, Miscellaneous, typedef bfd, BFD front end
389
 
390
SECTION
391
	Error reporting
392
 
393
	Most BFD functions return nonzero on success (check their
394
	individual documentation for precise semantics).  On an error,
395
	they call <> to set an error condition that callers
396
	can check by calling <>.
397
        If that returns <>, then check
398
	<>.
399
 
400
	The easiest way to report a BFD error to the user is to
401
	use <>.
402
 
403
SUBSECTION
404
	Type <>
405
 
406
	The values returned by <> are defined by the
407
	enumerated type <>.
408
 
409
CODE_FRAGMENT
410
.
411
.typedef enum bfd_error
412
.{
413
.  bfd_error_no_error = 0,
414
.  bfd_error_system_call,
415
.  bfd_error_invalid_target,
416
.  bfd_error_wrong_format,
417
.  bfd_error_wrong_object_format,
418
.  bfd_error_invalid_operation,
419
.  bfd_error_no_memory,
420
.  bfd_error_no_symbols,
421
.  bfd_error_no_armap,
422
.  bfd_error_no_more_archived_files,
423
.  bfd_error_malformed_archive,
424
.  bfd_error_missing_dso,
425
.  bfd_error_file_not_recognized,
426
.  bfd_error_file_ambiguously_recognized,
427
.  bfd_error_no_contents,
428
.  bfd_error_nonrepresentable_section,
429
.  bfd_error_no_debug_section,
430
.  bfd_error_bad_value,
431
.  bfd_error_file_truncated,
432
.  bfd_error_file_too_big,
433
.  bfd_error_on_input,
434
.  bfd_error_invalid_error_code
435
.}
436
.bfd_error_type;
437
.
438
*/
439
 
440
static bfd_error_type bfd_error = bfd_error_no_error;
441
static bfd *input_bfd = NULL;
442
static bfd_error_type input_error = bfd_error_no_error;
443
 
444
const char *const bfd_errmsgs[] =
445
{
446
  N_("No error"),
447
  N_("System call error"),
448
  N_("Invalid bfd target"),
449
  N_("File in wrong format"),
450
  N_("Archive object file in wrong format"),
451
  N_("Invalid operation"),
452
  N_("Memory exhausted"),
453
  N_("No symbols"),
454
  N_("Archive has no index; run ranlib to add one"),
455
  N_("No more archived files"),
456
  N_("Malformed archive"),
457
  N_("DSO missing from command line"),
458
  N_("File format not recognized"),
459
  N_("File format is ambiguous"),
460
  N_("Section has no contents"),
461
  N_("Nonrepresentable section on output"),
462
  N_("Symbol needs debug section which does not exist"),
463
  N_("Bad value"),
464
  N_("File truncated"),
465
  N_("File too big"),
466
  N_("Error reading %s: %s"),
467
  N_("#")
468
};
469
 
470
/*
471
FUNCTION
472
	bfd_get_error
473
 
474
SYNOPSIS
475
	bfd_error_type bfd_get_error (void);
476
 
477
DESCRIPTION
478
	Return the current BFD error condition.
479
*/
480
 
481
bfd_error_type
482
bfd_get_error (void)
483
{
484
  return bfd_error;
485
}
486
 
487
/*
488
FUNCTION
489
	bfd_set_error
490
 
491
SYNOPSIS
492
	void bfd_set_error (bfd_error_type error_tag, ...);
493
 
494
DESCRIPTION
495
	Set the BFD error condition to be @var{error_tag}.
496
	If @var{error_tag} is bfd_error_on_input, then this function
497
	takes two more parameters, the input bfd where the error
498
	occurred, and the bfd_error_type error.
499
*/
500
 
501
void
502
bfd_set_error (bfd_error_type error_tag, ...)
503
{
504
  bfd_error = error_tag;
505
  if (error_tag == bfd_error_on_input)
506
    {
507
      /* This is an error that occurred during bfd_close when
508
	 writing an archive, but on one of the input files.  */
509
      va_list ap;
510
 
511
      va_start (ap, error_tag);
512
      input_bfd = va_arg (ap, bfd *);
513
      input_error = (bfd_error_type) va_arg (ap, int);
514
      if (input_error >= bfd_error_on_input)
515
	abort ();
516
      va_end (ap);
517
    }
518
}
519
 
520
/*
521
FUNCTION
522
	bfd_errmsg
523
 
524
SYNOPSIS
525
	const char *bfd_errmsg (bfd_error_type error_tag);
526
 
527
DESCRIPTION
528
	Return a string describing the error @var{error_tag}, or
529
	the system error if @var{error_tag} is <>.
530
*/
531
 
532
const char *
533
bfd_errmsg (bfd_error_type error_tag)
534
{
535
#ifndef errno
536
  extern int errno;
537
#endif
538
  if (error_tag == bfd_error_on_input)
539
    {
540
      char *buf;
541
      const char *msg = bfd_errmsg (input_error);
542
 
543
      if (asprintf (&buf, _(bfd_errmsgs [error_tag]), input_bfd->filename, msg)
544
	  != -1)
545
	return buf;
546
 
547
      /* Ick, what to do on out of memory?  */
548
      return msg;
549
    }
550
 
551
  if (error_tag == bfd_error_system_call)
552
    return xstrerror (errno);
553
 
554
  if (error_tag > bfd_error_invalid_error_code)
555
    error_tag = bfd_error_invalid_error_code;	/* sanity check */
556
 
557
  return _(bfd_errmsgs [error_tag]);
558
}
559
 
560
/*
561
FUNCTION
562
	bfd_perror
563
 
564
SYNOPSIS
565
	void bfd_perror (const char *message);
566
 
567
DESCRIPTION
568
	Print to the standard error stream a string describing the
569
	last BFD error that occurred, or the last system error if
570
	the last BFD error was a system call failure.  If @var{message}
571
	is non-NULL and non-empty, the error string printed is preceded
572
	by @var{message}, a colon, and a space.  It is followed by a newline.
573
*/
574
 
575
void
576
bfd_perror (const char *message)
577
{
578
  fflush (stdout);
579
  if (message == NULL || *message == '\0')
580
    fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ()));
581
  else
582
    fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ()));
583
  fflush (stderr);
584
}
585
 
586
/*
587
SUBSECTION
588
	BFD error handler
589
 
590
	Some BFD functions want to print messages describing the
591
	problem.  They call a BFD error handler function.  This
592
	function may be overridden by the program.
593
 
594
	The BFD error handler acts like printf.
595
 
596
CODE_FRAGMENT
597
.
598
.typedef void (*bfd_error_handler_type) (const char *, ...);
599
.
600
*/
601
 
602
/* The program name used when printing BFD error messages.  */
603
 
604
static const char *_bfd_error_program_name;
605
 
606
/* This is the default routine to handle BFD error messages.
607
   Like fprintf (stderr, ...), but also handles some extra format specifiers.
608
 
609
   %A section name from section.  For group components, print group name too.
610
   %B file name from bfd.  For archive components, prints archive too.
611
 
612
   Note - because these two extra format specifiers require special handling
613
   they are scanned for and processed in this function, before calling
614
   vfprintf.  This means that the *arguments* for these format specifiers
615
   must be the first ones in the variable argument list, regardless of where
616
   the specifiers appear in the format string.  Thus for example calling
617
   this function with a format string of:
618
 
619
      "blah %s blah %A blah %d blah %B"
620
 
621
   would involve passing the arguments as:
622
 
623
      "blah %s blah %A blah %d blah %B",
624
        asection_for_the_%A,
625
	bfd_for_the_%B,
626
	string_for_the_%s,
627
	integer_for_the_%d);
628
 */
629
 
630
void
631
_bfd_default_error_handler (const char *fmt, ...)
632
{
633
  va_list ap;
634
  char *bufp;
635
  const char *new_fmt, *p;
636
  size_t avail = 1000;
637
  char buf[1000];
638
 
639
  /* PR 4992: Don't interrupt output being sent to stdout.  */
640
  fflush (stdout);
641
 
642
  if (_bfd_error_program_name != NULL)
643
    fprintf (stderr, "%s: ", _bfd_error_program_name);
644
  else
645
    fprintf (stderr, "BFD: ");
646
 
647
  va_start (ap, fmt);
648
  new_fmt = fmt;
649
  bufp = buf;
650
 
651
  /* Reserve enough space for the existing format string.  */
652
  avail -= strlen (fmt) + 1;
653
  if (avail > 1000)
654
    _exit (EXIT_FAILURE);
655
 
656
  p = fmt;
657
  while (1)
658
    {
659
      char *q;
660
      size_t len, extra, trim;
661
 
662
      p = strchr (p, '%');
663
      if (p == NULL || p[1] == '\0')
664
	{
665
	  if (new_fmt == buf)
666
	    {
667
	      len = strlen (fmt);
668
	      memcpy (bufp, fmt, len + 1);
669
	    }
670
	  break;
671
	}
672
 
673
      if (p[1] == 'A' || p[1] == 'B')
674
	{
675
	  len = p - fmt;
676
	  memcpy (bufp, fmt, len);
677
	  bufp += len;
678
	  fmt = p + 2;
679
	  new_fmt = buf;
680
 
681
	  /* If we run out of space, tough, you lose your ridiculously
682
	     long file or section name.  It's not safe to try to alloc
683
	     memory here;  We might be printing an out of memory message.  */
684
	  if (avail == 0)
685
	    {
686
	      *bufp++ = '*';
687
	      *bufp++ = '*';
688
	      *bufp = '\0';
689
	    }
690
	  else
691
	    {
692
	      if (p[1] == 'B')
693
		{
694
		  bfd *abfd = va_arg (ap, bfd *);
695
 
696
		  if (abfd == NULL)
697
		    /* Invoking %B with a null bfd pointer is an internal error.  */
698
		    abort ();
699
		  else if (abfd->my_archive)
700
		    snprintf (bufp, avail, "%s(%s)",
701
			      abfd->my_archive->filename, abfd->filename);
702
		  else
703
		    snprintf (bufp, avail, "%s", abfd->filename);
704
		}
705
	      else
706
		{
707
		  asection *sec = va_arg (ap, asection *);
708
		  bfd *abfd;
709
		  const char *group = NULL;
710
		  struct coff_comdat_info *ci;
711
 
712
		  if (sec == NULL)
713
		    /* Invoking %A with a null section pointer is an internal error.  */
714
		    abort ();
715
		  abfd = sec->owner;
716
		  if (abfd != NULL
717
		      && bfd_get_flavour (abfd) == bfd_target_elf_flavour
718
		      && elf_next_in_group (sec) != NULL
719
		      && (sec->flags & SEC_GROUP) == 0)
720
		    group = elf_group_name (sec);
721
		  else if (abfd != NULL
722
			   && bfd_get_flavour (abfd) == bfd_target_coff_flavour
723
			   && (ci = bfd_coff_get_comdat_section (sec->owner,
724
								 sec)) != NULL)
725
		    group = ci->name;
726
		  if (group != NULL)
727
		    snprintf (bufp, avail, "%s[%s]", sec->name, group);
728
		  else
729
		    snprintf (bufp, avail, "%s", sec->name);
730
		}
731
	      len = strlen (bufp);
732
	      avail = avail - len + 2;
733
 
734
	      /* We need to replace any '%' we printed by "%%".
735
		 First count how many.  */
736
	      q = bufp;
737
	      bufp += len;
738
	      extra = 0;
739
	      while ((q = strchr (q, '%')) != NULL)
740
		{
741
		  ++q;
742
		  ++extra;
743
		}
744
 
745
	      /* If there isn't room, trim off the end of the string.  */
746
	      q = bufp;
747
	      bufp += extra;
748
	      if (extra > avail)
749
		{
750
		  trim = extra - avail;
751
		  bufp -= trim;
752
		  do
753
		    {
754
		      if (*--q == '%')
755
			--extra;
756
		    }
757
		  while (--trim != 0);
758
		  *q = '\0';
759
		  avail = extra;
760
		}
761
	      avail -= extra;
762
 
763
	      /* Now double all '%' chars, shuffling the string as we go.  */
764
	      while (extra != 0)
765
		{
766
		  while ((q[extra] = *q) != '%')
767
		    --q;
768
		  q[--extra] = '%';
769
		  --q;
770
		}
771
	    }
772
	}
773
      p = p + 2;
774
    }
775
 
776
  vfprintf (stderr, new_fmt, ap);
777
  va_end (ap);
778
 
779
  /* On AIX, putc is implemented as a macro that triggers a -Wunused-value
780
     warning, so use the fputc function to avoid it.  */
781
  fputc ('\n', stderr);
782
  fflush (stderr);
783
}
784
 
785
/* This is a function pointer to the routine which should handle BFD
786
   error messages.  It is called when a BFD routine encounters an
787
   error for which it wants to print a message.  Going through a
788
   function pointer permits a program linked against BFD to intercept
789
   the messages and deal with them itself.  */
790
 
791
bfd_error_handler_type _bfd_error_handler = _bfd_default_error_handler;
792
 
793
/*
794
FUNCTION
795
	bfd_set_error_handler
796
 
797
SYNOPSIS
798
	bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type);
799
 
800
DESCRIPTION
801
	Set the BFD error handler function.  Returns the previous
802
	function.
803
*/
804
 
805
bfd_error_handler_type
806
bfd_set_error_handler (bfd_error_handler_type pnew)
807
{
808
  bfd_error_handler_type pold;
809
 
810
  pold = _bfd_error_handler;
811
  _bfd_error_handler = pnew;
812
  return pold;
813
}
814
 
815
/*
816
FUNCTION
817
	bfd_set_error_program_name
818
 
819
SYNOPSIS
820
	void bfd_set_error_program_name (const char *);
821
 
822
DESCRIPTION
823
	Set the program name to use when printing a BFD error.  This
824
	is printed before the error message followed by a colon and
825
	space.  The string must not be changed after it is passed to
826
	this function.
827
*/
828
 
829
void
830
bfd_set_error_program_name (const char *name)
831
{
832
  _bfd_error_program_name = name;
833
}
834
 
835
/*
836
FUNCTION
837
	bfd_get_error_handler
838
 
839
SYNOPSIS
840
	bfd_error_handler_type bfd_get_error_handler (void);
841
 
842
DESCRIPTION
843
	Return the BFD error handler function.
844
*/
845
 
846
bfd_error_handler_type
847
bfd_get_error_handler (void)
848
{
849
  return _bfd_error_handler;
850
}
851
 
852
/*
853
SUBSECTION
854
	BFD assert handler
855
 
856
	If BFD finds an internal inconsistency, the bfd assert
857
	handler is called with information on the BFD version, BFD
858
	source file and line.  If this happens, most programs linked
859
	against BFD are expected to want to exit with an error, or mark
860
	the current BFD operation as failed, so it is recommended to
861
	override the default handler, which just calls
862
	_bfd_error_handler and continues.
863
 
864
CODE_FRAGMENT
865
.
866
.typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg,
867
.                                         const char *bfd_version,
868
.                                         const char *bfd_file,
869
.                                         int bfd_line);
870
.
871
*/
872
 
873
/* Note the use of bfd_ prefix on the parameter names above: we want to
874
   show which one is the message and which is the version by naming the
875
   parameters, but avoid polluting the program-using-bfd namespace as
876
   the typedef is visible in the exported headers that the program
877
   includes.  Below, it's just for consistency.  */
878
 
879
static void
880
_bfd_default_assert_handler (const char *bfd_formatmsg,
881
			     const char *bfd_version,
882
			     const char *bfd_file,
883
			     int bfd_line)
884
 
885
{
886
  (*_bfd_error_handler) (bfd_formatmsg, bfd_version, bfd_file, bfd_line);
887
}
888
 
889
/* Similar to _bfd_error_handler, a program can decide to exit on an
890
   internal BFD error.  We use a non-variadic type to simplify passing
891
   on parameters to other functions, e.g. _bfd_error_handler.  */
892
 
893
bfd_assert_handler_type _bfd_assert_handler = _bfd_default_assert_handler;
894
 
895
/*
896
FUNCTION
897
	bfd_set_assert_handler
898
 
899
SYNOPSIS
900
	bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type);
901
 
902
DESCRIPTION
903
	Set the BFD assert handler function.  Returns the previous
904
	function.
905
*/
906
 
907
bfd_assert_handler_type
908
bfd_set_assert_handler (bfd_assert_handler_type pnew)
909
{
910
  bfd_assert_handler_type pold;
911
 
912
  pold = _bfd_assert_handler;
913
  _bfd_assert_handler = pnew;
914
  return pold;
915
}
916
 
917
/*
918
FUNCTION
919
	bfd_get_assert_handler
920
 
921
SYNOPSIS
922
	bfd_assert_handler_type bfd_get_assert_handler (void);
923
 
924
DESCRIPTION
925
	Return the BFD assert handler function.
926
*/
927
 
928
bfd_assert_handler_type
929
bfd_get_assert_handler (void)
930
{
931
  return _bfd_assert_handler;
932
}
933
 
934
/*
935
INODE
936
Miscellaneous, Memory Usage, Error reporting, BFD front end
937
 
938
SECTION
939
	Miscellaneous
940
 
941
SUBSECTION
942
	Miscellaneous functions
943
*/
944
 
945
/*
946
FUNCTION
947
	bfd_get_reloc_upper_bound
948
 
949
SYNOPSIS
950
	long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
951
 
952
DESCRIPTION
953
	Return the number of bytes required to store the
954
	relocation information associated with section @var{sect}
955
	attached to bfd @var{abfd}.  If an error occurs, return -1.
956
 
957
*/
958
 
959
long
960
bfd_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
961
{
962
  if (abfd->format != bfd_object)
963
    {
964
      bfd_set_error (bfd_error_invalid_operation);
965
      return -1;
966
    }
967
 
968
  return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
969
}
970
 
971
/*
972
FUNCTION
973
	bfd_canonicalize_reloc
974
 
975
SYNOPSIS
976
	long bfd_canonicalize_reloc
977
	  (bfd *abfd, asection *sec, arelent **loc, asymbol **syms);
978
 
979
DESCRIPTION
980
	Call the back end associated with the open BFD
981
	@var{abfd} and translate the external form of the relocation
982
	information attached to @var{sec} into the internal canonical
983
	form.  Place the table into memory at @var{loc}, which has
984
	been preallocated, usually by a call to
985
	<>.  Returns the number of relocs, or
986
	-1 on error.
987
 
988
	The @var{syms} table is also needed for horrible internal magic
989
	reasons.
990
 
991
*/
992
long
993
bfd_canonicalize_reloc (bfd *abfd,
994
			sec_ptr asect,
995
			arelent **location,
996
			asymbol **symbols)
997
{
998
  if (abfd->format != bfd_object)
999
    {
1000
      bfd_set_error (bfd_error_invalid_operation);
1001
      return -1;
1002
    }
1003
 
1004
  return BFD_SEND (abfd, _bfd_canonicalize_reloc,
1005
		   (abfd, asect, location, symbols));
1006
}
1007
 
1008
/*
1009
FUNCTION
1010
	bfd_set_reloc
1011
 
1012
SYNOPSIS
1013
	void bfd_set_reloc
1014
	  (bfd *abfd, asection *sec, arelent **rel, unsigned int count);
1015
 
1016
DESCRIPTION
1017
	Set the relocation pointer and count within
1018
	section @var{sec} to the values @var{rel} and @var{count}.
1019
	The argument @var{abfd} is ignored.
1020
 
1021
*/
1022
 
1023
void
1024
bfd_set_reloc (bfd *ignore_abfd ATTRIBUTE_UNUSED,
1025
	       sec_ptr asect,
1026
	       arelent **location,
1027
	       unsigned int count)
1028
{
1029
  asect->orelocation = location;
1030
  asect->reloc_count = count;
1031
}
1032
 
1033
/*
1034
FUNCTION
1035
	bfd_set_file_flags
1036
 
1037
SYNOPSIS
1038
	bfd_boolean bfd_set_file_flags (bfd *abfd, flagword flags);
1039
 
1040
DESCRIPTION
1041
	Set the flag word in the BFD @var{abfd} to the value @var{flags}.
1042
 
1043
	Possible errors are:
1044
	o <> - The target bfd was not of object format.
1045
	o <> - The target bfd was open for reading.
1046
	o <> -
1047
	The flag word contained a bit which was not applicable to the
1048
	type of file.  E.g., an attempt was made to set the <> bit
1049
	on a BFD format which does not support demand paging.
1050
 
1051
*/
1052
 
1053
bfd_boolean
1054
bfd_set_file_flags (bfd *abfd, flagword flags)
1055
{
1056
  if (abfd->format != bfd_object)
1057
    {
1058
      bfd_set_error (bfd_error_wrong_format);
1059
      return FALSE;
1060
    }
1061
 
1062
  if (bfd_read_p (abfd))
1063
    {
1064
      bfd_set_error (bfd_error_invalid_operation);
1065
      return FALSE;
1066
    }
1067
 
1068
  bfd_get_file_flags (abfd) = flags;
1069
  if ((flags & bfd_applicable_file_flags (abfd)) != flags)
1070
    {
1071
      bfd_set_error (bfd_error_invalid_operation);
1072
      return FALSE;
1073
    }
1074
 
1075
  return TRUE;
1076
}
1077
 
1078
void
1079
bfd_assert (const char *file, int line)
1080
{
1081
  (*_bfd_assert_handler) (_("BFD %s assertion fail %s:%d"),
1082
			  BFD_VERSION_STRING, file, line);
1083
}
1084
 
1085
/* A more or less friendly abort message.  In libbfd.h abort is
1086
   defined to call this function.  */
1087
 
1088
void
1089
_bfd_abort (const char *file, int line, const char *fn)
1090
{
1091
  if (fn != NULL)
1092
    (*_bfd_error_handler)
6324 serge 1093
      (_("BFD %s internal error, aborting at %s:%d in %s\n"),
5197 serge 1094
       BFD_VERSION_STRING, file, line, fn);
1095
  else
1096
    (*_bfd_error_handler)
6324 serge 1097
      (_("BFD %s internal error, aborting at %s:%d\n"),
5197 serge 1098
       BFD_VERSION_STRING, file, line);
1099
  (*_bfd_error_handler) (_("Please report this bug.\n"));
1100
  _exit (EXIT_FAILURE);
1101
}
1102
 
1103
/*
1104
FUNCTION
1105
	bfd_get_arch_size
1106
 
1107
SYNOPSIS
1108
 	int bfd_get_arch_size (bfd *abfd);
1109
 
1110
DESCRIPTION
6324 serge 1111
	Returns the normalized architecture address size, in bits, as
1112
	determined by the object file's format.  By normalized, we mean
1113
	either 32 or 64.  For ELF, this information is included in the
1114
	header.  Use bfd_arch_bits_per_address for number of bits in
1115
	the architecture address.
5197 serge 1116
 
1117
RETURNS
1118
	Returns the arch size in bits if known, <<-1>> otherwise.
1119
*/
1120
 
1121
int
1122
bfd_get_arch_size (bfd *abfd)
1123
{
1124
  if (abfd->xvec->flavour == bfd_target_elf_flavour)
1125
    return get_elf_backend_data (abfd)->s->arch_size;
1126
 
6324 serge 1127
  return bfd_arch_bits_per_address (abfd) > 32 ? 64 : 32;
5197 serge 1128
}
1129
 
1130
/*
1131
FUNCTION
1132
	bfd_get_sign_extend_vma
1133
 
1134
SYNOPSIS
1135
 	int bfd_get_sign_extend_vma (bfd *abfd);
1136
 
1137
DESCRIPTION
1138
	Indicates if the target architecture "naturally" sign extends
1139
	an address.  Some architectures implicitly sign extend address
1140
	values when they are converted to types larger than the size
1141
	of an address.  For instance, bfd_get_start_address() will
1142
	return an address sign extended to fill a bfd_vma when this is
1143
	the case.
1144
 
1145
RETURNS
1146
	Returns <<1>> if the target architecture is known to sign
1147
	extend addresses, <<0>> if the target architecture is known to
1148
	not sign extend addresses, and <<-1>> otherwise.
1149
*/
1150
 
1151
int
1152
bfd_get_sign_extend_vma (bfd *abfd)
1153
{
1154
  char *name;
1155
 
1156
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1157
    return get_elf_backend_data (abfd)->sign_extend_vma;
1158
 
1159
  name = bfd_get_target (abfd);
1160
 
1161
  /* Return a proper value for DJGPP & PE COFF.
1162
     This function is required for DWARF2 support, but there is
1163
     no place to store this information in the COFF back end.
1164
     Should enough other COFF targets add support for DWARF2,
1165
     a place will have to be found.  Until then, this hack will do.  */
1166
  if (CONST_STRNEQ (name, "coff-go32")
1167
      || strcmp (name, "pe-i386") == 0
1168
      || strcmp (name, "pei-i386") == 0
1169
      || strcmp (name, "pe-x86-64") == 0
1170
      || strcmp (name, "pei-x86-64") == 0
1171
      || strcmp (name, "pe-arm-wince-little") == 0
1172
      || strcmp (name, "pei-arm-wince-little") == 0
1173
      || strcmp (name, "aixcoff-rs6000") == 0)
1174
    return 1;
1175
 
1176
  if (CONST_STRNEQ (name, "mach-o"))
1177
    return 0;
1178
 
1179
  bfd_set_error (bfd_error_wrong_format);
1180
  return -1;
1181
}
1182
 
1183
/*
1184
FUNCTION
1185
	bfd_set_start_address
1186
 
1187
SYNOPSIS
1188
 	bfd_boolean bfd_set_start_address (bfd *abfd, bfd_vma vma);
1189
 
1190
DESCRIPTION
1191
	Make @var{vma} the entry point of output BFD @var{abfd}.
1192
 
1193
RETURNS
1194
	Returns <> on success, <> otherwise.
1195
*/
1196
 
1197
bfd_boolean
1198
bfd_set_start_address (bfd *abfd, bfd_vma vma)
1199
{
1200
  abfd->start_address = vma;
1201
  return TRUE;
1202
}
1203
 
1204
/*
1205
FUNCTION
1206
	bfd_get_gp_size
1207
 
1208
SYNOPSIS
1209
	unsigned int bfd_get_gp_size (bfd *abfd);
1210
 
1211
DESCRIPTION
1212
	Return the maximum size of objects to be optimized using the GP
1213
	register under MIPS ECOFF.  This is typically set by the <<-G>>
1214
	argument to the compiler, assembler or linker.
1215
*/
1216
 
1217
unsigned int
1218
bfd_get_gp_size (bfd *abfd)
1219
{
1220
  if (abfd->format == bfd_object)
1221
    {
1222
      if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
1223
	return ecoff_data (abfd)->gp_size;
1224
      else if (abfd->xvec->flavour == bfd_target_elf_flavour)
1225
	return elf_gp_size (abfd);
1226
    }
1227
  return 0;
1228
}
1229
 
1230
/*
1231
FUNCTION
1232
	bfd_set_gp_size
1233
 
1234
SYNOPSIS
1235
	void bfd_set_gp_size (bfd *abfd, unsigned int i);
1236
 
1237
DESCRIPTION
1238
	Set the maximum size of objects to be optimized using the GP
1239
	register under ECOFF or MIPS ELF.  This is typically set by
1240
	the <<-G>> argument to the compiler, assembler or linker.
1241
*/
1242
 
1243
void
1244
bfd_set_gp_size (bfd *abfd, unsigned int i)
1245
{
1246
  /* Don't try to set GP size on an archive or core file!  */
1247
  if (abfd->format != bfd_object)
1248
    return;
1249
 
1250
  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
1251
    ecoff_data (abfd)->gp_size = i;
1252
  else if (abfd->xvec->flavour == bfd_target_elf_flavour)
1253
    elf_gp_size (abfd) = i;
1254
}
1255
 
1256
/* Get the GP value.  This is an internal function used by some of the
1257
   relocation special_function routines on targets which support a GP
1258
   register.  */
1259
 
1260
bfd_vma
1261
_bfd_get_gp_value (bfd *abfd)
1262
{
1263
  if (! abfd)
1264
    return 0;
1265
  if (abfd->format != bfd_object)
1266
    return 0;
1267
 
1268
  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
1269
    return ecoff_data (abfd)->gp;
1270
  else if (abfd->xvec->flavour == bfd_target_elf_flavour)
1271
    return elf_gp (abfd);
1272
 
1273
  return 0;
1274
}
1275
 
1276
/* Set the GP value.  */
1277
 
1278
void
1279
_bfd_set_gp_value (bfd *abfd, bfd_vma v)
1280
{
1281
  if (! abfd)
1282
    abort ();
1283
  if (abfd->format != bfd_object)
1284
    return;
1285
 
1286
  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
1287
    ecoff_data (abfd)->gp = v;
1288
  else if (abfd->xvec->flavour == bfd_target_elf_flavour)
1289
    elf_gp (abfd) = v;
1290
}
1291
 
1292
/*
1293
FUNCTION
1294
	bfd_scan_vma
1295
 
1296
SYNOPSIS
1297
	bfd_vma bfd_scan_vma (const char *string, const char **end, int base);
1298
 
1299
DESCRIPTION
1300
	Convert, like <>, a numerical expression
1301
	@var{string} into a <> integer, and return that integer.
1302
	(Though without as many bells and whistles as <>.)
1303
	The expression is assumed to be unsigned (i.e., positive).
1304
	If given a @var{base}, it is used as the base for conversion.
1305
	A base of 0 causes the function to interpret the string
1306
	in hex if a leading "0x" or "0X" is found, otherwise
1307
	in octal if a leading zero is found, otherwise in decimal.
1308
 
1309
	If the value would overflow, the maximum <> value is
1310
	returned.
1311
*/
1312
 
1313
bfd_vma
1314
bfd_scan_vma (const char *string, const char **end, int base)
1315
{
1316
  bfd_vma value;
1317
  bfd_vma cutoff;
1318
  unsigned int cutlim;
1319
  int overflow;
1320
 
1321
  /* Let the host do it if possible.  */
1322
  if (sizeof (bfd_vma) <= sizeof (unsigned long))
1323
    return strtoul (string, (char **) end, base);
1324
 
1325
#ifdef HAVE_STRTOULL
1326
  if (sizeof (bfd_vma) <= sizeof (unsigned long long))
1327
    return strtoull (string, (char **) end, base);
1328
#endif
1329
 
1330
  if (base == 0)
1331
    {
1332
      if (string[0] == '0')
1333
	{
1334
	  if ((string[1] == 'x') || (string[1] == 'X'))
1335
	    base = 16;
1336
	  else
1337
	    base = 8;
1338
	}
1339
    }
1340
 
1341
  if ((base < 2) || (base > 36))
1342
    base = 10;
1343
 
1344
  if (base == 16
1345
      && string[0] == '0'
1346
      && (string[1] == 'x' || string[1] == 'X')
1347
      && ISXDIGIT (string[2]))
1348
    {
1349
      string += 2;
1350
    }
1351
 
1352
  cutoff = (~ (bfd_vma) 0) / (bfd_vma) base;
1353
  cutlim = (~ (bfd_vma) 0) % (bfd_vma) base;
1354
  value = 0;
1355
  overflow = 0;
1356
  while (1)
1357
    {
1358
      unsigned int digit;
1359
 
1360
      digit = *string;
1361
      if (ISDIGIT (digit))
1362
	digit = digit - '0';
1363
      else if (ISALPHA (digit))
1364
	digit = TOUPPER (digit) - 'A' + 10;
1365
      else
1366
	break;
1367
      if (digit >= (unsigned int) base)
1368
	break;
1369
      if (value > cutoff || (value == cutoff && digit > cutlim))
1370
	overflow = 1;
1371
      value = value * base + digit;
1372
      ++string;
1373
    }
1374
 
1375
  if (overflow)
1376
    value = ~ (bfd_vma) 0;
1377
 
1378
  if (end != NULL)
1379
    *end = string;
1380
 
1381
  return value;
1382
}
1383
 
1384
/*
1385
FUNCTION
1386
	bfd_copy_private_header_data
1387
 
1388
SYNOPSIS
1389
	bfd_boolean bfd_copy_private_header_data (bfd *ibfd, bfd *obfd);
1390
 
1391
DESCRIPTION
1392
	Copy private BFD header information from the BFD @var{ibfd} to the
1393
	the BFD @var{obfd}.  This copies information that may require
1394
	sections to exist, but does not require symbol tables.  Return
1395
	<> on success, <> on error.
1396
	Possible error returns are:
1397
 
1398
	o <> -
1399
	Not enough memory exists to create private data for @var{obfd}.
1400
 
1401
.#define bfd_copy_private_header_data(ibfd, obfd) \
1402
.     BFD_SEND (obfd, _bfd_copy_private_header_data, \
1403
.		(ibfd, obfd))
1404
 
1405
*/
1406
 
1407
/*
1408
FUNCTION
1409
	bfd_copy_private_bfd_data
1410
 
1411
SYNOPSIS
1412
	bfd_boolean bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd);
1413
 
1414
DESCRIPTION
1415
	Copy private BFD information from the BFD @var{ibfd} to the
1416
	the BFD @var{obfd}.  Return <> on success, <> on error.
1417
	Possible error returns are:
1418
 
1419
	o <> -
1420
	Not enough memory exists to create private data for @var{obfd}.
1421
 
1422
.#define bfd_copy_private_bfd_data(ibfd, obfd) \
1423
.     BFD_SEND (obfd, _bfd_copy_private_bfd_data, \
1424
.		(ibfd, obfd))
1425
 
1426
*/
1427
 
1428
/*
1429
FUNCTION
1430
	bfd_merge_private_bfd_data
1431
 
1432
SYNOPSIS
1433
	bfd_boolean bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd);
1434
 
1435
DESCRIPTION
1436
	Merge private BFD information from the BFD @var{ibfd} to the
1437
	the output file BFD @var{obfd} when linking.  Return <>
1438
	on success, <> on error.  Possible error returns are:
1439
 
1440
	o <> -
1441
	Not enough memory exists to create private data for @var{obfd}.
1442
 
1443
.#define bfd_merge_private_bfd_data(ibfd, obfd) \
1444
.     BFD_SEND (obfd, _bfd_merge_private_bfd_data, \
1445
.		(ibfd, obfd))
1446
 
1447
*/
1448
 
1449
/*
1450
FUNCTION
1451
	bfd_set_private_flags
1452
 
1453
SYNOPSIS
1454
	bfd_boolean bfd_set_private_flags (bfd *abfd, flagword flags);
1455
 
1456
DESCRIPTION
1457
	Set private BFD flag information in the BFD @var{abfd}.
1458
	Return <> on success, <> on error.  Possible error
1459
	returns are:
1460
 
1461
	o <> -
1462
	Not enough memory exists to create private data for @var{obfd}.
1463
 
1464
.#define bfd_set_private_flags(abfd, flags) \
1465
.     BFD_SEND (abfd, _bfd_set_private_flags, (abfd, flags))
1466
 
1467
*/
1468
 
1469
/*
1470
FUNCTION
1471
	Other functions
1472
 
1473
DESCRIPTION
1474
	The following functions exist but have not yet been documented.
1475
 
1476
.#define bfd_sizeof_headers(abfd, info) \
1477
.       BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, info))
1478
.
1479
.#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \
1480
.       BFD_SEND (abfd, _bfd_find_nearest_line, \
6324 serge 1481
.                 (abfd, syms, sec, off, file, func, line, NULL))
5197 serge 1482
.
1483
.#define bfd_find_nearest_line_discriminator(abfd, sec, syms, off, file, func, \
1484
.                                            line, disc) \
6324 serge 1485
.       BFD_SEND (abfd, _bfd_find_nearest_line, \
1486
.                 (abfd, syms, sec, off, file, func, line, disc))
5197 serge 1487
.
1488
.#define bfd_find_line(abfd, syms, sym, file, line) \
1489
.       BFD_SEND (abfd, _bfd_find_line, \
1490
.                 (abfd, syms, sym, file, line))
1491
.
1492
.#define bfd_find_inliner_info(abfd, file, func, line) \
1493
.       BFD_SEND (abfd, _bfd_find_inliner_info, \
1494
.                 (abfd, file, func, line))
1495
.
1496
.#define bfd_debug_info_start(abfd) \
1497
.       BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
1498
.
1499
.#define bfd_debug_info_end(abfd) \
1500
.       BFD_SEND (abfd, _bfd_debug_info_end, (abfd))
1501
.
1502
.#define bfd_debug_info_accumulate(abfd, section) \
1503
.       BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
1504
.
1505
.#define bfd_stat_arch_elt(abfd, stat) \
1506
.       BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
1507
.
1508
.#define bfd_update_armap_timestamp(abfd) \
1509
.       BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
1510
.
1511
.#define bfd_set_arch_mach(abfd, arch, mach)\
1512
.       BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
1513
.
1514
.#define bfd_relax_section(abfd, section, link_info, again) \
1515
.       BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again))
1516
.
1517
.#define bfd_gc_sections(abfd, link_info) \
1518
.	BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info))
1519
.
1520
.#define bfd_lookup_section_flags(link_info, flag_info, section) \
1521
.	BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section))
1522
.
1523
.#define bfd_merge_sections(abfd, link_info) \
1524
.	BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
1525
.
1526
.#define bfd_is_group_section(abfd, sec) \
1527
.	BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec))
1528
.
1529
.#define bfd_discard_group(abfd, sec) \
1530
.	BFD_SEND (abfd, _bfd_discard_group, (abfd, sec))
1531
.
1532
.#define bfd_link_hash_table_create(abfd) \
1533
.	BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd))
1534
.
1535
.#define bfd_link_add_symbols(abfd, info) \
1536
.	BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info))
1537
.
1538
.#define bfd_link_just_syms(abfd, sec, info) \
1539
.	BFD_SEND (abfd, _bfd_link_just_syms, (sec, info))
1540
.
1541
.#define bfd_final_link(abfd, info) \
1542
.	BFD_SEND (abfd, _bfd_final_link, (abfd, info))
1543
.
1544
.#define bfd_free_cached_info(abfd) \
1545
.       BFD_SEND (abfd, _bfd_free_cached_info, (abfd))
1546
.
1547
.#define bfd_get_dynamic_symtab_upper_bound(abfd) \
1548
.	BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd))
1549
.
1550
.#define bfd_print_private_bfd_data(abfd, file)\
1551
.	BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file))
1552
.
1553
.#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \
1554
.	BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols))
1555
.
1556
.#define bfd_get_synthetic_symtab(abfd, count, syms, dyncount, dynsyms, ret) \
1557
.	BFD_SEND (abfd, _bfd_get_synthetic_symtab, (abfd, count, syms, \
1558
.						    dyncount, dynsyms, ret))
1559
.
1560
.#define bfd_get_dynamic_reloc_upper_bound(abfd) \
1561
.	BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd))
1562
.
1563
.#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \
1564
.	BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms))
1565
.
1566
.extern bfd_byte *bfd_get_relocated_section_contents
1567
.  (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *,
1568
.   bfd_boolean, asymbol **);
1569
.
1570
 
1571
*/
1572
 
1573
bfd_byte *
1574
bfd_get_relocated_section_contents (bfd *abfd,
1575
				    struct bfd_link_info *link_info,
1576
				    struct bfd_link_order *link_order,
1577
				    bfd_byte *data,
1578
				    bfd_boolean relocatable,
1579
				    asymbol **symbols)
1580
{
1581
  bfd *abfd2;
1582
  bfd_byte *(*fn) (bfd *, struct bfd_link_info *, struct bfd_link_order *,
1583
		   bfd_byte *, bfd_boolean, asymbol **);
1584
 
1585
  if (link_order->type == bfd_indirect_link_order)
1586
    {
1587
      abfd2 = link_order->u.indirect.section->owner;
1588
      if (abfd2 == NULL)
1589
	abfd2 = abfd;
1590
    }
1591
  else
1592
    abfd2 = abfd;
1593
 
1594
  fn = abfd2->xvec->_bfd_get_relocated_section_contents;
1595
 
1596
  return (*fn) (abfd, link_info, link_order, data, relocatable, symbols);
1597
}
1598
 
1599
/* Record information about an ELF program header.  */
1600
 
1601
bfd_boolean
1602
bfd_record_phdr (bfd *abfd,
1603
		 unsigned long type,
1604
		 bfd_boolean flags_valid,
1605
		 flagword flags,
1606
		 bfd_boolean at_valid,
1607
		 bfd_vma at,
1608
		 bfd_boolean includes_filehdr,
1609
		 bfd_boolean includes_phdrs,
1610
		 unsigned int count,
1611
		 asection **secs)
1612
{
1613
  struct elf_segment_map *m, **pm;
1614
  bfd_size_type amt;
1615
 
1616
  if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1617
    return TRUE;
1618
 
1619
  amt = sizeof (struct elf_segment_map);
1620
  amt += ((bfd_size_type) count - 1) * sizeof (asection *);
1621
  m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
1622
  if (m == NULL)
1623
    return FALSE;
1624
 
1625
  m->p_type = type;
1626
  m->p_flags = flags;
1627
  m->p_paddr = at;
1628
  m->p_flags_valid = flags_valid;
1629
  m->p_paddr_valid = at_valid;
1630
  m->includes_filehdr = includes_filehdr;
1631
  m->includes_phdrs = includes_phdrs;
1632
  m->count = count;
1633
  if (count > 0)
1634
    memcpy (m->sections, secs, count * sizeof (asection *));
1635
 
1636
  for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
1637
    ;
1638
  *pm = m;
1639
 
1640
  return TRUE;
1641
}
1642
 
1643
#ifdef BFD64
1644
/* Return true iff this target is 32-bit.  */
1645
 
1646
static bfd_boolean
1647
is32bit (bfd *abfd)
1648
{
1649
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1650
    {
1651
      const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1652
      return bed->s->elfclass == ELFCLASS32;
1653
    }
1654
 
1655
  /* For non-ELF targets, use architecture information.  */
1656
  return bfd_arch_bits_per_address (abfd) <= 32;
1657
}
1658
#endif
1659
 
1660
/* bfd_sprintf_vma and bfd_fprintf_vma display an address in the
1661
   target's address size.  */
1662
 
1663
void
1664
bfd_sprintf_vma (bfd *abfd ATTRIBUTE_UNUSED, char *buf, bfd_vma value)
1665
{
1666
#ifdef BFD64
1667
  if (is32bit (abfd))
1668
    {
1669
      sprintf (buf, "%08lx", (unsigned long) value & 0xffffffff);
1670
      return;
1671
    }
1672
#endif
1673
  sprintf_vma (buf, value);
1674
}
1675
 
1676
void
1677
bfd_fprintf_vma (bfd *abfd ATTRIBUTE_UNUSED, void *stream, bfd_vma value)
1678
{
1679
#ifdef BFD64
1680
  if (is32bit (abfd))
1681
    {
1682
      fprintf ((FILE *) stream, "%08lx", (unsigned long) value & 0xffffffff);
1683
      return;
1684
    }
1685
#endif
1686
  fprintf_vma ((FILE *) stream, value);
1687
}
1688
 
1689
/*
1690
FUNCTION
1691
	bfd_alt_mach_code
1692
 
1693
SYNOPSIS
1694
	bfd_boolean bfd_alt_mach_code (bfd *abfd, int alternative);
1695
 
1696
DESCRIPTION
1697
 
1698
	When more than one machine code number is available for the
1699
	same machine type, this function can be used to switch between
1700
	the preferred one (alternative == 0) and any others.  Currently,
1701
	only ELF supports this feature, with up to two alternate
1702
	machine codes.
1703
*/
1704
 
1705
bfd_boolean
1706
bfd_alt_mach_code (bfd *abfd, int alternative)
1707
{
1708
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1709
    {
1710
      int code;
1711
 
1712
      switch (alternative)
1713
	{
1714
	case 0:
1715
	  code = get_elf_backend_data (abfd)->elf_machine_code;
1716
	  break;
1717
 
1718
	case 1:
1719
	  code = get_elf_backend_data (abfd)->elf_machine_alt1;
1720
	  if (code == 0)
1721
	    return FALSE;
1722
	  break;
1723
 
1724
	case 2:
1725
	  code = get_elf_backend_data (abfd)->elf_machine_alt2;
1726
	  if (code == 0)
1727
	    return FALSE;
1728
	  break;
1729
 
1730
	default:
1731
	  return FALSE;
1732
	}
1733
 
1734
      elf_elfheader (abfd)->e_machine = code;
1735
 
1736
      return TRUE;
1737
    }
1738
 
1739
  return FALSE;
1740
}
1741
 
1742
/*
1743
FUNCTION
1744
	bfd_emul_get_maxpagesize
1745
 
1746
SYNOPSIS
1747
 	bfd_vma bfd_emul_get_maxpagesize (const char *);
1748
 
1749
DESCRIPTION
1750
	Returns the maximum page size, in bytes, as determined by
1751
	emulation.
1752
 
1753
RETURNS
1754
	Returns the maximum page size in bytes for ELF, 0 otherwise.
1755
*/
1756
 
1757
bfd_vma
1758
bfd_emul_get_maxpagesize (const char *emul)
1759
{
1760
  const bfd_target *target;
1761
 
1762
  target = bfd_find_target (emul, NULL);
1763
  if (target != NULL
1764
      && target->flavour == bfd_target_elf_flavour)
1765
    return xvec_get_elf_backend_data (target)->maxpagesize;
1766
 
1767
  return 0;
1768
}
1769
 
1770
static void
1771
bfd_elf_set_pagesize (const bfd_target *target, bfd_vma size,
1772
		      int offset, const bfd_target *orig_target)
1773
{
1774
  if (target->flavour == bfd_target_elf_flavour)
1775
    {
1776
      const struct elf_backend_data *bed;
1777
 
1778
      bed = xvec_get_elf_backend_data (target);
1779
      *((bfd_vma *) ((char *) bed + offset)) = size;
1780
    }
1781
 
1782
  if (target->alternative_target
1783
      && target->alternative_target != orig_target)
1784
    bfd_elf_set_pagesize (target->alternative_target, size, offset,
1785
			  orig_target);
1786
}
1787
 
1788
/*
1789
FUNCTION
1790
	bfd_emul_set_maxpagesize
1791
 
1792
SYNOPSIS
1793
 	void bfd_emul_set_maxpagesize (const char *, bfd_vma);
1794
 
1795
DESCRIPTION
1796
	For ELF, set the maximum page size for the emulation.  It is
1797
	a no-op for other formats.
1798
 
1799
*/
1800
 
1801
void
1802
bfd_emul_set_maxpagesize (const char *emul, bfd_vma size)
1803
{
1804
  const bfd_target *target;
1805
 
1806
  target = bfd_find_target (emul, NULL);
1807
  if (target)
1808
    bfd_elf_set_pagesize (target, size,
1809
			  offsetof (struct elf_backend_data,
1810
				    maxpagesize), target);
1811
}
1812
 
1813
/*
1814
FUNCTION
1815
	bfd_emul_get_commonpagesize
1816
 
1817
SYNOPSIS
1818
 	bfd_vma bfd_emul_get_commonpagesize (const char *);
1819
 
1820
DESCRIPTION
1821
	Returns the common page size, in bytes, as determined by
1822
	emulation.
1823
 
1824
RETURNS
1825
	Returns the common page size in bytes for ELF, 0 otherwise.
1826
*/
1827
 
1828
bfd_vma
1829
bfd_emul_get_commonpagesize (const char *emul)
1830
{
1831
  const bfd_target *target;
1832
 
1833
  target = bfd_find_target (emul, NULL);
1834
  if (target != NULL
1835
      && target->flavour == bfd_target_elf_flavour)
1836
    return xvec_get_elf_backend_data (target)->commonpagesize;
1837
 
1838
  return 0;
1839
}
1840
 
1841
/*
1842
FUNCTION
1843
	bfd_emul_set_commonpagesize
1844
 
1845
SYNOPSIS
1846
 	void bfd_emul_set_commonpagesize (const char *, bfd_vma);
1847
 
1848
DESCRIPTION
1849
	For ELF, set the common page size for the emulation.  It is
1850
	a no-op for other formats.
1851
 
1852
*/
1853
 
1854
void
1855
bfd_emul_set_commonpagesize (const char *emul, bfd_vma size)
1856
{
1857
  const bfd_target *target;
1858
 
1859
  target = bfd_find_target (emul, NULL);
1860
  if (target)
1861
    bfd_elf_set_pagesize (target, size,
1862
			  offsetof (struct elf_backend_data,
1863
				    commonpagesize), target);
1864
}
1865
 
1866
/*
1867
FUNCTION
1868
	bfd_demangle
1869
 
1870
SYNOPSIS
1871
	char *bfd_demangle (bfd *, const char *, int);
1872
 
1873
DESCRIPTION
1874
	Wrapper around cplus_demangle.  Strips leading underscores and
1875
	other such chars that would otherwise confuse the demangler.
1876
	If passed a g++ v3 ABI mangled name, returns a buffer allocated
1877
	with malloc holding the demangled name.  Returns NULL otherwise
1878
	and on memory alloc failure.
1879
*/
1880
 
1881
char *
1882
bfd_demangle (bfd *abfd, const char *name, int options)
1883
{
1884
  char *res, *alloc;
1885
  const char *pre, *suf;
1886
  size_t pre_len;
1887
  bfd_boolean skip_lead;
1888
 
1889
  skip_lead = (abfd != NULL
1890
	       && *name != '\0'
1891
	       && bfd_get_symbol_leading_char (abfd) == *name);
1892
  if (skip_lead)
1893
    ++name;
1894
 
1895
  /* This is a hack for better error reporting on XCOFF, PowerPC64-ELF
1896
     or the MS PE format.  These formats have a number of leading '.'s
1897
     on at least some symbols, so we remove all dots to avoid
1898
     confusing the demangler.  */
1899
  pre = name;
1900
  while (*name == '.' || *name == '$')
1901
    ++name;
1902
  pre_len = name - pre;
1903
 
1904
  /* Strip off @plt and suchlike too.  */
1905
  alloc = NULL;
1906
  suf = strchr (name, '@');
1907
  if (suf != NULL)
1908
    {
1909
      alloc = (char *) bfd_malloc (suf - name + 1);
1910
      if (alloc == NULL)
1911
	return NULL;
1912
      memcpy (alloc, name, suf - name);
1913
      alloc[suf - name] = '\0';
1914
      name = alloc;
1915
    }
1916
 
1917
  res = cplus_demangle (name, options);
1918
 
1919
  if (alloc != NULL)
1920
    free (alloc);
1921
 
1922
  if (res == NULL)
1923
    {
1924
      if (skip_lead)
1925
	{
1926
	  size_t len = strlen (pre) + 1;
1927
	  alloc = (char *) bfd_malloc (len);
1928
	  if (alloc == NULL)
1929
	    return NULL;
1930
	  memcpy (alloc, pre, len);
1931
	  return alloc;
1932
	}
1933
      return NULL;
1934
    }
1935
 
1936
  /* Put back any prefix or suffix.  */
1937
  if (pre_len != 0 || suf != NULL)
1938
    {
1939
      size_t len;
1940
      size_t suf_len;
1941
      char *final;
1942
 
1943
      len = strlen (res);
1944
      if (suf == NULL)
1945
	suf = res + len;
1946
      suf_len = strlen (suf) + 1;
1947
      final = (char *) bfd_malloc (pre_len + len + suf_len);
1948
      if (final != NULL)
1949
	{
1950
	  memcpy (final, pre, pre_len);
1951
	  memcpy (final + pre_len, res, len);
1952
	  memcpy (final + pre_len + len, suf, suf_len);
1953
	}
1954
      free (res);
1955
      res = final;
1956
    }
1957
 
1958
  return res;
1959
}
6324 serge 1960
 
1961
/*
1962
FUNCTION
1963
	bfd_update_compression_header
1964
 
1965
SYNOPSIS
1966
	void bfd_update_compression_header
1967
	  (bfd *abfd, bfd_byte *contents, asection *sec);
1968
 
1969
DESCRIPTION
1970
	Set the compression header at CONTENTS of SEC in ABFD and update
1971
	elf_section_flags for compression.
1972
*/
1973
 
1974
void
1975
bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
1976
			       asection *sec)
1977
{
1978
  if ((abfd->flags & BFD_COMPRESS) != 0)
1979
    {
1980
      if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
1981
	{
1982
	  if ((abfd->flags & BFD_COMPRESS_GABI) != 0)
1983
	    {
1984
	      const struct elf_backend_data *bed
1985
		= get_elf_backend_data (abfd);
1986
 
1987
	      /* Set the SHF_COMPRESSED bit.  */
1988
	      elf_section_flags (sec) |= SHF_COMPRESSED;
1989
 
1990
	      if (bed->s->elfclass == ELFCLASS32)
1991
		{
1992
		  Elf32_External_Chdr *echdr
1993
		    = (Elf32_External_Chdr *) contents;
1994
		  bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
1995
		  bfd_put_32 (abfd, sec->size, &echdr->ch_size);
1996
		  bfd_put_32 (abfd, 1 << sec->alignment_power,
1997
			      &echdr->ch_addralign);
1998
		}
1999
	      else
2000
		{
2001
		  Elf64_External_Chdr *echdr
2002
		    = (Elf64_External_Chdr *) contents;
2003
		  bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
2004
		  bfd_put_32 (abfd, 0, &echdr->ch_reserved);
2005
		  bfd_put_64 (abfd, sec->size, &echdr->ch_size);
2006
		  bfd_put_64 (abfd, 1 << sec->alignment_power,
2007
			      &echdr->ch_addralign);
2008
		}
2009
	    }
2010
	  else
2011
	    {
2012
	      /* Clear the SHF_COMPRESSED bit.  */
2013
	      elf_section_flags (sec) &= ~SHF_COMPRESSED;
2014
 
2015
	      /* Write the zlib header.  It should be "ZLIB" followed by
2016
		 the uncompressed section size, 8 bytes in big-endian
2017
		 order.  */
2018
	      memcpy (contents, "ZLIB", 4);
2019
	      bfd_putb64 (sec->size, contents + 4);
2020
	    }
2021
	}
2022
    }
2023
  else
2024
    abort ();
2025
}
2026
 
2027
/*
2028
   FUNCTION
2029
   bfd_check_compression_header
2030
 
2031
   SYNOPSIS
2032
	bfd_boolean bfd_check_compression_header
2033
	  (bfd *abfd, bfd_byte *contents, asection *sec,
2034
	  bfd_size_type *uncompressed_size);
2035
 
2036
DESCRIPTION
2037
	Check the compression header at CONTENTS of SEC in ABFD and
2038
	store the uncompressed size in UNCOMPRESSED_SIZE if the
2039
	compression header is valid.
2040
 
2041
RETURNS
2042
	Return TRUE if the compression header is valid.
2043
*/
2044
 
2045
bfd_boolean
2046
bfd_check_compression_header (bfd *abfd, bfd_byte *contents,
2047
			      asection *sec,
2048
			      bfd_size_type *uncompressed_size)
2049
{
2050
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
2051
      && (elf_section_flags (sec) & SHF_COMPRESSED) != 0)
2052
    {
2053
      Elf_Internal_Chdr chdr;
2054
      const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2055
      if (bed->s->elfclass == ELFCLASS32)
2056
	{
2057
	  Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
2058
	  chdr.ch_type = bfd_get_32 (abfd, &echdr->ch_type);
2059
	  chdr.ch_size = bfd_get_32 (abfd, &echdr->ch_size);
2060
	  chdr.ch_addralign = bfd_get_32 (abfd, &echdr->ch_addralign);
2061
	}
2062
      else
2063
	{
2064
	  Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
2065
	  chdr.ch_type = bfd_get_32 (abfd, &echdr->ch_type);
2066
	  chdr.ch_size = bfd_get_64 (abfd, &echdr->ch_size);
2067
	  chdr.ch_addralign = bfd_get_64 (abfd, &echdr->ch_addralign);
2068
	}
2069
      if (chdr.ch_type == ELFCOMPRESS_ZLIB
2070
	  && chdr.ch_addralign == 1U << sec->alignment_power)
2071
	{
2072
	  *uncompressed_size = chdr.ch_size;
2073
	  return TRUE;
2074
	}
2075
    }
2076
 
2077
  return FALSE;
2078
}
2079
 
2080
/*
2081
FUNCTION
2082
	bfd_get_compression_header_size
2083
 
2084
SYNOPSIS
2085
	int bfd_get_compression_header_size (bfd *abfd, asection *sec);
2086
 
2087
DESCRIPTION
2088
	Return the size of the compression header of SEC in ABFD.
2089
 
2090
RETURNS
2091
	Return the size of the compression header in bytes.
2092
*/
2093
 
2094
int
2095
bfd_get_compression_header_size (bfd *abfd, asection *sec)
2096
{
2097
  if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2098
    {
2099
      if (sec == NULL)
2100
	{
2101
	  if (!(abfd->flags & BFD_COMPRESS_GABI))
2102
	    return 0;
2103
	}
2104
      else if (!(elf_section_flags (sec) & SHF_COMPRESSED))
2105
	return 0;
2106
 
2107
      if (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS32)
2108
	return sizeof (Elf32_External_Chdr);
2109
      else
2110
	return sizeof (Elf64_External_Chdr);
2111
    }
2112
 
2113
  return 0;
2114
}
2115
 
2116
/*
2117
FUNCTION
2118
	bfd_convert_section_size
2119
 
2120
SYNOPSIS
2121
	bfd_size_type bfd_convert_section_size
2122
	  (bfd *ibfd, asection *isec, bfd *obfd, bfd_size_type size);
2123
 
2124
DESCRIPTION
2125
	Convert the size @var{size} of the section @var{isec} in input
2126
	BFD @var{ibfd} to the section size in output BFD @var{obfd}.
2127
*/
2128
 
2129
bfd_size_type
2130
bfd_convert_section_size (bfd *ibfd, sec_ptr isec, bfd *obfd,
2131
			  bfd_size_type size)
2132
{
2133
  bfd_size_type hdr_size;
2134
 
2135
  /* Do nothing if input file will be decompressed.  */
2136
  if ((ibfd->flags & BFD_DECOMPRESS))
2137
    return size;
2138
 
2139
  /* Do nothing if either input or output aren't ELF.  */
2140
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2141
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2142
    return size;
2143
 
2144
  /* Do nothing if ELF classes of input and output are the same. */
2145
  if (get_elf_backend_data (ibfd)->s->elfclass
2146
      == get_elf_backend_data (obfd)->s->elfclass)
2147
    return size;
2148
 
2149
  /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
2150
  hdr_size = bfd_get_compression_header_size (ibfd, isec);
2151
  if (hdr_size == 0)
2152
    return size;
2153
 
2154
  /* Adjust the size of the output SHF_COMPRESSED section.  */
2155
  if (hdr_size == sizeof (Elf32_External_Chdr))
2156
    return (size - sizeof (Elf32_External_Chdr)
2157
	    + sizeof (Elf64_External_Chdr));
2158
  else
2159
    return (size - sizeof (Elf64_External_Chdr)
2160
	    + sizeof (Elf32_External_Chdr));
2161
}
2162
 
2163
/*
2164
FUNCTION
2165
	bfd_convert_section_contents
2166
 
2167
SYNOPSIS
2168
	bfd_boolean bfd_convert_section_contents
2169
	  (bfd *ibfd, asection *isec, bfd *obfd,
2170
	   bfd_byte **ptr, bfd_size_type *ptr_size);
2171
 
2172
DESCRIPTION
2173
	Convert the contents, stored in @var{*ptr}, of the section
2174
	@var{isec} in input BFD @var{ibfd} to output BFD @var{obfd}
2175
	if needed.  The original buffer pointed to by @var{*ptr} may
2176
	be freed and @var{*ptr} is returned with memory malloc'd by this
2177
	function, and the new size written to @var{ptr_size}.
2178
*/
2179
 
2180
bfd_boolean
2181
bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd,
2182
			      bfd_byte **ptr, bfd_size_type *ptr_size)
2183
{
2184
  bfd_byte *contents;
2185
  bfd_size_type ihdr_size, ohdr_size, size;
2186
  Elf_Internal_Chdr chdr;
2187
  bfd_boolean use_memmove;
2188
 
2189
  /* Do nothing if input file will be decompressed.  */
2190
  if ((ibfd->flags & BFD_DECOMPRESS))
2191
    return TRUE;
2192
 
2193
  /* Do nothing if either input or output aren't ELF.  */
2194
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2195
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2196
    return TRUE;
2197
 
2198
  /* Do nothing if ELF classes of input and output are the same. */
2199
  if (get_elf_backend_data (ibfd)->s->elfclass
2200
      == get_elf_backend_data (obfd)->s->elfclass)
2201
    return TRUE;
2202
 
2203
  /* Do nothing if the input section isn't a SHF_COMPRESSED section. */
2204
  ihdr_size = bfd_get_compression_header_size (ibfd, isec);
2205
  if (ihdr_size == 0)
2206
    return TRUE;
2207
 
2208
  contents = *ptr;
2209
 
2210
  /* Convert the contents of the input SHF_COMPRESSED section to
2211
     output.  Get the input compression header and the size of the
2212
     output compression header.  */
2213
  if (ihdr_size == sizeof (Elf32_External_Chdr))
2214
    {
2215
      Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
2216
      chdr.ch_type = bfd_get_32 (ibfd, &echdr->ch_type);
2217
      chdr.ch_size = bfd_get_32 (ibfd, &echdr->ch_size);
2218
      chdr.ch_addralign = bfd_get_32 (ibfd, &echdr->ch_addralign);
2219
 
2220
      ohdr_size = sizeof (Elf64_External_Chdr);
2221
 
2222
      use_memmove = FALSE;
2223
    }
2224
  else
2225
    {
2226
      Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
2227
      chdr.ch_type = bfd_get_32 (ibfd, &echdr->ch_type);
2228
      chdr.ch_size = bfd_get_64 (ibfd, &echdr->ch_size);
2229
      chdr.ch_addralign = bfd_get_64 (ibfd, &echdr->ch_addralign);
2230
 
2231
      ohdr_size = sizeof (Elf32_External_Chdr);
2232
      use_memmove = TRUE;
2233
    }
2234
 
2235
  size = bfd_get_section_size (isec) - ihdr_size + ohdr_size;
2236
  if (!use_memmove)
2237
    {
2238
      contents = (bfd_byte *) bfd_malloc (size);
2239
      if (contents == NULL)
2240
	return FALSE;
2241
    }
2242
 
2243
  /* Write out the output compression header.  */
2244
  if (ohdr_size == sizeof (Elf32_External_Chdr))
2245
    {
2246
      Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
2247
      bfd_put_32 (obfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
2248
      bfd_put_32 (obfd, chdr.ch_size, &echdr->ch_size);
2249
      bfd_put_32 (obfd, chdr.ch_addralign, &echdr->ch_addralign);
2250
    }
2251
  else
2252
    {
2253
      Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
2254
      bfd_put_32 (obfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
2255
      bfd_put_32 (obfd, 0, &echdr->ch_reserved);
2256
      bfd_put_64 (obfd, chdr.ch_size, &echdr->ch_size);
2257
      bfd_put_64 (obfd, chdr.ch_addralign, &echdr->ch_addralign);
2258
    }
2259
 
2260
  /* Copy the compressed contents.  */
2261
  if (use_memmove)
2262
    memmove (contents + ohdr_size, *ptr + ihdr_size, size - ohdr_size);
2263
  else
2264
    {
2265
      memcpy (contents + ohdr_size, *ptr + ihdr_size, size - ohdr_size);
2266
      free (*ptr);
2267
      *ptr = contents;
2268
    }
2269
 
2270
  *ptr_size = size;
2271
  return TRUE;
2272
}