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