]> Git Repo - binutils.git/blame - bfd/bfd.c
* stabs.texinfo (Type Descriptors): Add 'Y' type descriptor.
[binutils.git] / bfd / bfd.c
CommitLineData
6724ff46 1/* Generic BFD library interface and support routines.
fbb8fe5c 2 Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
6724ff46 3 Written by Cygnus Support.
4a81b561 4
6724ff46 5This file is part of BFD, the Binary File Descriptor library.
4a81b561 6
6724ff46 7This program is free software; you can redistribute it and/or modify
4a81b561 8it under the terms of the GNU General Public License as published by
6724ff46
RP
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
4a81b561 11
6724ff46 12This program is distributed in the hope that it will be useful,
4a81b561
DHW
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
6724ff46
RP
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
6f715d66 20
93351e91
SC
21/*
22SECTION
23 <<typedef bfd>>
6f715d66 24
c188b0be 25 A BFD has type <<bfd>>; objects of this type are the
fcc41f68 26 cornerstone of any application using BFD. Using BFD
c188b0be 27 consists of making references though the BFD and to data in the BFD.
6f715d66 28
c188b0be
DM
29 Here is the structure that defines the type <<bfd>>. It
30 contains the major data about the file and pointers
93351e91 31 to the rest of the data.
6f715d66 32
e98e6ec1
SC
33CODE_FRAGMENT
34.
93351e91
SC
35.struct _bfd
36.{
e98e6ec1
SC
37. {* The filename the application opened the BFD with. *}
38. CONST char *filename;
39.
40. {* A pointer to the target jump table. *}
41. struct bfd_target *xvec;
42.
43. {* To avoid dragging too many header files into every file that
d3e667e8 44. includes `<<bfd.h>>', IOSTREAM has been declared as a "char
e98e6ec1
SC
45. *", and MTIME as a "long". Their correct types, to which they
46. are cast when used, are "FILE *" and "time_t". The iostream
47. is the result of an fopen on the filename. *}
48. char *iostream;
49.
baf205c4
JG
50. {* Is the file descriptor being cached? That is, can it be closed as
51. needed, and re-opened when accessed later? *}
e98e6ec1
SC
52.
53. boolean cacheable;
54.
55. {* Marks whether there was a default target specified when the
c188b0be
DM
56. BFD was opened. This is used to select which matching algorithm
57. to use to choose the back end. *}
e98e6ec1
SC
58.
59. boolean target_defaulted;
60.
61. {* The caching routines use these to maintain a
62. least-recently-used list of BFDs *}
63.
64. struct _bfd *lru_prev, *lru_next;
65.
66. {* When a file is closed by the caching routines, BFD retains
c188b0be 67. state information on the file here: *}
e98e6ec1
SC
68.
69. file_ptr where;
70.
c188b0be 71. {* and here: (``once'' means at least once) *}
e98e6ec1
SC
72.
73. boolean opened_once;
74.
75. {* Set if we have a locally maintained mtime value, rather than
76. getting it from the file each time: *}
77.
78. boolean mtime_set;
79.
80. {* File modified time, if mtime_set is true: *}
81.
82. long mtime;
83.
84. {* Reserved for an unimplemented file locking extension.*}
85.
86. int ifd;
87.
c188b0be 88. {* The format which belongs to the BFD. (object, core, etc.) *}
e98e6ec1
SC
89.
90. bfd_format format;
91.
92. {* The direction the BFD was opened with*}
93.
94. enum bfd_direction {no_direction = 0,
95. read_direction = 1,
96. write_direction = 2,
97. both_direction = 3} direction;
98.
99. {* Format_specific flags*}
100.
101. flagword flags;
102.
103. {* Currently my_archive is tested before adding origin to
104. anything. I believe that this can become always an add of
105. origin, with origin set to 0 for non archive files. *}
106.
107. file_ptr origin;
108.
109. {* Remember when output has begun, to stop strange things
c188b0be 110. from happening. *}
e98e6ec1
SC
111. boolean output_has_begun;
112.
113. {* Pointer to linked list of sections*}
114. struct sec *sections;
115.
116. {* The number of sections *}
117. unsigned int section_count;
118.
119. {* Stuff only useful for object files:
120. The start address. *}
121. bfd_vma start_address;
122.
123. {* Used for input and output*}
124. unsigned int symcount;
125.
c188b0be 126. {* Symbol table for output BFD (with symcount entries) *}
e98e6ec1
SC
127. struct symbol_cache_entry **outsymbols;
128.
129. {* Pointer to structure which contains architecture information*}
130. struct bfd_arch_info *arch_info;
131.
132. {* Stuff only useful for archives:*}
133. PTR arelt_data;
c188b0be
DM
134. struct _bfd *my_archive; {* The containing archive BFD. *}
135. struct _bfd *next; {* The next BFD in the archive. *}
136. struct _bfd *archive_head; {* The first BFD in the archive. *}
e98e6ec1
SC
137. boolean has_armap;
138.
fcc41f68
ILT
139. {* A chain of BFD structures involved in a link. *}
140. struct _bfd *link_next;
141.
142. {* A field used by _bfd_generic_link_add_archive_symbols. This will
143. be used only for archive elements. *}
144. int archive_pass;
145.
e98e6ec1
SC
146. {* Used by the back end to hold private data. *}
147.
148. union
149. {
150. struct aout_data_struct *aout_data;
151. struct artdata *aout_ar_data;
152. struct _oasys_data *oasys_obj_data;
153. struct _oasys_ar_data *oasys_ar_data;
154. struct coff_tdata *coff_obj_data;
515c4292 155. struct ecoff_tdata *ecoff_obj_data;
e98e6ec1
SC
156. struct ieee_data_struct *ieee_data;
157. struct ieee_ar_data_struct *ieee_ar_data;
158. struct srec_data_struct *srec_data;
d3e667e8
JG
159. struct tekhex_data_struct *tekhex_data;
160. struct elf_obj_tdata *elf_obj_data;
b70cb81e 161. struct nlm_obj_tdata *nlm_obj_data;
e98e6ec1
SC
162. struct bout_data_struct *bout_data;
163. struct sun_core_struct *sun_core_data;
2b74083c 164. struct trad_core_struct *trad_core_data;
baf205c4 165. struct som_data_struct *som_data;
a643e626 166. struct hpux_core_struct *hpux_core_data;
fcc41f68 167. struct hppabsd_core_struct *hppabsd_core_data;
70e00914 168. struct sgi_core_struct *sgi_core_data;
baf205c4
JG
169. struct lynx_core_struct *lynx_core_data;
170. struct osf_core_struct *osf_core_data;
e98e6ec1
SC
171. PTR any;
172. } tdata;
173.
174. {* Used by the application to hold private data*}
175. PTR usrdata;
176.
177. {* Where all the allocated stuff under this BFD goes *}
178. struct obstack memory;
93351e91 179.};
e98e6ec1 180.
6f715d66 181*/
e98e6ec1 182
4a81b561 183#include "bfd.h"
bbc8d484 184#include "sysdep.h"
fcc41f68 185#include "bfdlink.h"
4a81b561 186#include "libbfd.h"
dae31cf5 187#include "coff/internal.h"
34b6a8c3 188#include "coff/sym.h"
48edba81 189#include "libcoff.h"
34b6a8c3 190#include "libecoff.h"
baf205c4
JG
191#undef obj_symbols
192#include "libelf.h"
4a81b561 193
fbb8fe5c
ILT
194\f
195/*
196SECTION
197 Error reporting
198
199 Most BFD functions return nonzero on success (check their
200 individual documentation for precise semantics). On an error,
201 they call <<bfd_set_error>> to set an error condition that callers
202 can check by calling <<bfd_get_error>>.
203 If that returns <<bfd_error_system_call>>, then check
204 <<errno>>.
bbc8d484 205
fbb8fe5c
ILT
206 The easiest way to report a BFD error to the user is to
207 use <<bfd_perror>>.
208
209SUBSECTION
210 Type <<bfd_error_type>>
211
212 The values returned by <<bfd_get_error>> are defined by the
213 enumerated type <<bfd_error_type>>.
214
215CODE_FRAGMENT
216.
217.typedef enum bfd_error
218.{
219. bfd_error_no_error = 0,
220. bfd_error_system_call,
221. bfd_error_invalid_target,
222. bfd_error_wrong_format,
223. bfd_error_invalid_operation,
224. bfd_error_no_memory,
225. bfd_error_no_symbols,
226. bfd_error_no_more_archived_files,
227. bfd_error_malformed_archive,
228. bfd_error_file_not_recognized,
229. bfd_error_file_ambiguously_recognized,
230. bfd_error_no_contents,
231. bfd_error_nonrepresentable_section,
232. bfd_error_no_debug_section,
233. bfd_error_bad_value,
234. bfd_error_file_truncated,
235. bfd_error_invalid_error_code
236.} bfd_error_type;
237.
4a81b561
DHW
238*/
239
fbb8fe5c
ILT
240#undef strerror
241extern char *strerror();
242
243static bfd_error_type bfd_error = bfd_error_no_error;
4a81b561 244
34b6a8c3
JK
245CONST char *CONST bfd_errmsgs[] = {
246 "No error",
6f715d66 247 "System call error",
fcc41f68 248 "Invalid bfd target",
6f715d66
SC
249 "File in wrong format",
250 "Invalid operation",
251 "Memory exhausted",
252 "No symbols",
6f715d66
SC
253 "No more archived files",
254 "Malformed archive",
6f715d66
SC
255 "File format not recognized",
256 "File format is ambiguous",
257 "Section has no contents",
258 "Nonrepresentable section on output",
cbdc7909 259 "Symbol needs debug section which does not exist",
d3e667e8 260 "Bad value",
34b6a8c3 261 "File truncated",
6f715d66
SC
262 "#<Invalid error code>"
263 };
4a81b561 264
fbb8fe5c
ILT
265/*
266FUNCTION
267 bfd_get_error
268
269SYNOPSIS
270 bfd_error_type bfd_get_error (void);
271
272DESCRIPTION
273 Return the current BFD error condition.
274*/
275
276bfd_error_type
277bfd_get_error ()
278{
279 return bfd_error;
280}
281
282/*
283FUNCTION
284 bfd_set_error
285
286SYNOPSIS
287 void bfd_set_error (bfd_error_type error_tag);
288
289DESCRIPTION
290 Set the BFD error condition to be @var{error_tag}.
291*/
292
293void
294bfd_set_error (error_tag)
295 bfd_error_type error_tag;
296{
297 bfd_error = error_tag;
298}
299
300/*
301FUNCTION
302 bfd_errmsg
303
304SYNOPSIS
305 CONST char *bfd_errmsg (bfd_error_type error_tag);
306
307DESCRIPTION
308 Return a string describing the error @var{error_tag}, or
309 the system error if @var{error_tag} is <<bfd_error_system_call>>.
310*/
311
d3e667e8 312CONST char *
4a81b561 313bfd_errmsg (error_tag)
fbb8fe5c 314 bfd_error_type error_tag;
4a81b561 315{
7ed4093a
SC
316#ifndef errno
317 extern int errno;
318#endif
fbb8fe5c 319 if (error_tag == bfd_error_system_call)
4a81b561
DHW
320 return strerror (errno);
321
fbb8fe5c
ILT
322 if ((((int)error_tag <(int) bfd_error_no_error) ||
323 ((int)error_tag > (int)bfd_error_invalid_error_code)))
324 error_tag = bfd_error_invalid_error_code;/* sanity check */
4a81b561
DHW
325
326 return bfd_errmsgs [(int)error_tag];
327}
328
fbb8fe5c
ILT
329/*
330FUNCTION
331 bfd_perror
332
333SYNOPSIS
334 void bfd_perror (CONST char *message);
335
336DESCRIPTION
337 Print to the standard error stream a string describing the
338 last BFD error that occurred, or the last system error if
339 the last BFD error was a system call failure. If @var{message}
340 is non-NULL and non-empty, the error string printed is preceded
341 by @var{message}, a colon, and a space. It is followed by a newline.
342*/
343
4a81b561 344void
fbb8fe5c
ILT
345bfd_perror (message)
346 CONST char *message;
4a81b561 347{
fbb8fe5c 348 if (bfd_get_error () == bfd_error_system_call)
6f715d66 349 perror((char *)message); /* must be system error then... */
4a81b561
DHW
350 else {
351 if (message == NULL || *message == '\0')
fbb8fe5c 352 fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ()));
4a81b561 353 else
fbb8fe5c 354 fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ()));
4a81b561
DHW
355 }
356}
357
fbb8fe5c
ILT
358\f
359/*
360SECTION
361 Symbols
362*/
3234eba0
DM
363
364/*
365FUNCTION
366 bfd_get_reloc_upper_bound
367
368SYNOPSIS
369 unsigned int bfd_get_reloc_upper_bound(bfd *abfd, asection *sect);
370
371DESCRIPTION
372 Return the number of bytes required to store the
373 relocation information associated with section @var{sect}
374 attached to bfd @var{abfd}.
375
376*/
377
378
379unsigned int
fbb8fe5c
ILT
380bfd_get_reloc_upper_bound (abfd, asect)
381 bfd *abfd;
382 sec_ptr asect;
3234eba0
DM
383{
384 if (abfd->format != bfd_object) {
fbb8fe5c 385 bfd_set_error (bfd_error_invalid_operation);
3234eba0
DM
386 return 0;
387 }
388
389 return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
390}
391
392/*
393FUNCTION
394 bfd_canonicalize_reloc
395
396SYNOPSIS
397 unsigned int bfd_canonicalize_reloc
398 (bfd *abfd,
399 asection *sec,
400 arelent **loc,
401 asymbol **syms);
402
403DESCRIPTION
404 Call the back end associated with the open BFD
405 @var{abfd} and translate the external form of the relocation
406 information attached to @var{sec} into the internal canonical
407 form. Place the table into memory at @var{loc}, which has
408 been preallocated, usually by a call to
409 <<bfd_get_reloc_upper_bound>>.
410
411 The @var{syms} table is also needed for horrible internal magic
412 reasons.
413
414
415*/
416unsigned int
fbb8fe5c
ILT
417bfd_canonicalize_reloc (abfd, asect, location, symbols)
418 bfd *abfd;
419 sec_ptr asect;
420 arelent **location;
421 asymbol **symbols;
3234eba0
DM
422{
423 if (abfd->format != bfd_object) {
fbb8fe5c 424 bfd_set_error (bfd_error_invalid_operation);
3234eba0
DM
425 return 0;
426 }
427 return BFD_SEND (abfd, _bfd_canonicalize_reloc,
428 (abfd, asect, location, symbols));
429}
430
431/*
432FUNCTION
433 bfd_set_reloc
434
435SYNOPSIS
436 void bfd_set_reloc
437 (bfd *abfd, asection *sec, arelent **rel, unsigned int count)
438
439DESCRIPTION
440 Set the relocation pointer and count within
441 section @var{sec} to the values @var{rel} and @var{count}.
442 The argument @var{abfd} is ignored.
443
444*/
445/*ARGSUSED*/
446void
447bfd_set_reloc (ignore_abfd, asect, location, count)
448 bfd *ignore_abfd;
449 sec_ptr asect;
450 arelent **location;
451 unsigned int count;
452{
453 asect->orelocation = location;
454 asect->reloc_count = count;
455}
4a81b561 456
e98e6ec1
SC
457/*
458FUNCTION
459 bfd_set_file_flags
460
461SYNOPSIS
462 boolean bfd_set_file_flags(bfd *abfd, flagword flags);
463
464DESCRIPTION
c188b0be 465 Set the flag word in the BFD @var{abfd} to the value @var{flags}.
e98e6ec1
SC
466
467 Possible errors are:
fbb8fe5c
ILT
468 o <<bfd_error_wrong_format>> - The target bfd was not of object format.
469 o <<bfd_error_invalid_operation>> - The target bfd was open for reading.
470 o <<bfd_error_invalid_operation>> -
e98e6ec1 471 The flag word contained a bit which was not applicable to the
fcc41f68
ILT
472 type of file. E.g., an attempt was made to set the <<D_PAGED>> bit
473 on a BFD format which does not support demand paging.
e98e6ec1
SC
474
475*/
476
4a81b561
DHW
477boolean
478bfd_set_file_flags (abfd, flags)
479 bfd *abfd;
480 flagword flags;
481{
482 if (abfd->format != bfd_object) {
fbb8fe5c 483 bfd_set_error (bfd_error_wrong_format);
4a81b561
DHW
484 return false;
485 }
486
487 if (bfd_read_p (abfd)) {
fbb8fe5c 488 bfd_set_error (bfd_error_invalid_operation);
4a81b561
DHW
489 return false;
490 }
491
d3e667e8 492 bfd_get_file_flags (abfd) = flags;
4a81b561 493 if ((flags & bfd_applicable_file_flags (abfd)) != flags) {
fbb8fe5c 494 bfd_set_error (bfd_error_invalid_operation);
4a81b561
DHW
495 return false;
496 }
497
4a81b561
DHW
498return true;
499}
500
4a81b561
DHW
501void
502bfd_assert(file, line)
503char *file;
504int line;
505{
dae31cf5 506 fprintf(stderr, "bfd assertion fail %s:%d\n",file,line);
4a81b561
DHW
507}
508
509
93351e91
SC
510/*
511FUNCTION
512 bfd_set_start_address
513
c188b0be
DM
514SYNOPSIS
515 boolean bfd_set_start_address(bfd *abfd, bfd_vma vma);
516
93351e91 517DESCRIPTION
c188b0be 518 Make @var{vma} the entry point of output BFD @var{abfd}.
6f715d66 519
93351e91
SC
520RETURNS
521 Returns <<true>> on success, <<false>> otherwise.
6f715d66
SC
522*/
523
4a81b561
DHW
524boolean
525bfd_set_start_address(abfd, vma)
526bfd *abfd;
527bfd_vma vma;
528{
529 abfd->start_address = vma;
530 return true;
531}
532
533
93351e91
SC
534/*
535FUNCTION
c188b0be 536 bfd_get_mtime
6f715d66 537
93351e91 538SYNOPSIS
c188b0be 539 long bfd_get_mtime(bfd *abfd);
e98e6ec1
SC
540
541DESCRIPTION
c188b0be
DM
542 Return the file modification time (as read from the file system, or
543 from the archive header for archive members).
e98e6ec1 544
6f715d66 545*/
4a81b561
DHW
546
547long
548bfd_get_mtime (abfd)
549 bfd *abfd;
550{
551 FILE *fp;
552 struct stat buf;
553
554 if (abfd->mtime_set)
555 return abfd->mtime;
556
557 fp = bfd_cache_lookup (abfd);
558 if (0 != fstat (fileno (fp), &buf))
559 return 0;
560
e98e6ec1
SC
561 abfd->mtime = buf.st_mtime; /* Save value in case anyone wants it */
562 return buf.st_mtime;
4a81b561 563}
6f715d66 564
515c4292
ILT
565/*
566FUNCTION
c188b0be 567 bfd_get_size
515c4292
ILT
568
569SYNOPSIS
c188b0be 570 long bfd_get_size(bfd *abfd);
515c4292
ILT
571
572DESCRIPTION
c188b0be
DM
573 Return the file size (as read from file system) for the file
574 associated with BFD @var{abfd}.
515c4292 575
c188b0be
DM
576 The initial motivation for, and use of, this routine is not
577 so we can get the exact size of the object the BFD applies to, since
578 that might not be generally possible (archive members for example).
579 It would be ideal if someone could eventually modify
515c4292
ILT
580 it so that such results were guaranteed.
581
582 Instead, we want to ask questions like "is this NNN byte sized
583 object I'm about to try read from file offset YYY reasonable?"
c188b0be
DM
584 As as example of where we might do this, some object formats
585 use string tables for which the first <<sizeof(long)>> bytes of the
586 table contain the size of the table itself, including the size bytes.
515c4292
ILT
587 If an application tries to read what it thinks is one of these
588 string tables, without some way to validate the size, and for
589 some reason the size is wrong (byte swapping error, wrong location
c188b0be 590 for the string table, etc.), the only clue is likely to be a read
515c4292 591 error when it tries to read the table, or a "virtual memory
c188b0be 592 exhausted" error when it tries to allocate 15 bazillon bytes
515c4292
ILT
593 of space for the 15 bazillon byte table it is about to read.
594 This function at least allows us to answer the quesion, "is the
595 size reasonable?".
596*/
597
598long
599bfd_get_size (abfd)
600 bfd *abfd;
601{
602 FILE *fp;
603 struct stat buf;
604
605 fp = bfd_cache_lookup (abfd);
606 if (0 != fstat (fileno (fp), &buf))
607 return 0;
608
609 return buf.st_size;
610}
611
34b6a8c3
JK
612/*
613FUNCTION
c188b0be 614 bfd_get_gp_size
34b6a8c3
JK
615
616SYNOPSIS
c188b0be 617 int bfd_get_gp_size(bfd *abfd);
34b6a8c3
JK
618
619DESCRIPTION
c188b0be 620 Return the maximum size of objects to be optimized using the GP
fcc41f68 621 register under MIPS ECOFF. This is typically set by the <<-G>>
34b6a8c3
JK
622 argument to the compiler, assembler or linker.
623*/
624
625int
626bfd_get_gp_size (abfd)
627 bfd *abfd;
628{
fbb8fe5c
ILT
629 if (abfd->format == bfd_object)
630 {
631 if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
632 return ecoff_data (abfd)->gp_size;
633 else if (abfd->xvec->flavour == bfd_target_elf_flavour)
634 return elf_gp_size (abfd);
635 }
34b6a8c3
JK
636 return 0;
637}
638
639/*
640FUNCTION
c188b0be 641 bfd_set_gp_size
34b6a8c3
JK
642
643SYNOPSIS
c188b0be 644 void bfd_set_gp_size(bfd *abfd, int i);
34b6a8c3
JK
645
646DESCRIPTION
647 Set the maximum size of objects to be optimized using the GP
baf205c4 648 register under ECOFF or MIPS ELF. This is typically set by
fcc41f68 649 the <<-G>> argument to the compiler, assembler or linker.
34b6a8c3
JK
650*/
651
652void
653bfd_set_gp_size (abfd, i)
654 bfd *abfd;
655 int i;
656{
fbb8fe5c
ILT
657 /* Don't try to set GP size on an archive or core file! */
658 if (abfd->format != bfd_object)
659 return;
34b6a8c3
JK
660 if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
661 ecoff_data (abfd)->gp_size = i;
baf205c4
JG
662 else if (abfd->xvec->flavour == bfd_target_elf_flavour)
663 elf_gp_size (abfd) = i;
664}
665
666/*
667FUNCTION
668 bfd_scan_vma
669
c188b0be
DM
670SYNOPSIS
671 bfd_vma bfd_scan_vma(CONST char *string, CONST char **end, int base);
672
baf205c4 673DESCRIPTION
c188b0be 674 Convert, like <<strtoul>>, a numerical expression
fcc41f68 675 @var{string} into a <<bfd_vma>> integer, and return that integer.
c188b0be 676 (Though without as many bells and whistles as <<strtoul>>.)
fcc41f68 677 The expression is assumed to be unsigned (i.e., positive).
c188b0be 678 If given a @var{base}, it is used as the base for conversion.
baf205c4
JG
679 A base of 0 causes the function to interpret the string
680 in hex if a leading "0x" or "0X" is found, otherwise
681 in octal if a leading zero is found, otherwise in decimal.
682
683 Overflow is not detected.
baf205c4
JG
684*/
685
686bfd_vma
fbb8fe5c
ILT
687bfd_scan_vma (string, end, base)
688 CONST char *string;
689 CONST char **end;
690 int base;
baf205c4
JG
691{
692 bfd_vma value;
693 int digit;
694
695 /* Let the host do it if possible. */
696 if (sizeof(bfd_vma) <= sizeof(unsigned long))
697 return (bfd_vma) strtoul (string, 0, base);
698
699 /* A negative base makes no sense, and we only need to go as high as hex. */
700 if ((base < 0) || (base > 16))
701 return (bfd_vma) 0;
702
703 if (base == 0)
704 {
705 if (string[0] == '0')
706 {
707 if ((string[1] == 'x') || (string[1] == 'X'))
708 base = 16;
709 /* XXX should we also allow "0b" or "0B" to set base to 2? */
710 else
711 base = 8;
712 }
713 else
714 base = 10;
715 }
716 if ((base == 16) &&
717 (string[0] == '0') && ((string[1] == 'x') || (string[1] == 'X')))
718 string += 2;
719 /* XXX should we also skip over "0b" or "0B" if base is 2? */
720
721/* Speed could be improved with a table like hex_value[] in gas. */
722#define HEX_VALUE(c) \
723 (isxdigit(c) ? \
724 (isdigit(c) ? \
725 (c - '0') : \
726 (10 + c - (islower(c) ? 'a' : 'A'))) : \
727 42)
728
729 for (value = 0; (digit = HEX_VALUE(*string)) < base; string++)
730 {
731 value = value * base + digit;
732 }
733
734 if (end)
735 *end = string;
736
737 return value;
34b6a8c3
JK
738}
739
93351e91
SC
740/*
741FUNCTION
742 stuff
743
744DESCRIPTION
c188b0be 745 Stuff which should be documented:
93351e91
SC
746
747.#define bfd_sizeof_headers(abfd, reloc) \
748. BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc))
749.
e98e6ec1
SC
750.#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \
751. BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line))
93351e91 752.
d3e667e8 753. {* Do these three do anything useful at all, for any back end? *}
93351e91
SC
754.#define bfd_debug_info_start(abfd) \
755. BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
756.
757.#define bfd_debug_info_end(abfd) \
758. BFD_SEND (abfd, _bfd_debug_info_end, (abfd))
759.
760.#define bfd_debug_info_accumulate(abfd, section) \
761. BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
762.
d3e667e8 763.
93351e91
SC
764.#define bfd_stat_arch_elt(abfd, stat) \
765. BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
766.
93351e91
SC
767.#define bfd_set_arch_mach(abfd, arch, mach)\
768. BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
769.
fcc41f68
ILT
770.#define bfd_get_relocated_section_contents(abfd, link_info, link_order, data, relocateable, symbols) \
771. BFD_SEND (abfd, _bfd_get_relocated_section_contents, \
772. (abfd, link_info, link_order, data, relocateable, symbols))
d3e667e8 773.
fcc41f68
ILT
774.#define bfd_relax_section(abfd, section, link_info, symbols) \
775. BFD_SEND (abfd, _bfd_relax_section, \
776. (abfd, section, link_info, symbols))
777.
778.#define bfd_link_hash_table_create(abfd) \
779. BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd))
780.
781.#define bfd_link_add_symbols(abfd, info) \
782. BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info))
783.
784.#define bfd_final_link(abfd, info) \
785. BFD_SEND (abfd, _bfd_final_link, (abfd, info))
34b6a8c3 786.
6590a8c9 787
6f715d66 788*/
This page took 0.316538 seconds and 4 git commands to generate.