xref: /dragonfly/contrib/gdb-7/bfd/libbfd.c (revision 73e0051e)
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.
6 
7    This file is part of BFD, the Binary File Descriptor library.
8 
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.
13 
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.
18 
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.  */
23 
24 #include "sysdep.h"
25 #include "bfd.h"
26 #include "libbfd.h"
27 
28 #ifndef HAVE_GETPAGESIZE
29 #define getpagesize() 2048
30 #endif
31 
32 /*
33 SECTION
34 	Implementation details
35 
36 SUBSECTION
37 	Internal functions
38 
39 DESCRIPTION
40 	These routines are used within BFD.
41 	They are not intended for export, but are documented here for
42 	completeness.
43 */
44 
45 /* A routine which is used in target vectors for unsupported
46    operations.  */
47 
48 bfd_boolean
49 bfd_false (bfd *ignore ATTRIBUTE_UNUSED)
50 {
51   bfd_set_error (bfd_error_invalid_operation);
52   return FALSE;
53 }
54 
55 /* A routine which is used in target vectors for supported operations
56    which do not actually do anything.  */
57 
58 bfd_boolean
59 bfd_true (bfd *ignore ATTRIBUTE_UNUSED)
60 {
61   return TRUE;
62 }
63 
64 /* A routine which is used in target vectors for unsupported
65    operations which return a pointer value.  */
66 
67 void *
68 bfd_nullvoidptr (bfd *ignore ATTRIBUTE_UNUSED)
69 {
70   bfd_set_error (bfd_error_invalid_operation);
71   return NULL;
72 }
73 
74 int
75 bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
76 {
77   return 0;
78 }
79 
80 unsigned int
81 bfd_0u (bfd *ignore ATTRIBUTE_UNUSED)
82 {
83    return 0;
84 }
85 
86 long
87 bfd_0l (bfd *ignore ATTRIBUTE_UNUSED)
88 {
89   return 0;
90 }
91 
92 /* A routine which is used in target vectors for unsupported
93    operations which return -1 on error.  */
94 
95 long
96 _bfd_n1 (bfd *ignore_abfd ATTRIBUTE_UNUSED)
97 {
98   bfd_set_error (bfd_error_invalid_operation);
99   return -1;
100 }
101 
102 void
103 bfd_void (bfd *ignore ATTRIBUTE_UNUSED)
104 {
105 }
106 
107 long
108 _bfd_norelocs_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
109 				     asection *sec ATTRIBUTE_UNUSED)
110 {
111   return sizeof (arelent *);
112 }
113 
114 long
115 _bfd_norelocs_canonicalize_reloc (bfd *abfd ATTRIBUTE_UNUSED,
116 				  asection *sec ATTRIBUTE_UNUSED,
117 				  arelent **relptr,
118 				  asymbol **symbols ATTRIBUTE_UNUSED)
119 {
120   *relptr = NULL;
121   return 0;
122 }
123 
124 bfd_boolean
125 _bfd_nocore_core_file_matches_executable_p
126   (bfd *ignore_core_bfd ATTRIBUTE_UNUSED,
127    bfd *ignore_exec_bfd ATTRIBUTE_UNUSED)
128 {
129   bfd_set_error (bfd_error_invalid_operation);
130   return FALSE;
131 }
132 
133 /* Routine to handle core_file_failing_command entry point for targets
134    without core file support.  */
135 
136 char *
137 _bfd_nocore_core_file_failing_command (bfd *ignore_abfd ATTRIBUTE_UNUSED)
138 {
139   bfd_set_error (bfd_error_invalid_operation);
140   return NULL;
141 }
142 
143 /* Routine to handle core_file_failing_signal entry point for targets
144    without core file support.  */
145 
146 int
147 _bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED)
148 {
149   bfd_set_error (bfd_error_invalid_operation);
150   return 0;
151 }
152 
153 const bfd_target *
154 _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED)
155 {
156   bfd_set_error (bfd_error_wrong_format);
157   return 0;
158 }
159 
160 /* Allocate memory using malloc.  */
161 
162 void *
163 bfd_malloc (bfd_size_type size)
164 {
165   void *ptr;
166 
167   if (size != (size_t) size)
168     {
169       bfd_set_error (bfd_error_no_memory);
170       return NULL;
171     }
172 
173   ptr = malloc ((size_t) size);
174   if (ptr == NULL && (size_t) size != 0)
175     bfd_set_error (bfd_error_no_memory);
176 
177   return ptr;
178 }
179 
180 /* Allocate memory using malloc, nmemb * size with overflow checking.  */
181 
182 void *
183 bfd_malloc2 (bfd_size_type nmemb, bfd_size_type size)
184 {
185   void *ptr;
186 
187   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
188       && size != 0
189       && nmemb > ~(bfd_size_type) 0 / size)
190     {
191       bfd_set_error (bfd_error_no_memory);
192       return NULL;
193     }
194 
195   size *= nmemb;
196 
197   if (size != (size_t) size)
198     {
199       bfd_set_error (bfd_error_no_memory);
200       return NULL;
201     }
202 
203   ptr = malloc ((size_t) size);
204   if (ptr == NULL && (size_t) size != 0)
205     bfd_set_error (bfd_error_no_memory);
206 
207   return ptr;
208 }
209 
210 /* Reallocate memory using realloc.  */
211 
212 void *
213 bfd_realloc (void *ptr, bfd_size_type size)
214 {
215   void *ret;
216 
217   if (size != (size_t) size)
218     {
219       bfd_set_error (bfd_error_no_memory);
220       return NULL;
221     }
222 
223   if (ptr == NULL)
224     ret = malloc ((size_t) size);
225   else
226     ret = realloc (ptr, (size_t) size);
227 
228   if (ret == NULL && (size_t) size != 0)
229     bfd_set_error (bfd_error_no_memory);
230 
231   return ret;
232 }
233 
234 /* Reallocate memory using realloc, nmemb * size with overflow checking.  */
235 
236 void *
237 bfd_realloc2 (void *ptr, bfd_size_type nmemb, bfd_size_type size)
238 {
239   void *ret;
240 
241   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
242       && size != 0
243       && nmemb > ~(bfd_size_type) 0 / size)
244     {
245       bfd_set_error (bfd_error_no_memory);
246       return NULL;
247     }
248 
249   size *= nmemb;
250 
251   if (size != (size_t) size)
252     {
253       bfd_set_error (bfd_error_no_memory);
254       return NULL;
255     }
256 
257   if (ptr == NULL)
258     ret = malloc ((size_t) size);
259   else
260     ret = realloc (ptr, (size_t) size);
261 
262   if (ret == NULL && (size_t) size != 0)
263     bfd_set_error (bfd_error_no_memory);
264 
265   return ret;
266 }
267 
268 /* Reallocate memory using realloc.
269    If this fails the pointer is freed before returning.  */
270 
271 void *
272 bfd_realloc_or_free (void *ptr, bfd_size_type size)
273 {
274   size_t amount = (size_t) size;
275   void *ret;
276 
277   if (size != amount)
278     ret = NULL;
279   else if (ptr == NULL)
280     ret = malloc (amount);
281   else
282     ret = realloc (ptr, amount);
283 
284   if (ret == NULL)
285     {
286       if (amount > 0)
287 	bfd_set_error (bfd_error_no_memory);
288 
289       if (ptr != NULL)
290 	free (ptr);
291     }
292 
293   return ret;
294 }
295 
296 /* Allocate memory using malloc and clear it.  */
297 
298 void *
299 bfd_zmalloc (bfd_size_type size)
300 {
301   void *ptr;
302 
303   if (size != (size_t) size)
304     {
305       bfd_set_error (bfd_error_no_memory);
306       return NULL;
307     }
308 
309   ptr = malloc ((size_t) size);
310 
311   if ((size_t) size != 0)
312     {
313       if (ptr == NULL)
314 	bfd_set_error (bfd_error_no_memory);
315       else
316 	memset (ptr, 0, (size_t) size);
317     }
318 
319   return ptr;
320 }
321 
322 /* Allocate memory using malloc (nmemb * size) with overflow checking
323    and clear it.  */
324 
325 void *
326 bfd_zmalloc2 (bfd_size_type nmemb, bfd_size_type size)
327 {
328   void *ptr;
329 
330   if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
331       && size != 0
332       && nmemb > ~(bfd_size_type) 0 / size)
333     {
334       bfd_set_error (bfd_error_no_memory);
335       return NULL;
336     }
337 
338   size *= nmemb;
339 
340   if (size != (size_t) size)
341     {
342       bfd_set_error (bfd_error_no_memory);
343       return NULL;
344     }
345 
346   ptr = malloc ((size_t) size);
347 
348   if ((size_t) size != 0)
349     {
350       if (ptr == NULL)
351 	bfd_set_error (bfd_error_no_memory);
352       else
353 	memset (ptr, 0, (size_t) size);
354     }
355 
356   return ptr;
357 }
358 
359 /*
360 INTERNAL_FUNCTION
361 	bfd_write_bigendian_4byte_int
362 
363 SYNOPSIS
364 	bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
365 
366 DESCRIPTION
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
369 	archives.
370 
371 */
372 bfd_boolean
373 bfd_write_bigendian_4byte_int (bfd *abfd, unsigned int i)
374 {
375   bfd_byte buffer[4];
376   bfd_putb32 ((bfd_vma) i, buffer);
377   return bfd_bwrite (buffer, (bfd_size_type) 4, abfd) == 4;
378 }
379 
380 
381 /** The do-it-yourself (byte) sex-change kit */
382 
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.  */
386 
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.  */
391 
392 /*
393 FUNCTION
394 	bfd_put_size
395 FUNCTION
396 	bfd_get_size
397 
398 DESCRIPTION
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>>.
407 
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.
415 
416 .
417 .{* Byte swapping macros for user section data.  *}
418 .
419 .#define bfd_put_8(abfd, val, ptr) \
420 .  ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
421 .#define bfd_put_signed_8 \
422 .  bfd_put_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)
427 .
428 .#define bfd_put_16(abfd, val, ptr) \
429 .  BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
430 .#define bfd_put_signed_16 \
431 .  bfd_put_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))
436 .
437 .#define bfd_put_32(abfd, val, ptr) \
438 .  BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
439 .#define bfd_put_signed_32 \
440 .  bfd_put_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))
445 .
446 .#define bfd_put_64(abfd, val, ptr) \
447 .  BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
448 .#define bfd_put_signed_64 \
449 .  bfd_put_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))
454 .
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))
461 .
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))
468 .
469 */
470 
471 /*
472 FUNCTION
473 	bfd_h_put_size
474 	bfd_h_get_size
475 
476 DESCRIPTION
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.
482 .
483 .{* Byte swapping macros for file header data.  *}
484 .
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)
493 .
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 \
497 .  bfd_h_put_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))
502 .
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 \
506 .  bfd_h_put_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))
511 .
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 \
515 .  bfd_h_put_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))
520 .
521 .{* Aliases for the above, which should eventually go away.  *}
522 .
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
539 .
540 .*/
541 
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)
548 
549 bfd_vma
550 bfd_getb16 (const void *p)
551 {
552   const bfd_byte *addr = (const bfd_byte *) p;
553   return (addr[0] << 8) | addr[1];
554 }
555 
556 bfd_vma
557 bfd_getl16 (const void *p)
558 {
559   const bfd_byte *addr = (const bfd_byte *) p;
560   return (addr[1] << 8) | addr[0];
561 }
562 
563 bfd_signed_vma
564 bfd_getb_signed_16 (const void *p)
565 {
566   const bfd_byte *addr = (const bfd_byte *) p;
567   return COERCE16 ((addr[0] << 8) | addr[1]);
568 }
569 
570 bfd_signed_vma
571 bfd_getl_signed_16 (const void *p)
572 {
573   const bfd_byte *addr = (const bfd_byte *) p;
574   return COERCE16 ((addr[1] << 8) | addr[0]);
575 }
576 
577 void
578 bfd_putb16 (bfd_vma data, void *p)
579 {
580   bfd_byte *addr = (bfd_byte *) p;
581   addr[0] = (data >> 8) & 0xff;
582   addr[1] = data & 0xff;
583 }
584 
585 void
586 bfd_putl16 (bfd_vma data, void *p)
587 {
588   bfd_byte *addr = (bfd_byte *) p;
589   addr[0] = data & 0xff;
590   addr[1] = (data >> 8) & 0xff;
591 }
592 
593 bfd_vma
594 bfd_getb32 (const void *p)
595 {
596   const bfd_byte *addr = (const bfd_byte *) p;
597   unsigned long v;
598 
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];
603   return v;
604 }
605 
606 bfd_vma
607 bfd_getl32 (const void *p)
608 {
609   const bfd_byte *addr = (const bfd_byte *) p;
610   unsigned long v;
611 
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;
616   return v;
617 }
618 
619 bfd_signed_vma
620 bfd_getb_signed_32 (const void *p)
621 {
622   const bfd_byte *addr = (const bfd_byte *) p;
623   unsigned long v;
624 
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];
629   return COERCE32 (v);
630 }
631 
632 bfd_signed_vma
633 bfd_getl_signed_32 (const void *p)
634 {
635   const bfd_byte *addr = (const bfd_byte *) p;
636   unsigned long v;
637 
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;
642   return COERCE32 (v);
643 }
644 
645 bfd_uint64_t
646 bfd_getb64 (const void *p ATTRIBUTE_UNUSED)
647 {
648 #ifdef BFD_HOST_64_BIT
649   const bfd_byte *addr = (const bfd_byte *) p;
650   bfd_uint64_t v;
651 
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;
659   v |= addr[7];
660 
661   return v;
662 #else
663   BFD_FAIL();
664   return 0;
665 #endif
666 }
667 
668 bfd_uint64_t
669 bfd_getl64 (const void *p ATTRIBUTE_UNUSED)
670 {
671 #ifdef BFD_HOST_64_BIT
672   const bfd_byte *addr = (const bfd_byte *) p;
673   bfd_uint64_t v;
674 
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;
682   v |= addr[0];
683 
684   return v;
685 #else
686   BFD_FAIL();
687   return 0;
688 #endif
689 
690 }
691 
692 bfd_int64_t
693 bfd_getb_signed_64 (const void *p ATTRIBUTE_UNUSED)
694 {
695 #ifdef BFD_HOST_64_BIT
696   const bfd_byte *addr = (const bfd_byte *) p;
697   bfd_uint64_t v;
698 
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;
706   v |= addr[7];
707 
708   return COERCE64 (v);
709 #else
710   BFD_FAIL();
711   return 0;
712 #endif
713 }
714 
715 bfd_int64_t
716 bfd_getl_signed_64 (const void *p ATTRIBUTE_UNUSED)
717 {
718 #ifdef BFD_HOST_64_BIT
719   const bfd_byte *addr = (const bfd_byte *) p;
720   bfd_uint64_t v;
721 
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;
729   v |= addr[0];
730 
731   return COERCE64 (v);
732 #else
733   BFD_FAIL();
734   return 0;
735 #endif
736 }
737 
738 void
739 bfd_putb32 (bfd_vma data, void *p)
740 {
741   bfd_byte *addr = (bfd_byte *) p;
742   addr[0] = (data >> 24) & 0xff;
743   addr[1] = (data >> 16) & 0xff;
744   addr[2] = (data >>  8) & 0xff;
745   addr[3] = data & 0xff;
746 }
747 
748 void
749 bfd_putl32 (bfd_vma data, void *p)
750 {
751   bfd_byte *addr = (bfd_byte *) p;
752   addr[0] = data & 0xff;
753   addr[1] = (data >>  8) & 0xff;
754   addr[2] = (data >> 16) & 0xff;
755   addr[3] = (data >> 24) & 0xff;
756 }
757 
758 void
759 bfd_putb64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
760 {
761 #ifdef BFD_HOST_64_BIT
762   bfd_byte *addr = (bfd_byte *) p;
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;
771 #else
772   BFD_FAIL();
773 #endif
774 }
775 
776 void
777 bfd_putl64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
778 {
779 #ifdef BFD_HOST_64_BIT
780   bfd_byte *addr = (bfd_byte *) p;
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;
789 #else
790   BFD_FAIL();
791 #endif
792 }
793 
794 void
795 bfd_put_bits (bfd_uint64_t data, void *p, int bits, bfd_boolean big_p)
796 {
797   bfd_byte *addr = (bfd_byte *) p;
798   int i;
799   int bytes;
800 
801   if (bits % 8 != 0)
802     abort ();
803 
804   bytes = bits / 8;
805   for (i = 0; i < bytes; i++)
806     {
807       int index = big_p ? bytes - i - 1 : i;
808 
809       addr[index] = data & 0xff;
810       data >>= 8;
811     }
812 }
813 
814 bfd_uint64_t
815 bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
816 {
817   const bfd_byte *addr = (const bfd_byte *) p;
818   bfd_uint64_t data;
819   int i;
820   int bytes;
821 
822   if (bits % 8 != 0)
823     abort ();
824 
825   data = 0;
826   bytes = bits / 8;
827   for (i = 0; i < bytes; i++)
828     {
829       int index = big_p ? i : bytes - i - 1;
830 
831       data = (data << 8) | addr[index];
832     }
833 
834   return data;
835 }
836 
837 /* Default implementation */
838 
839 bfd_boolean
840 _bfd_generic_get_section_contents (bfd *abfd,
841 				   sec_ptr section,
842 				   void *location,
843 				   file_ptr offset,
844 				   bfd_size_type count)
845 {
846   bfd_size_type sz;
847   if (count == 0)
848     return TRUE;
849 
850   sz = section->rawsize ? section->rawsize : section->size;
851   if (offset + count < count
852       || offset + count > sz)
853     {
854       bfd_set_error (bfd_error_invalid_operation);
855       return FALSE;
856     }
857 
858   if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
859       || bfd_bread (location, count, abfd) != count)
860     return FALSE;
861 
862   return TRUE;
863 }
864 
865 bfd_boolean
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)
872 {
873 #ifdef USE_MMAP
874   bfd_size_type sz;
875 
876   if (count == 0)
877     return TRUE;
878   if (abfd->xvec->_bfd_get_section_contents
879       != _bfd_generic_get_section_contents)
880     {
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.  */
886       bfd_free_window (w);
887       w->i = bfd_zmalloc (sizeof (bfd_window_internal));
888       if (w->i == NULL)
889 	return FALSE;
890       w->i->data = bfd_malloc (count);
891       if (w->i->data == NULL)
892 	{
893 	  free (w->i);
894 	  w->i = NULL;
895 	  return FALSE;
896 	}
897       w->i->mapped = 0;
898       w->i->refcount = 1;
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);
902     }
903   sz = section->rawsize ? section->rawsize : section->size;
904   if (offset + count > sz
905       || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
906 				TRUE))
907     return FALSE;
908   return TRUE;
909 #else
910   abort ();
911 #endif
912 }
913 
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.  */
918 bfd_boolean
919 _bfd_generic_set_section_contents (bfd *abfd,
920 				   sec_ptr section,
921 				   const void *location,
922 				   file_ptr offset,
923 				   bfd_size_type count)
924 {
925   if (count == 0)
926     return TRUE;
927 
928   if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
929       || bfd_bwrite (location, count, abfd) != count)
930     return FALSE;
931 
932   return TRUE;
933 }
934 
935 /*
936 INTERNAL_FUNCTION
937 	bfd_log2
938 
939 SYNOPSIS
940 	unsigned int bfd_log2 (bfd_vma x);
941 
942 DESCRIPTION
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.
945 */
946 
947 unsigned int
948 bfd_log2 (bfd_vma x)
949 {
950   unsigned int result = 0;
951 
952   while ((x = (x >> 1)) != 0)
953     ++result;
954   return result;
955 }
956 
957 bfd_boolean
958 bfd_generic_is_local_label_name (bfd *abfd, const char *name)
959 {
960   char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
961 
962   return name[0] == locals_prefix;
963 }
964 
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.  */
968 bfd_boolean
969 _bfd_generic_verify_endian_match (bfd *ibfd, bfd *obfd)
970 {
971   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
972       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
973       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
974     {
975       const char *msg;
976 
977       if (bfd_big_endian (ibfd))
978 	msg = _("%B: compiled for a big endian system and target is little endian");
979       else
980 	msg = _("%B: compiled for a little endian system and target is big endian");
981 
982       (*_bfd_error_handler) (msg, ibfd);
983 
984       bfd_set_error (bfd_error_wrong_format);
985       return FALSE;
986     }
987 
988   return TRUE;
989 }
990 
991 /* Give a warning at runtime if someone compiles code which calls
992    old routines.  */
993 
994 void
995 warn_deprecated (const char *what,
996 		 const char *file,
997 		 int line,
998 		 const char *func)
999 {
1000   /* Poor man's tracking of functions we've already warned about.  */
1001   static size_t mask = 0;
1002 
1003   if (~(size_t) func & ~mask)
1004     {
1005       /* Note: separate sentences in order to allow
1006 	 for translation into other languages.  */
1007       if (func)
1008 	fprintf (stderr, _("Deprecated %s called at %s line %d in %s\n"),
1009 		 what, file, line, func);
1010       else
1011 	fprintf (stderr, _("Deprecated %s called\n"), what);
1012       mask |= ~(size_t) func;
1013     }
1014 }
1015 
1016 /* Helper function for reading uleb128 encoded data.  */
1017 
1018 bfd_vma
1019 read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
1020 		      bfd_byte *buf,
1021 		      unsigned int *bytes_read_ptr)
1022 {
1023   bfd_vma result;
1024   unsigned int num_read;
1025   unsigned int shift;
1026   unsigned char byte;
1027 
1028   result = 0;
1029   shift = 0;
1030   num_read = 0;
1031   do
1032     {
1033       byte = bfd_get_8 (abfd, buf);
1034       buf++;
1035       num_read++;
1036       result |= (((bfd_vma) byte & 0x7f) << shift);
1037       shift += 7;
1038     }
1039   while (byte & 0x80);
1040   *bytes_read_ptr = num_read;
1041   return result;
1042 }
1043 
1044 /* Helper function for reading sleb128 encoded data.  */
1045 
1046 bfd_signed_vma
1047 read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
1048 		    bfd_byte *buf,
1049 		    unsigned int *bytes_read_ptr)
1050 {
1051   bfd_vma result;
1052   unsigned int shift;
1053   unsigned int num_read;
1054   unsigned char byte;
1055 
1056   result = 0;
1057   shift = 0;
1058   num_read = 0;
1059   do
1060     {
1061       byte = bfd_get_8 (abfd, buf);
1062       buf ++;
1063       num_read ++;
1064       result |= (((bfd_vma) byte & 0x7f) << shift);
1065       shift += 7;
1066     }
1067   while (byte & 0x80);
1068   if (shift < 8 * sizeof (result) && (byte & 0x40))
1069     result |= (((bfd_vma) -1) << shift);
1070   *bytes_read_ptr = num_read;
1071   return result;
1072 }
1073 
1074 bfd_boolean
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)
1080 {
1081   return FALSE;
1082 }
1083 
1084 bfd_boolean
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)
1090 {
1091   return TRUE;
1092 }
1093