1 /* Assorted BFD support routines, only used internally.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
28 #ifndef HAVE_GETPAGESIZE
29 #define getpagesize() 2048
34 Implementation details
40 These routines are used within BFD.
41 They are not intended for export, but are documented here for
45 /* A routine which is used in target vectors for unsupported
49 bfd_false (bfd
*ignore ATTRIBUTE_UNUSED
)
51 bfd_set_error (bfd_error_invalid_operation
);
55 /* A routine which is used in target vectors for supported operations
56 which do not actually do anything. */
59 bfd_true (bfd
*ignore ATTRIBUTE_UNUSED
)
64 /* A routine which is used in target vectors for unsupported
65 operations which return a pointer value. */
68 bfd_nullvoidptr (bfd
*ignore ATTRIBUTE_UNUSED
)
70 bfd_set_error (bfd_error_invalid_operation
);
75 bfd_0 (bfd
*ignore ATTRIBUTE_UNUSED
)
81 bfd_0u (bfd
*ignore ATTRIBUTE_UNUSED
)
87 bfd_0l (bfd
*ignore ATTRIBUTE_UNUSED
)
92 /* A routine which is used in target vectors for unsupported
93 operations which return -1 on error. */
96 _bfd_n1 (bfd
*ignore_abfd ATTRIBUTE_UNUSED
)
98 bfd_set_error (bfd_error_invalid_operation
);
103 bfd_void (bfd
*ignore ATTRIBUTE_UNUSED
)
108 _bfd_norelocs_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
,
109 asection
*sec ATTRIBUTE_UNUSED
)
111 return sizeof (arelent
*);
115 _bfd_norelocs_canonicalize_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
116 asection
*sec ATTRIBUTE_UNUSED
,
118 asymbol
**symbols ATTRIBUTE_UNUSED
)
125 _bfd_nocore_core_file_matches_executable_p
126 (bfd
*ignore_core_bfd ATTRIBUTE_UNUSED
,
127 bfd
*ignore_exec_bfd ATTRIBUTE_UNUSED
)
129 bfd_set_error (bfd_error_invalid_operation
);
133 /* Routine to handle core_file_failing_command entry point for targets
134 without core file support. */
137 _bfd_nocore_core_file_failing_command (bfd
*ignore_abfd ATTRIBUTE_UNUSED
)
139 bfd_set_error (bfd_error_invalid_operation
);
143 /* Routine to handle core_file_failing_signal entry point for targets
144 without core file support. */
147 _bfd_nocore_core_file_failing_signal (bfd
*ignore_abfd ATTRIBUTE_UNUSED
)
149 bfd_set_error (bfd_error_invalid_operation
);
154 _bfd_dummy_target (bfd
*ignore_abfd ATTRIBUTE_UNUSED
)
156 bfd_set_error (bfd_error_wrong_format
);
160 /* Allocate memory using malloc. */
163 bfd_malloc (bfd_size_type size
)
167 if (size
!= (size_t) size
)
169 bfd_set_error (bfd_error_no_memory
);
173 ptr
= malloc ((size_t) size
);
174 if (ptr
== NULL
&& (size_t) size
!= 0)
175 bfd_set_error (bfd_error_no_memory
);
180 /* Allocate memory using malloc, nmemb * size with overflow checking. */
183 bfd_malloc2 (bfd_size_type nmemb
, bfd_size_type size
)
187 if ((nmemb
| size
) >= HALF_BFD_SIZE_TYPE
189 && nmemb
> ~(bfd_size_type
) 0 / size
)
191 bfd_set_error (bfd_error_no_memory
);
197 if (size
!= (size_t) size
)
199 bfd_set_error (bfd_error_no_memory
);
203 ptr
= malloc ((size_t) size
);
204 if (ptr
== NULL
&& (size_t) size
!= 0)
205 bfd_set_error (bfd_error_no_memory
);
210 /* Reallocate memory using realloc. */
213 bfd_realloc (void *ptr
, bfd_size_type size
)
217 if (size
!= (size_t) size
)
219 bfd_set_error (bfd_error_no_memory
);
224 ret
= malloc ((size_t) size
);
226 ret
= realloc (ptr
, (size_t) size
);
228 if (ret
== NULL
&& (size_t) size
!= 0)
229 bfd_set_error (bfd_error_no_memory
);
234 /* Reallocate memory using realloc, nmemb * size with overflow checking. */
237 bfd_realloc2 (void *ptr
, bfd_size_type nmemb
, bfd_size_type size
)
241 if ((nmemb
| size
) >= HALF_BFD_SIZE_TYPE
243 && nmemb
> ~(bfd_size_type
) 0 / size
)
245 bfd_set_error (bfd_error_no_memory
);
251 if (size
!= (size_t) size
)
253 bfd_set_error (bfd_error_no_memory
);
258 ret
= malloc ((size_t) size
);
260 ret
= realloc (ptr
, (size_t) size
);
262 if (ret
== NULL
&& (size_t) size
!= 0)
263 bfd_set_error (bfd_error_no_memory
);
268 /* Reallocate memory using realloc.
269 If this fails the pointer is freed before returning. */
272 bfd_realloc_or_free (void *ptr
, bfd_size_type size
)
274 size_t amount
= (size_t) size
;
279 else if (ptr
== NULL
)
280 ret
= malloc (amount
);
282 ret
= realloc (ptr
, amount
);
287 bfd_set_error (bfd_error_no_memory
);
296 /* Allocate memory using malloc and clear it. */
299 bfd_zmalloc (bfd_size_type size
)
303 if (size
!= (size_t) size
)
305 bfd_set_error (bfd_error_no_memory
);
309 ptr
= malloc ((size_t) size
);
311 if ((size_t) size
!= 0)
314 bfd_set_error (bfd_error_no_memory
);
316 memset (ptr
, 0, (size_t) size
);
322 /* Allocate memory using malloc (nmemb * size) with overflow checking
326 bfd_zmalloc2 (bfd_size_type nmemb
, bfd_size_type size
)
330 if ((nmemb
| size
) >= HALF_BFD_SIZE_TYPE
332 && nmemb
> ~(bfd_size_type
) 0 / size
)
334 bfd_set_error (bfd_error_no_memory
);
340 if (size
!= (size_t) size
)
342 bfd_set_error (bfd_error_no_memory
);
346 ptr
= malloc ((size_t) size
);
348 if ((size_t) size
!= 0)
351 bfd_set_error (bfd_error_no_memory
);
353 memset (ptr
, 0, (size_t) size
);
361 bfd_write_bigendian_4byte_int
364 bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
367 Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
368 endian order regardless of what else is going on. This is useful in
373 bfd_write_bigendian_4byte_int (bfd
*abfd
, unsigned int i
)
376 bfd_putb32 ((bfd_vma
) i
, buffer
);
377 return bfd_bwrite (buffer
, (bfd_size_type
) 4, abfd
) == 4;
381 /** The do-it-yourself (byte) sex-change kit */
383 /* The middle letter e.g. get<b>short indicates Big or Little endian
384 target machine. It doesn't matter what the byte order of the host
385 machine is; these routines work for either. */
387 /* FIXME: Should these take a count argument?
388 Answer (gnu@cygnus.com): No, but perhaps they should be inline
389 functions in swap.h #ifdef __GNUC__.
390 Gprof them later and find out. */
399 These macros as used for reading and writing raw data in
400 sections; each access (except for bytes) is vectored through
401 the target format of the BFD and mangled accordingly. The
402 mangling performs any necessary endian translations and
403 removes alignment restrictions. Note that types accepted and
404 returned by these macros are identical so they can be swapped
405 around in macros---for example, @file{libaout.h} defines <<GET_WORD>>
406 to either <<bfd_get_32>> or <<bfd_get_64>>.
408 In the put routines, @var{val} must be a <<bfd_vma>>. If we are on a
409 system without prototypes, the caller is responsible for making
410 sure that is true, with a cast if necessary. We don't cast
411 them in the macro definitions because that would prevent <<lint>>
412 or <<gcc -Wall>> from detecting sins such as passing a pointer.
413 To detect calling these with less than a <<bfd_vma>>, use
414 <<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s.
417 .{* Byte swapping macros for user section data. *}
419 .#define bfd_put_8(abfd, val, ptr) \
420 . ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
421 .#define bfd_put_signed_8 \
423 .#define bfd_get_8(abfd, ptr) \
424 . (*(unsigned char *) (ptr) & 0xff)
425 .#define bfd_get_signed_8(abfd, ptr) \
426 . (((*(unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
428 .#define bfd_put_16(abfd, val, ptr) \
429 . BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
430 .#define bfd_put_signed_16 \
432 .#define bfd_get_16(abfd, ptr) \
433 . BFD_SEND (abfd, bfd_getx16, (ptr))
434 .#define bfd_get_signed_16(abfd, ptr) \
435 . BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
437 .#define bfd_put_32(abfd, val, ptr) \
438 . BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
439 .#define bfd_put_signed_32 \
441 .#define bfd_get_32(abfd, ptr) \
442 . BFD_SEND (abfd, bfd_getx32, (ptr))
443 .#define bfd_get_signed_32(abfd, ptr) \
444 . BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
446 .#define bfd_put_64(abfd, val, ptr) \
447 . BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
448 .#define bfd_put_signed_64 \
450 .#define bfd_get_64(abfd, ptr) \
451 . BFD_SEND (abfd, bfd_getx64, (ptr))
452 .#define bfd_get_signed_64(abfd, ptr) \
453 . BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
455 .#define bfd_get(bits, abfd, ptr) \
456 . ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \
457 . : (bits) == 16 ? bfd_get_16 (abfd, ptr) \
458 . : (bits) == 32 ? bfd_get_32 (abfd, ptr) \
459 . : (bits) == 64 ? bfd_get_64 (abfd, ptr) \
460 . : (abort (), (bfd_vma) - 1))
462 .#define bfd_put(bits, abfd, val, ptr) \
463 . ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \
464 . : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \
465 . : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \
466 . : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \
467 . : (abort (), (void) 0))
477 These macros have the same function as their <<bfd_get_x>>
478 brethren, except that they are used for removing information
479 for the header records of object files. Believe it or not,
480 some object files keep their header records in big endian
481 order and their data in little endian order.
483 .{* Byte swapping macros for file header data. *}
485 .#define bfd_h_put_8(abfd, val, ptr) \
486 . bfd_put_8 (abfd, val, ptr)
487 .#define bfd_h_put_signed_8(abfd, val, ptr) \
488 . bfd_put_8 (abfd, val, ptr)
489 .#define bfd_h_get_8(abfd, ptr) \
490 . bfd_get_8 (abfd, ptr)
491 .#define bfd_h_get_signed_8(abfd, ptr) \
492 . bfd_get_signed_8 (abfd, ptr)
494 .#define bfd_h_put_16(abfd, val, ptr) \
495 . BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
496 .#define bfd_h_put_signed_16 \
498 .#define bfd_h_get_16(abfd, ptr) \
499 . BFD_SEND (abfd, bfd_h_getx16, (ptr))
500 .#define bfd_h_get_signed_16(abfd, ptr) \
501 . BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
503 .#define bfd_h_put_32(abfd, val, ptr) \
504 . BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
505 .#define bfd_h_put_signed_32 \
507 .#define bfd_h_get_32(abfd, ptr) \
508 . BFD_SEND (abfd, bfd_h_getx32, (ptr))
509 .#define bfd_h_get_signed_32(abfd, ptr) \
510 . BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
512 .#define bfd_h_put_64(abfd, val, ptr) \
513 . BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
514 .#define bfd_h_put_signed_64 \
516 .#define bfd_h_get_64(abfd, ptr) \
517 . BFD_SEND (abfd, bfd_h_getx64, (ptr))
518 .#define bfd_h_get_signed_64(abfd, ptr) \
519 . BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
521 .{* Aliases for the above, which should eventually go away. *}
523 .#define H_PUT_64 bfd_h_put_64
524 .#define H_PUT_32 bfd_h_put_32
525 .#define H_PUT_16 bfd_h_put_16
526 .#define H_PUT_8 bfd_h_put_8
527 .#define H_PUT_S64 bfd_h_put_signed_64
528 .#define H_PUT_S32 bfd_h_put_signed_32
529 .#define H_PUT_S16 bfd_h_put_signed_16
530 .#define H_PUT_S8 bfd_h_put_signed_8
531 .#define H_GET_64 bfd_h_get_64
532 .#define H_GET_32 bfd_h_get_32
533 .#define H_GET_16 bfd_h_get_16
534 .#define H_GET_8 bfd_h_get_8
535 .#define H_GET_S64 bfd_h_get_signed_64
536 .#define H_GET_S32 bfd_h_get_signed_32
537 .#define H_GET_S16 bfd_h_get_signed_16
538 .#define H_GET_S8 bfd_h_get_signed_8
542 /* Sign extension to bfd_signed_vma. */
543 #define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000)
544 #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
545 #define EIGHT_GAZILLION ((bfd_int64_t) 1 << 63)
546 #define COERCE64(x) \
547 (((bfd_int64_t) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION)
550 bfd_getb16 (const void *p
)
552 const bfd_byte
*addr
= p
;
553 return (addr
[0] << 8) | addr
[1];
557 bfd_getl16 (const void *p
)
559 const bfd_byte
*addr
= p
;
560 return (addr
[1] << 8) | addr
[0];
564 bfd_getb_signed_16 (const void *p
)
566 const bfd_byte
*addr
= p
;
567 return COERCE16 ((addr
[0] << 8) | addr
[1]);
571 bfd_getl_signed_16 (const void *p
)
573 const bfd_byte
*addr
= p
;
574 return COERCE16 ((addr
[1] << 8) | addr
[0]);
578 bfd_putb16 (bfd_vma data
, void *p
)
581 addr
[0] = (data
>> 8) & 0xff;
582 addr
[1] = data
& 0xff;
586 bfd_putl16 (bfd_vma data
, void *p
)
589 addr
[0] = data
& 0xff;
590 addr
[1] = (data
>> 8) & 0xff;
594 bfd_getb32 (const void *p
)
596 const bfd_byte
*addr
= p
;
599 v
= (unsigned long) addr
[0] << 24;
600 v
|= (unsigned long) addr
[1] << 16;
601 v
|= (unsigned long) addr
[2] << 8;
602 v
|= (unsigned long) addr
[3];
607 bfd_getl32 (const void *p
)
609 const bfd_byte
*addr
= p
;
612 v
= (unsigned long) addr
[0];
613 v
|= (unsigned long) addr
[1] << 8;
614 v
|= (unsigned long) addr
[2] << 16;
615 v
|= (unsigned long) addr
[3] << 24;
620 bfd_getb_signed_32 (const void *p
)
622 const bfd_byte
*addr
= p
;
625 v
= (unsigned long) addr
[0] << 24;
626 v
|= (unsigned long) addr
[1] << 16;
627 v
|= (unsigned long) addr
[2] << 8;
628 v
|= (unsigned long) addr
[3];
633 bfd_getl_signed_32 (const void *p
)
635 const bfd_byte
*addr
= p
;
638 v
= (unsigned long) addr
[0];
639 v
|= (unsigned long) addr
[1] << 8;
640 v
|= (unsigned long) addr
[2] << 16;
641 v
|= (unsigned long) addr
[3] << 24;
646 bfd_getb64 (const void *p ATTRIBUTE_UNUSED
)
648 #ifdef BFD_HOST_64_BIT
649 const bfd_byte
*addr
= p
;
652 v
= addr
[0]; v
<<= 8;
653 v
|= addr
[1]; v
<<= 8;
654 v
|= addr
[2]; v
<<= 8;
655 v
|= addr
[3]; v
<<= 8;
656 v
|= addr
[4]; v
<<= 8;
657 v
|= addr
[5]; v
<<= 8;
658 v
|= addr
[6]; v
<<= 8;
669 bfd_getl64 (const void *p ATTRIBUTE_UNUSED
)
671 #ifdef BFD_HOST_64_BIT
672 const bfd_byte
*addr
= p
;
675 v
= addr
[7]; v
<<= 8;
676 v
|= addr
[6]; v
<<= 8;
677 v
|= addr
[5]; v
<<= 8;
678 v
|= addr
[4]; v
<<= 8;
679 v
|= addr
[3]; v
<<= 8;
680 v
|= addr
[2]; v
<<= 8;
681 v
|= addr
[1]; v
<<= 8;
693 bfd_getb_signed_64 (const void *p ATTRIBUTE_UNUSED
)
695 #ifdef BFD_HOST_64_BIT
696 const bfd_byte
*addr
= p
;
699 v
= addr
[0]; v
<<= 8;
700 v
|= addr
[1]; v
<<= 8;
701 v
|= addr
[2]; v
<<= 8;
702 v
|= addr
[3]; v
<<= 8;
703 v
|= addr
[4]; v
<<= 8;
704 v
|= addr
[5]; v
<<= 8;
705 v
|= addr
[6]; v
<<= 8;
716 bfd_getl_signed_64 (const void *p ATTRIBUTE_UNUSED
)
718 #ifdef BFD_HOST_64_BIT
719 const bfd_byte
*addr
= p
;
722 v
= addr
[7]; v
<<= 8;
723 v
|= addr
[6]; v
<<= 8;
724 v
|= addr
[5]; v
<<= 8;
725 v
|= addr
[4]; v
<<= 8;
726 v
|= addr
[3]; v
<<= 8;
727 v
|= addr
[2]; v
<<= 8;
728 v
|= addr
[1]; v
<<= 8;
739 bfd_putb32 (bfd_vma data
, void *p
)
742 addr
[0] = (data
>> 24) & 0xff;
743 addr
[1] = (data
>> 16) & 0xff;
744 addr
[2] = (data
>> 8) & 0xff;
745 addr
[3] = data
& 0xff;
749 bfd_putl32 (bfd_vma data
, void *p
)
752 addr
[0] = data
& 0xff;
753 addr
[1] = (data
>> 8) & 0xff;
754 addr
[2] = (data
>> 16) & 0xff;
755 addr
[3] = (data
>> 24) & 0xff;
759 bfd_putb64 (bfd_uint64_t data ATTRIBUTE_UNUSED
, void *p ATTRIBUTE_UNUSED
)
761 #ifdef BFD_HOST_64_BIT
763 addr
[0] = (data
>> (7*8)) & 0xff;
764 addr
[1] = (data
>> (6*8)) & 0xff;
765 addr
[2] = (data
>> (5*8)) & 0xff;
766 addr
[3] = (data
>> (4*8)) & 0xff;
767 addr
[4] = (data
>> (3*8)) & 0xff;
768 addr
[5] = (data
>> (2*8)) & 0xff;
769 addr
[6] = (data
>> (1*8)) & 0xff;
770 addr
[7] = (data
>> (0*8)) & 0xff;
777 bfd_putl64 (bfd_uint64_t data ATTRIBUTE_UNUSED
, void *p ATTRIBUTE_UNUSED
)
779 #ifdef BFD_HOST_64_BIT
781 addr
[7] = (data
>> (7*8)) & 0xff;
782 addr
[6] = (data
>> (6*8)) & 0xff;
783 addr
[5] = (data
>> (5*8)) & 0xff;
784 addr
[4] = (data
>> (4*8)) & 0xff;
785 addr
[3] = (data
>> (3*8)) & 0xff;
786 addr
[2] = (data
>> (2*8)) & 0xff;
787 addr
[1] = (data
>> (1*8)) & 0xff;
788 addr
[0] = (data
>> (0*8)) & 0xff;
795 bfd_put_bits (bfd_uint64_t data
, void *p
, int bits
, bfd_boolean big_p
)
805 for (i
= 0; i
< bytes
; i
++)
807 int index
= big_p
? bytes
- i
- 1 : i
;
809 addr
[index
] = data
& 0xff;
815 bfd_get_bits (const void *p
, int bits
, bfd_boolean big_p
)
817 const bfd_byte
*addr
= p
;
827 for (i
= 0; i
< bytes
; i
++)
829 int index
= big_p
? i
: bytes
- i
- 1;
831 data
= (data
<< 8) | addr
[index
];
837 /* Default implementation */
840 _bfd_generic_get_section_contents (bfd
*abfd
,
850 sz
= section
->rawsize
? section
->rawsize
: section
->size
;
851 if (offset
+ count
< count
852 || offset
+ count
> sz
)
854 bfd_set_error (bfd_error_invalid_operation
);
858 if (bfd_seek (abfd
, section
->filepos
+ offset
, SEEK_SET
) != 0
859 || bfd_bread (location
, count
, abfd
) != count
)
866 _bfd_generic_get_section_contents_in_window
867 (bfd
*abfd ATTRIBUTE_UNUSED
,
868 sec_ptr section ATTRIBUTE_UNUSED
,
869 bfd_window
*w ATTRIBUTE_UNUSED
,
870 file_ptr offset ATTRIBUTE_UNUSED
,
871 bfd_size_type count ATTRIBUTE_UNUSED
)
878 if (abfd
->xvec
->_bfd_get_section_contents
879 != _bfd_generic_get_section_contents
)
881 /* We don't know what changes the bfd's get_section_contents
882 method may have to make. So punt trying to map the file
883 window, and let get_section_contents do its thing. */
884 /* @@ FIXME : If the internal window has a refcount of 1 and was
885 allocated with malloc instead of mmap, just reuse it. */
887 w
->i
= bfd_zmalloc (sizeof (bfd_window_internal
));
890 w
->i
->data
= bfd_malloc (count
);
891 if (w
->i
->data
== NULL
)
899 w
->size
= w
->i
->size
= count
;
900 w
->data
= w
->i
->data
;
901 return bfd_get_section_contents (abfd
, section
, w
->data
, offset
, count
);
903 sz
= section
->rawsize
? section
->rawsize
: section
->size
;
904 if (offset
+ count
> sz
905 || ! bfd_get_file_window (abfd
, section
->filepos
+ offset
, count
, w
,
914 /* This generic function can only be used in implementations where creating
915 NEW sections is disallowed. It is useful in patching existing sections
916 in read-write files, though. See other set_section_contents functions
917 to see why it doesn't work for new sections. */
919 _bfd_generic_set_section_contents (bfd
*abfd
,
921 const void *location
,
928 if (bfd_seek (abfd
, section
->filepos
+ offset
, SEEK_SET
) != 0
929 || bfd_bwrite (location
, count
, abfd
) != count
)
940 unsigned int bfd_log2 (bfd_vma x);
943 Return the log base 2 of the value supplied, rounded up. E.g., an
944 @var{x} of 1025 returns 11. A @var{x} of 0 returns 0.
950 unsigned int result
= 0;
952 while ((x
= (x
>> 1)) != 0)
958 bfd_generic_is_local_label_name (bfd
*abfd
, const char *name
)
960 char locals_prefix
= (bfd_get_symbol_leading_char (abfd
) == '_') ? 'L' : '.';
962 return name
[0] == locals_prefix
;
965 /* Can be used from / for bfd_merge_private_bfd_data to check that
966 endianness matches between input and output file. Returns
967 TRUE for a match, otherwise returns FALSE and emits an error. */
969 _bfd_generic_verify_endian_match (bfd
*ibfd
, bfd
*obfd
)
971 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
972 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
973 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
977 if (bfd_big_endian (ibfd
))
978 msg
= _("%B: compiled for a big endian system and target is little endian");
980 msg
= _("%B: compiled for a little endian system and target is big endian");
982 (*_bfd_error_handler
) (msg
, ibfd
);
984 bfd_set_error (bfd_error_wrong_format
);
991 /* Give a warning at runtime if someone compiles code which calls
995 warn_deprecated (const char *what
,
1000 /* Poor man's tracking of functions we've already warned about. */
1001 static size_t mask
= 0;
1003 if (~(size_t) func
& ~mask
)
1005 /* Note: separate sentences in order to allow
1006 for translation into other languages. */
1008 fprintf (stderr
, _("Deprecated %s called at %s line %d in %s\n"),
1009 what
, file
, line
, func
);
1011 fprintf (stderr
, _("Deprecated %s called\n"), what
);
1012 mask
|= ~(size_t) func
;
1016 /* Helper function for reading uleb128 encoded data. */
1019 read_unsigned_leb128 (bfd
*abfd ATTRIBUTE_UNUSED
,
1021 unsigned int *bytes_read_ptr
)
1024 unsigned int num_read
;
1033 byte
= bfd_get_8 (abfd
, buf
);
1036 result
|= (((bfd_vma
) byte
& 0x7f) << shift
);
1039 while (byte
& 0x80);
1040 *bytes_read_ptr
= num_read
;
1044 /* Helper function for reading sleb128 encoded data. */
1047 read_signed_leb128 (bfd
*abfd ATTRIBUTE_UNUSED
,
1049 unsigned int *bytes_read_ptr
)
1053 unsigned int num_read
;
1061 byte
= bfd_get_8 (abfd
, buf
);
1064 result
|= (((bfd_vma
) byte
& 0x7f) << shift
);
1067 while (byte
& 0x80);
1068 if (shift
< 8 * sizeof (result
) && (byte
& 0x40))
1069 result
|= (((bfd_vma
) -1) << shift
);
1070 *bytes_read_ptr
= num_read
;
1075 _bfd_generic_find_line (bfd
*abfd ATTRIBUTE_UNUSED
,
1076 asymbol
**symbols ATTRIBUTE_UNUSED
,
1077 asymbol
*symbol ATTRIBUTE_UNUSED
,
1078 const char **filename_ptr ATTRIBUTE_UNUSED
,
1079 unsigned int *linenumber_ptr ATTRIBUTE_UNUSED
)
1085 _bfd_generic_init_private_section_data (bfd
*ibfd ATTRIBUTE_UNUSED
,
1086 asection
*isec ATTRIBUTE_UNUSED
,
1087 bfd
*obfd ATTRIBUTE_UNUSED
,
1088 asection
*osec ATTRIBUTE_UNUSED
,
1089 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
)