Compile pie_copyrelocs_test.cc with -fno-exceptions -fno-asynchronous-unwind-tables
[deliverable/binutils-gdb.git] / bfd / libbfd.c
CommitLineData
252b5132 1/* Assorted BFD support routines, only used internally.
4b95cf5c 2 Copyright (C) 1990-2014 Free Software Foundation, Inc.
252b5132
RH
3 Written by Cygnus Support.
4
ca09e32b 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
ca09e32b
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
ca09e32b 10 (at your option) any later version.
252b5132 11
ca09e32b
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
ca09e32b
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 21
252b5132 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
252b5132
RH
24#include "libbfd.h"
25
26#ifndef HAVE_GETPAGESIZE
27#define getpagesize() 2048
28#endif
29
252b5132
RH
30/*
31SECTION
1b74d094
BW
32 Implementation details
33
34SUBSECTION
252b5132
RH
35 Internal functions
36
37DESCRIPTION
38 These routines are used within BFD.
39 They are not intended for export, but are documented here for
40 completeness.
41*/
42
43/* A routine which is used in target vectors for unsupported
44 operations. */
45
b34976b6 46bfd_boolean
c58b9523 47bfd_false (bfd *ignore ATTRIBUTE_UNUSED)
252b5132
RH
48{
49 bfd_set_error (bfd_error_invalid_operation);
b34976b6 50 return FALSE;
252b5132
RH
51}
52
53/* A routine which is used in target vectors for supported operations
54 which do not actually do anything. */
55
b34976b6 56bfd_boolean
c58b9523 57bfd_true (bfd *ignore ATTRIBUTE_UNUSED)
252b5132 58{
b34976b6 59 return TRUE;
252b5132
RH
60}
61
62/* A routine which is used in target vectors for unsupported
63 operations which return a pointer value. */
64
c58b9523
AM
65void *
66bfd_nullvoidptr (bfd *ignore ATTRIBUTE_UNUSED)
252b5132
RH
67{
68 bfd_set_error (bfd_error_invalid_operation);
69 return NULL;
70}
71
509945ae 72int
c58b9523 73bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
252b5132
RH
74{
75 return 0;
76}
77
509945ae 78unsigned int
c58b9523 79bfd_0u (bfd *ignore ATTRIBUTE_UNUSED)
252b5132
RH
80{
81 return 0;
82}
83
252b5132 84long
c58b9523 85bfd_0l (bfd *ignore ATTRIBUTE_UNUSED)
252b5132
RH
86{
87 return 0;
88}
89
90/* A routine which is used in target vectors for unsupported
91 operations which return -1 on error. */
92
252b5132 93long
c58b9523 94_bfd_n1 (bfd *ignore_abfd ATTRIBUTE_UNUSED)
252b5132
RH
95{
96 bfd_set_error (bfd_error_invalid_operation);
97 return -1;
98}
99
509945ae 100void
c58b9523 101bfd_void (bfd *ignore ATTRIBUTE_UNUSED)
252b5132
RH
102{
103}
104
72f6ea61
AM
105long
106_bfd_norelocs_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
107 asection *sec ATTRIBUTE_UNUSED)
108{
109 return sizeof (arelent *);
110}
111
112long
113_bfd_norelocs_canonicalize_reloc (bfd *abfd ATTRIBUTE_UNUSED,
114 asection *sec ATTRIBUTE_UNUSED,
115 arelent **relptr,
116 asymbol **symbols ATTRIBUTE_UNUSED)
117{
118 *relptr = NULL;
119 return 0;
120}
121
b34976b6 122bfd_boolean
c58b9523
AM
123_bfd_nocore_core_file_matches_executable_p
124 (bfd *ignore_core_bfd ATTRIBUTE_UNUSED,
125 bfd *ignore_exec_bfd ATTRIBUTE_UNUSED)
252b5132
RH
126{
127 bfd_set_error (bfd_error_invalid_operation);
b34976b6 128 return FALSE;
252b5132
RH
129}
130
131/* Routine to handle core_file_failing_command entry point for targets
132 without core file support. */
133
252b5132 134char *
c58b9523 135_bfd_nocore_core_file_failing_command (bfd *ignore_abfd ATTRIBUTE_UNUSED)
252b5132
RH
136{
137 bfd_set_error (bfd_error_invalid_operation);
c58b9523 138 return NULL;
252b5132
RH
139}
140
141/* Routine to handle core_file_failing_signal entry point for targets
142 without core file support. */
143
252b5132 144int
c58b9523 145_bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED)
252b5132
RH
146{
147 bfd_set_error (bfd_error_invalid_operation);
148 return 0;
149}
150
261b8d08
PA
151/* Routine to handle the core_file_pid entry point for targets without
152 core file support. */
153
154int
155_bfd_nocore_core_file_pid (bfd *ignore_abfd ATTRIBUTE_UNUSED)
156{
157 bfd_set_error (bfd_error_invalid_operation);
158 return 0;
159}
160
252b5132 161const bfd_target *
c58b9523 162_bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED)
252b5132
RH
163{
164 bfd_set_error (bfd_error_wrong_format);
165 return 0;
166}
167\f
168/* Allocate memory using malloc. */
169
c58b9523
AM
170void *
171bfd_malloc (bfd_size_type size)
252b5132 172{
c58b9523 173 void *ptr;
252b5132 174
dc810e39
AM
175 if (size != (size_t) size)
176 {
177 bfd_set_error (bfd_error_no_memory);
178 return NULL;
179 }
180
c58b9523 181 ptr = malloc ((size_t) size);
dc810e39 182 if (ptr == NULL && (size_t) size != 0)
252b5132 183 bfd_set_error (bfd_error_no_memory);
dc810e39 184
252b5132
RH
185 return ptr;
186}
187
d0fb9a8d
JJ
188/* Allocate memory using malloc, nmemb * size with overflow checking. */
189
190void *
191bfd_malloc2 (bfd_size_type nmemb, bfd_size_type size)
192{
193 void *ptr;
194
195 if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
196 && size != 0
197 && nmemb > ~(bfd_size_type) 0 / size)
198 {
199 bfd_set_error (bfd_error_no_memory);
200 return NULL;
201 }
202
203 size *= nmemb;
204
205 if (size != (size_t) size)
206 {
207 bfd_set_error (bfd_error_no_memory);
208 return NULL;
209 }
210
211 ptr = malloc ((size_t) size);
212 if (ptr == NULL && (size_t) size != 0)
213 bfd_set_error (bfd_error_no_memory);
214
215 return ptr;
216}
217
252b5132
RH
218/* Reallocate memory using realloc. */
219
c58b9523
AM
220void *
221bfd_realloc (void *ptr, bfd_size_type size)
252b5132 222{
c58b9523 223 void *ret;
252b5132 224
dc810e39
AM
225 if (size != (size_t) size)
226 {
227 bfd_set_error (bfd_error_no_memory);
228 return NULL;
229 }
230
252b5132 231 if (ptr == NULL)
c58b9523 232 ret = malloc ((size_t) size);
252b5132 233 else
c58b9523 234 ret = realloc (ptr, (size_t) size);
252b5132 235
dc810e39 236 if (ret == NULL && (size_t) size != 0)
252b5132
RH
237 bfd_set_error (bfd_error_no_memory);
238
239 return ret;
240}
241
d0fb9a8d
JJ
242/* Reallocate memory using realloc, nmemb * size with overflow checking. */
243
244void *
245bfd_realloc2 (void *ptr, bfd_size_type nmemb, bfd_size_type size)
246{
247 void *ret;
248
249 if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
250 && size != 0
251 && nmemb > ~(bfd_size_type) 0 / size)
252 {
253 bfd_set_error (bfd_error_no_memory);
254 return NULL;
255 }
256
257 size *= nmemb;
258
259 if (size != (size_t) size)
260 {
261 bfd_set_error (bfd_error_no_memory);
262 return NULL;
263 }
264
265 if (ptr == NULL)
266 ret = malloc ((size_t) size);
267 else
268 ret = realloc (ptr, (size_t) size);
269
270 if (ret == NULL && (size_t) size != 0)
271 bfd_set_error (bfd_error_no_memory);
272
273 return ret;
274}
275
515ef31d
NC
276/* Reallocate memory using realloc.
277 If this fails the pointer is freed before returning. */
278
279void *
280bfd_realloc_or_free (void *ptr, bfd_size_type size)
281{
282 size_t amount = (size_t) size;
283 void *ret;
284
285 if (size != amount)
286 ret = NULL;
287 else if (ptr == NULL)
288 ret = malloc (amount);
289 else
290 ret = realloc (ptr, amount);
291
292 if (ret == NULL)
293 {
294 if (amount > 0)
295 bfd_set_error (bfd_error_no_memory);
296
297 if (ptr != NULL)
298 free (ptr);
299 }
300
301 return ret;
302}
303
252b5132
RH
304/* Allocate memory using malloc and clear it. */
305
c58b9523
AM
306void *
307bfd_zmalloc (bfd_size_type size)
252b5132 308{
c58b9523 309 void *ptr;
252b5132 310
dc810e39
AM
311 if (size != (size_t) size)
312 {
313 bfd_set_error (bfd_error_no_memory);
314 return NULL;
315 }
252b5132 316
c58b9523 317 ptr = malloc ((size_t) size);
dc810e39
AM
318
319 if ((size_t) size != 0)
252b5132
RH
320 {
321 if (ptr == NULL)
322 bfd_set_error (bfd_error_no_memory);
323 else
dc810e39 324 memset (ptr, 0, (size_t) size);
252b5132
RH
325 }
326
327 return ptr;
328}
d0fb9a8d
JJ
329
330/* Allocate memory using malloc (nmemb * size) with overflow checking
331 and clear it. */
332
333void *
334bfd_zmalloc2 (bfd_size_type nmemb, bfd_size_type size)
335{
336 void *ptr;
337
338 if ((nmemb | size) >= HALF_BFD_SIZE_TYPE
339 && size != 0
340 && nmemb > ~(bfd_size_type) 0 / size)
341 {
342 bfd_set_error (bfd_error_no_memory);
343 return NULL;
344 }
345
346 size *= nmemb;
347
348 if (size != (size_t) size)
349 {
350 bfd_set_error (bfd_error_no_memory);
351 return NULL;
352 }
353
354 ptr = malloc ((size_t) size);
355
356 if ((size_t) size != 0)
357 {
358 if (ptr == NULL)
359 bfd_set_error (bfd_error_no_memory);
360 else
361 memset (ptr, 0, (size_t) size);
362 }
363
364 return ptr;
365}
366
252b5132
RH
367/*
368INTERNAL_FUNCTION
369 bfd_write_bigendian_4byte_int
370
371SYNOPSIS
b34976b6 372 bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
252b5132
RH
373
374DESCRIPTION
375 Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
376 endian order regardless of what else is going on. This is useful in
377 archives.
378
379*/
b34976b6 380bfd_boolean
c58b9523 381bfd_write_bigendian_4byte_int (bfd *abfd, unsigned int i)
252b5132
RH
382{
383 bfd_byte buffer[4];
dc810e39 384 bfd_putb32 ((bfd_vma) i, buffer);
c58b9523 385 return bfd_bwrite (buffer, (bfd_size_type) 4, abfd) == 4;
252b5132
RH
386}
387
252b5132
RH
388\f
389/** The do-it-yourself (byte) sex-change kit */
390
391/* The middle letter e.g. get<b>short indicates Big or Little endian
392 target machine. It doesn't matter what the byte order of the host
393 machine is; these routines work for either. */
394
395/* FIXME: Should these take a count argument?
396 Answer (gnu@cygnus.com): No, but perhaps they should be inline
509945ae 397 functions in swap.h #ifdef __GNUC__.
252b5132
RH
398 Gprof them later and find out. */
399
400/*
401FUNCTION
402 bfd_put_size
403FUNCTION
404 bfd_get_size
405
406DESCRIPTION
407 These macros as used for reading and writing raw data in
408 sections; each access (except for bytes) is vectored through
409 the target format of the BFD and mangled accordingly. The
410 mangling performs any necessary endian translations and
411 removes alignment restrictions. Note that types accepted and
412 returned by these macros are identical so they can be swapped
413 around in macros---for example, @file{libaout.h} defines <<GET_WORD>>
414 to either <<bfd_get_32>> or <<bfd_get_64>>.
415
416 In the put routines, @var{val} must be a <<bfd_vma>>. If we are on a
417 system without prototypes, the caller is responsible for making
418 sure that is true, with a cast if necessary. We don't cast
419 them in the macro definitions because that would prevent <<lint>>
420 or <<gcc -Wall>> from detecting sins such as passing a pointer.
421 To detect calling these with less than a <<bfd_vma>>, use
422 <<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s.
423
424.
425.{* Byte swapping macros for user section data. *}
426.
427.#define bfd_put_8(abfd, val, ptr) \
edeb6e24 428. ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
252b5132 429.#define bfd_put_signed_8 \
c58b9523 430. bfd_put_8
252b5132 431.#define bfd_get_8(abfd, ptr) \
70778fc7 432. (*(const unsigned char *) (ptr) & 0xff)
252b5132 433.#define bfd_get_signed_8(abfd, ptr) \
70778fc7 434. (((*(const unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
252b5132
RH
435.
436.#define bfd_put_16(abfd, val, ptr) \
c58b9523 437. BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
252b5132 438.#define bfd_put_signed_16 \
c58b9523 439. bfd_put_16
252b5132 440.#define bfd_get_16(abfd, ptr) \
c58b9523 441. BFD_SEND (abfd, bfd_getx16, (ptr))
252b5132 442.#define bfd_get_signed_16(abfd, ptr) \
c58b9523 443. BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
252b5132
RH
444.
445.#define bfd_put_32(abfd, val, ptr) \
c58b9523 446. BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
252b5132 447.#define bfd_put_signed_32 \
c58b9523 448. bfd_put_32
252b5132 449.#define bfd_get_32(abfd, ptr) \
c58b9523 450. BFD_SEND (abfd, bfd_getx32, (ptr))
252b5132 451.#define bfd_get_signed_32(abfd, ptr) \
c58b9523 452. BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
252b5132
RH
453.
454.#define bfd_put_64(abfd, val, ptr) \
c58b9523 455. BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
252b5132 456.#define bfd_put_signed_64 \
c58b9523 457. bfd_put_64
252b5132 458.#define bfd_get_64(abfd, ptr) \
c58b9523 459. BFD_SEND (abfd, bfd_getx64, (ptr))
252b5132 460.#define bfd_get_signed_64(abfd, ptr) \
c58b9523 461. BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
252b5132 462.
c58b9523
AM
463.#define bfd_get(bits, abfd, ptr) \
464. ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \
465. : (bits) == 16 ? bfd_get_16 (abfd, ptr) \
466. : (bits) == 32 ? bfd_get_32 (abfd, ptr) \
467. : (bits) == 64 ? bfd_get_64 (abfd, ptr) \
468. : (abort (), (bfd_vma) - 1))
c7ac6ff8 469.
c58b9523
AM
470.#define bfd_put(bits, abfd, val, ptr) \
471. ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \
472. : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \
473. : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \
474. : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \
475. : (abort (), (void) 0))
c7ac6ff8 476.
509945ae 477*/
252b5132
RH
478
479/*
480FUNCTION
481 bfd_h_put_size
482 bfd_h_get_size
483
484DESCRIPTION
485 These macros have the same function as their <<bfd_get_x>>
dc810e39 486 brethren, except that they are used for removing information
252b5132
RH
487 for the header records of object files. Believe it or not,
488 some object files keep their header records in big endian
489 order and their data in little endian order.
490.
491.{* Byte swapping macros for file header data. *}
492.
493.#define bfd_h_put_8(abfd, val, ptr) \
dc810e39 494. bfd_put_8 (abfd, val, ptr)
252b5132 495.#define bfd_h_put_signed_8(abfd, val, ptr) \
dc810e39 496. bfd_put_8 (abfd, val, ptr)
252b5132 497.#define bfd_h_get_8(abfd, ptr) \
dc810e39 498. bfd_get_8 (abfd, ptr)
252b5132 499.#define bfd_h_get_signed_8(abfd, ptr) \
dc810e39 500. bfd_get_signed_8 (abfd, ptr)
252b5132
RH
501.
502.#define bfd_h_put_16(abfd, val, ptr) \
dc810e39 503. BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
252b5132 504.#define bfd_h_put_signed_16 \
dc810e39 505. bfd_h_put_16
252b5132 506.#define bfd_h_get_16(abfd, ptr) \
dc810e39 507. BFD_SEND (abfd, bfd_h_getx16, (ptr))
252b5132 508.#define bfd_h_get_signed_16(abfd, ptr) \
dc810e39 509. BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
252b5132
RH
510.
511.#define bfd_h_put_32(abfd, val, ptr) \
dc810e39 512. BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
252b5132 513.#define bfd_h_put_signed_32 \
dc810e39 514. bfd_h_put_32
252b5132 515.#define bfd_h_get_32(abfd, ptr) \
dc810e39 516. BFD_SEND (abfd, bfd_h_getx32, (ptr))
252b5132 517.#define bfd_h_get_signed_32(abfd, ptr) \
dc810e39 518. BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
252b5132
RH
519.
520.#define bfd_h_put_64(abfd, val, ptr) \
dc810e39 521. BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
252b5132 522.#define bfd_h_put_signed_64 \
dc810e39 523. bfd_h_put_64
252b5132 524.#define bfd_h_get_64(abfd, ptr) \
dc810e39 525. BFD_SEND (abfd, bfd_h_getx64, (ptr))
252b5132 526.#define bfd_h_get_signed_64(abfd, ptr) \
dc810e39 527. BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
252b5132 528.
edeb6e24 529.{* Aliases for the above, which should eventually go away. *}
dc810e39 530.
edeb6e24
AM
531.#define H_PUT_64 bfd_h_put_64
532.#define H_PUT_32 bfd_h_put_32
533.#define H_PUT_16 bfd_h_put_16
534.#define H_PUT_8 bfd_h_put_8
535.#define H_PUT_S64 bfd_h_put_signed_64
536.#define H_PUT_S32 bfd_h_put_signed_32
537.#define H_PUT_S16 bfd_h_put_signed_16
538.#define H_PUT_S8 bfd_h_put_signed_8
539.#define H_GET_64 bfd_h_get_64
540.#define H_GET_32 bfd_h_get_32
541.#define H_GET_16 bfd_h_get_16
542.#define H_GET_8 bfd_h_get_8
543.#define H_GET_S64 bfd_h_get_signed_64
544.#define H_GET_S32 bfd_h_get_signed_32
545.#define H_GET_S16 bfd_h_get_signed_16
546.#define H_GET_S8 bfd_h_get_signed_8
dc810e39
AM
547.
548.*/
252b5132
RH
549
550/* Sign extension to bfd_signed_vma. */
65879393
AM
551#define COERCE16(x) (((bfd_vma) (x) ^ 0x8000) - 0x8000)
552#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
252b5132 553#define COERCE64(x) \
65879393 554 (((bfd_uint64_t) (x) ^ ((bfd_uint64_t) 1 << 63)) - ((bfd_uint64_t) 1 << 63))
252b5132
RH
555
556bfd_vma
edeb6e24 557bfd_getb16 (const void *p)
252b5132 558{
a50b1753 559 const bfd_byte *addr = (const bfd_byte *) p;
252b5132
RH
560 return (addr[0] << 8) | addr[1];
561}
562
563bfd_vma
edeb6e24 564bfd_getl16 (const void *p)
252b5132 565{
a50b1753 566 const bfd_byte *addr = (const bfd_byte *) p;
252b5132
RH
567 return (addr[1] << 8) | addr[0];
568}
569
570bfd_signed_vma
edeb6e24 571bfd_getb_signed_16 (const void *p)
252b5132 572{
a50b1753 573 const bfd_byte *addr = (const bfd_byte *) p;
c58b9523 574 return COERCE16 ((addr[0] << 8) | addr[1]);
252b5132
RH
575}
576
577bfd_signed_vma
edeb6e24 578bfd_getl_signed_16 (const void *p)
252b5132 579{
a50b1753 580 const bfd_byte *addr = (const bfd_byte *) p;
c58b9523 581 return COERCE16 ((addr[1] << 8) | addr[0]);
252b5132
RH
582}
583
584void
edeb6e24 585bfd_putb16 (bfd_vma data, void *p)
252b5132 586{
a50b1753 587 bfd_byte *addr = (bfd_byte *) p;
edeb6e24
AM
588 addr[0] = (data >> 8) & 0xff;
589 addr[1] = data & 0xff;
252b5132
RH
590}
591
592void
edeb6e24 593bfd_putl16 (bfd_vma data, void *p)
252b5132 594{
a50b1753 595 bfd_byte *addr = (bfd_byte *) p;
edeb6e24
AM
596 addr[0] = data & 0xff;
597 addr[1] = (data >> 8) & 0xff;
252b5132
RH
598}
599
600bfd_vma
edeb6e24 601bfd_getb32 (const void *p)
252b5132 602{
a50b1753 603 const bfd_byte *addr = (const bfd_byte *) p;
252b5132
RH
604 unsigned long v;
605
606 v = (unsigned long) addr[0] << 24;
607 v |= (unsigned long) addr[1] << 16;
608 v |= (unsigned long) addr[2] << 8;
609 v |= (unsigned long) addr[3];
c58b9523 610 return v;
252b5132
RH
611}
612
613bfd_vma
edeb6e24 614bfd_getl32 (const void *p)
252b5132 615{
a50b1753 616 const bfd_byte *addr = (const bfd_byte *) p;
252b5132
RH
617 unsigned long v;
618
619 v = (unsigned long) addr[0];
620 v |= (unsigned long) addr[1] << 8;
621 v |= (unsigned long) addr[2] << 16;
622 v |= (unsigned long) addr[3] << 24;
c58b9523 623 return v;
252b5132
RH
624}
625
626bfd_signed_vma
edeb6e24 627bfd_getb_signed_32 (const void *p)
252b5132 628{
a50b1753 629 const bfd_byte *addr = (const bfd_byte *) p;
252b5132
RH
630 unsigned long v;
631
632 v = (unsigned long) addr[0] << 24;
633 v |= (unsigned long) addr[1] << 16;
634 v |= (unsigned long) addr[2] << 8;
635 v |= (unsigned long) addr[3];
636 return COERCE32 (v);
637}
638
639bfd_signed_vma
edeb6e24 640bfd_getl_signed_32 (const void *p)
252b5132 641{
a50b1753 642 const bfd_byte *addr = (const bfd_byte *) p;
252b5132
RH
643 unsigned long v;
644
645 v = (unsigned long) addr[0];
646 v |= (unsigned long) addr[1] << 8;
647 v |= (unsigned long) addr[2] << 16;
648 v |= (unsigned long) addr[3] << 24;
649 return COERCE32 (v);
650}
651
8ce8c090 652bfd_uint64_t
edeb6e24 653bfd_getb64 (const void *p ATTRIBUTE_UNUSED)
252b5132 654{
8ce8c090 655#ifdef BFD_HOST_64_BIT
a50b1753 656 const bfd_byte *addr = (const bfd_byte *) p;
8ce8c090 657 bfd_uint64_t v;
c58b9523
AM
658
659 v = addr[0]; v <<= 8;
660 v |= addr[1]; v <<= 8;
661 v |= addr[2]; v <<= 8;
662 v |= addr[3]; v <<= 8;
663 v |= addr[4]; v <<= 8;
664 v |= addr[5]; v <<= 8;
665 v |= addr[6]; v <<= 8;
666 v |= addr[7];
667
668 return v;
252b5132
RH
669#else
670 BFD_FAIL();
671 return 0;
672#endif
673}
674
8ce8c090 675bfd_uint64_t
edeb6e24 676bfd_getl64 (const void *p ATTRIBUTE_UNUSED)
252b5132 677{
8ce8c090 678#ifdef BFD_HOST_64_BIT
a50b1753 679 const bfd_byte *addr = (const bfd_byte *) p;
8ce8c090 680 bfd_uint64_t v;
c58b9523
AM
681
682 v = addr[7]; v <<= 8;
683 v |= addr[6]; v <<= 8;
684 v |= addr[5]; v <<= 8;
685 v |= addr[4]; v <<= 8;
686 v |= addr[3]; v <<= 8;
687 v |= addr[2]; v <<= 8;
688 v |= addr[1]; v <<= 8;
689 v |= addr[0];
690
691 return v;
252b5132
RH
692#else
693 BFD_FAIL();
694 return 0;
695#endif
696
697}
698
8ce8c090 699bfd_int64_t
edeb6e24 700bfd_getb_signed_64 (const void *p ATTRIBUTE_UNUSED)
252b5132 701{
8ce8c090 702#ifdef BFD_HOST_64_BIT
a50b1753 703 const bfd_byte *addr = (const bfd_byte *) p;
8ce8c090 704 bfd_uint64_t v;
c58b9523
AM
705
706 v = addr[0]; v <<= 8;
707 v |= addr[1]; v <<= 8;
708 v |= addr[2]; v <<= 8;
709 v |= addr[3]; v <<= 8;
710 v |= addr[4]; v <<= 8;
711 v |= addr[5]; v <<= 8;
712 v |= addr[6]; v <<= 8;
713 v |= addr[7];
714
715 return COERCE64 (v);
252b5132
RH
716#else
717 BFD_FAIL();
718 return 0;
719#endif
720}
721
8ce8c090 722bfd_int64_t
edeb6e24 723bfd_getl_signed_64 (const void *p ATTRIBUTE_UNUSED)
252b5132 724{
8ce8c090 725#ifdef BFD_HOST_64_BIT
a50b1753 726 const bfd_byte *addr = (const bfd_byte *) p;
8ce8c090 727 bfd_uint64_t v;
c58b9523
AM
728
729 v = addr[7]; v <<= 8;
730 v |= addr[6]; v <<= 8;
731 v |= addr[5]; v <<= 8;
732 v |= addr[4]; v <<= 8;
733 v |= addr[3]; v <<= 8;
734 v |= addr[2]; v <<= 8;
735 v |= addr[1]; v <<= 8;
736 v |= addr[0];
737
738 return COERCE64 (v);
252b5132
RH
739#else
740 BFD_FAIL();
741 return 0;
742#endif
743}
744
745void
edeb6e24 746bfd_putb32 (bfd_vma data, void *p)
252b5132 747{
a50b1753 748 bfd_byte *addr = (bfd_byte *) p;
edeb6e24
AM
749 addr[0] = (data >> 24) & 0xff;
750 addr[1] = (data >> 16) & 0xff;
751 addr[2] = (data >> 8) & 0xff;
752 addr[3] = data & 0xff;
252b5132
RH
753}
754
755void
edeb6e24 756bfd_putl32 (bfd_vma data, void *p)
252b5132 757{
a50b1753 758 bfd_byte *addr = (bfd_byte *) p;
edeb6e24
AM
759 addr[0] = data & 0xff;
760 addr[1] = (data >> 8) & 0xff;
761 addr[2] = (data >> 16) & 0xff;
762 addr[3] = (data >> 24) & 0xff;
252b5132
RH
763}
764
765void
8ce8c090 766bfd_putb64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
252b5132 767{
8ce8c090 768#ifdef BFD_HOST_64_BIT
a50b1753 769 bfd_byte *addr = (bfd_byte *) p;
edeb6e24
AM
770 addr[0] = (data >> (7*8)) & 0xff;
771 addr[1] = (data >> (6*8)) & 0xff;
772 addr[2] = (data >> (5*8)) & 0xff;
773 addr[3] = (data >> (4*8)) & 0xff;
774 addr[4] = (data >> (3*8)) & 0xff;
775 addr[5] = (data >> (2*8)) & 0xff;
776 addr[6] = (data >> (1*8)) & 0xff;
777 addr[7] = (data >> (0*8)) & 0xff;
252b5132
RH
778#else
779 BFD_FAIL();
780#endif
781}
782
783void
8ce8c090 784bfd_putl64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
252b5132 785{
8ce8c090 786#ifdef BFD_HOST_64_BIT
a50b1753 787 bfd_byte *addr = (bfd_byte *) p;
edeb6e24
AM
788 addr[7] = (data >> (7*8)) & 0xff;
789 addr[6] = (data >> (6*8)) & 0xff;
790 addr[5] = (data >> (5*8)) & 0xff;
791 addr[4] = (data >> (4*8)) & 0xff;
792 addr[3] = (data >> (3*8)) & 0xff;
793 addr[2] = (data >> (2*8)) & 0xff;
794 addr[1] = (data >> (1*8)) & 0xff;
795 addr[0] = (data >> (0*8)) & 0xff;
252b5132
RH
796#else
797 BFD_FAIL();
798#endif
799}
8c603c85
NC
800
801void
8ce8c090 802bfd_put_bits (bfd_uint64_t data, void *p, int bits, bfd_boolean big_p)
8c603c85 803{
a50b1753 804 bfd_byte *addr = (bfd_byte *) p;
8c603c85
NC
805 int i;
806 int bytes;
807
808 if (bits % 8 != 0)
809 abort ();
810
811 bytes = bits / 8;
812 for (i = 0; i < bytes; i++)
813 {
91d6fa6a 814 int addr_index = big_p ? bytes - i - 1 : i;
8c603c85 815
91d6fa6a 816 addr[addr_index] = data & 0xff;
8c603c85
NC
817 data >>= 8;
818 }
819}
820
8ce8c090 821bfd_uint64_t
edeb6e24 822bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
8c603c85 823{
a50b1753 824 const bfd_byte *addr = (const bfd_byte *) p;
8ce8c090 825 bfd_uint64_t data;
8c603c85
NC
826 int i;
827 int bytes;
828
829 if (bits % 8 != 0)
830 abort ();
831
832 data = 0;
833 bytes = bits / 8;
834 for (i = 0; i < bytes; i++)
835 {
91d6fa6a 836 int addr_index = big_p ? i : bytes - i - 1;
509945ae 837
91d6fa6a 838 data = (data << 8) | addr[addr_index];
8c603c85
NC
839 }
840
841 return data;
842}
252b5132
RH
843\f
844/* Default implementation */
845
b34976b6 846bfd_boolean
c58b9523
AM
847_bfd_generic_get_section_contents (bfd *abfd,
848 sec_ptr section,
849 void *location,
850 file_ptr offset,
851 bfd_size_type count)
252b5132 852{
eea6121a 853 bfd_size_type sz;
0bff3f4b 854 if (count == 0)
b34976b6 855 return TRUE;
0bff3f4b 856
4a114e3e
L
857 if (section->compress_status != COMPRESS_SECTION_NONE)
858 {
859 (*_bfd_error_handler)
860 (_("%B: unable to get decompressed section %A"),
861 abfd, section);
862 bfd_set_error (bfd_error_invalid_operation);
863 return FALSE;
864 }
865
e57278ef
AM
866 /* We do allow reading of a section after bfd_final_link has
867 written the contents out to disk. In that situation, rawsize is
868 just a stale version of size, so ignore it. Otherwise we must be
869 reading an input section, where rawsize, if different to size,
870 is the on-disk size. */
871 if (abfd->direction != write_direction && section->rawsize != 0)
872 sz = section->rawsize;
873 else
874 sz = section->size;
e62071b6
AM
875 if (offset + count < count
876 || offset + count > sz)
0bff3f4b
ILT
877 {
878 bfd_set_error (bfd_error_invalid_operation);
b34976b6 879 return FALSE;
0bff3f4b
ILT
880 }
881
882 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
dc810e39 883 || bfd_bread (location, count, abfd) != count)
b34976b6 884 return FALSE;
0bff3f4b 885
b34976b6 886 return TRUE;
252b5132
RH
887}
888
b34976b6 889bfd_boolean
c58b9523
AM
890_bfd_generic_get_section_contents_in_window
891 (bfd *abfd ATTRIBUTE_UNUSED,
892 sec_ptr section ATTRIBUTE_UNUSED,
893 bfd_window *w ATTRIBUTE_UNUSED,
894 file_ptr offset ATTRIBUTE_UNUSED,
895 bfd_size_type count ATTRIBUTE_UNUSED)
252b5132
RH
896{
897#ifdef USE_MMAP
eea6121a
AM
898 bfd_size_type sz;
899
252b5132 900 if (count == 0)
b34976b6 901 return TRUE;
c58b9523
AM
902 if (abfd->xvec->_bfd_get_section_contents
903 != _bfd_generic_get_section_contents)
252b5132
RH
904 {
905 /* We don't know what changes the bfd's get_section_contents
906 method may have to make. So punt trying to map the file
907 window, and let get_section_contents do its thing. */
908 /* @@ FIXME : If the internal window has a refcount of 1 and was
909 allocated with malloc instead of mmap, just reuse it. */
910 bfd_free_window (w);
c58b9523 911 w->i = bfd_zmalloc (sizeof (bfd_window_internal));
252b5132 912 if (w->i == NULL)
b34976b6 913 return FALSE;
c58b9523 914 w->i->data = bfd_malloc (count);
252b5132
RH
915 if (w->i->data == NULL)
916 {
917 free (w->i);
918 w->i = NULL;
b34976b6 919 return FALSE;
252b5132
RH
920 }
921 w->i->mapped = 0;
922 w->i->refcount = 1;
923 w->size = w->i->size = count;
924 w->data = w->i->data;
925 return bfd_get_section_contents (abfd, section, w->data, offset, count);
926 }
e57278ef
AM
927 if (abfd->direction != write_direction && section->rawsize != 0)
928 sz = section->rawsize;
929 else
930 sz = section->size;
eea6121a 931 if (offset + count > sz
82e51918 932 || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
b34976b6
AM
933 TRUE))
934 return FALSE;
935 return TRUE;
252b5132
RH
936#else
937 abort ();
938#endif
939}
940
941/* This generic function can only be used in implementations where creating
942 NEW sections is disallowed. It is useful in patching existing sections
943 in read-write files, though. See other set_section_contents functions
944 to see why it doesn't work for new sections. */
b34976b6 945bfd_boolean
c58b9523
AM
946_bfd_generic_set_section_contents (bfd *abfd,
947 sec_ptr section,
0f867abe 948 const void *location,
c58b9523
AM
949 file_ptr offset,
950 bfd_size_type count)
252b5132
RH
951{
952 if (count == 0)
b34976b6 953 return TRUE;
252b5132 954
dc810e39
AM
955 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
956 || bfd_bwrite (location, count, abfd) != count)
b34976b6 957 return FALSE;
252b5132 958
b34976b6 959 return TRUE;
252b5132
RH
960}
961
962/*
963INTERNAL_FUNCTION
964 bfd_log2
965
966SYNOPSIS
dc810e39 967 unsigned int bfd_log2 (bfd_vma x);
252b5132
RH
968
969DESCRIPTION
970 Return the log base 2 of the value supplied, rounded up. E.g., an
dc810e39 971 @var{x} of 1025 returns 11. A @var{x} of 0 returns 0.
252b5132
RH
972*/
973
974unsigned int
c58b9523 975bfd_log2 (bfd_vma x)
252b5132
RH
976{
977 unsigned int result = 0;
978
9e6619e2
AM
979 if (x <= 1)
980 return result;
981 --x;
982 do
252b5132 983 ++result;
9e6619e2 984 while ((x >>= 1) != 0);
252b5132
RH
985 return result;
986}
987
b34976b6 988bfd_boolean
c58b9523 989bfd_generic_is_local_label_name (bfd *abfd, const char *name)
252b5132
RH
990{
991 char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
992
b34976b6 993 return name[0] == locals_prefix;
252b5132
RH
994}
995
875f7f69
JR
996/* Can be used from / for bfd_merge_private_bfd_data to check that
997 endianness matches between input and output file. Returns
b34976b6
AM
998 TRUE for a match, otherwise returns FALSE and emits an error. */
999bfd_boolean
c58b9523 1000_bfd_generic_verify_endian_match (bfd *ibfd, bfd *obfd)
875f7f69
JR
1001{
1002 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1fe494a5 1003 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
875f7f69
JR
1004 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1005 {
1fe494a5
NC
1006 const char *msg;
1007
1008 if (bfd_big_endian (ibfd))
d003868e 1009 msg = _("%B: compiled for a big endian system and target is little endian");
1fe494a5 1010 else
d003868e 1011 msg = _("%B: compiled for a little endian system and target is big endian");
1fe494a5 1012
d003868e 1013 (*_bfd_error_handler) (msg, ibfd);
875f7f69
JR
1014
1015 bfd_set_error (bfd_error_wrong_format);
b34976b6 1016 return FALSE;
875f7f69
JR
1017 }
1018
b34976b6 1019 return TRUE;
875f7f69 1020}
dc810e39
AM
1021
1022/* Give a warning at runtime if someone compiles code which calls
1023 old routines. */
ca09e32b 1024
dc810e39 1025void
c58b9523
AM
1026warn_deprecated (const char *what,
1027 const char *file,
1028 int line,
1029 const char *func)
dc810e39
AM
1030{
1031 /* Poor man's tracking of functions we've already warned about. */
1032 static size_t mask = 0;
1033
1034 if (~(size_t) func & ~mask)
1035 {
4a97a0e5 1036 fflush (stdout);
73722af0 1037 /* Note: separate sentences in order to allow
ca09e32b 1038 for translation into other languages. */
dc810e39 1039 if (func)
ca09e32b
NC
1040 fprintf (stderr, _("Deprecated %s called at %s line %d in %s\n"),
1041 what, file, line, func);
dc810e39 1042 else
ca09e32b 1043 fprintf (stderr, _("Deprecated %s called\n"), what);
4a97a0e5 1044 fflush (stderr);
dc810e39
AM
1045 mask |= ~(size_t) func;
1046 }
1047}
c0c28ab8
L
1048
1049/* Helper function for reading uleb128 encoded data. */
1050
1051bfd_vma
1052read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
f075ee0c 1053 bfd_byte *buf,
c0c28ab8
L
1054 unsigned int *bytes_read_ptr)
1055{
1056 bfd_vma result;
1057 unsigned int num_read;
f075ee0c 1058 unsigned int shift;
c0c28ab8
L
1059 unsigned char byte;
1060
1061 result = 0;
1062 shift = 0;
1063 num_read = 0;
1064 do
1065 {
f075ee0c 1066 byte = bfd_get_8 (abfd, buf);
c0c28ab8
L
1067 buf++;
1068 num_read++;
1069 result |= (((bfd_vma) byte & 0x7f) << shift);
1070 shift += 7;
1071 }
1072 while (byte & 0x80);
1073 *bytes_read_ptr = num_read;
1074 return result;
1075}
1076
1077/* Helper function for reading sleb128 encoded data. */
1078
1079bfd_signed_vma
1080read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
f075ee0c
AM
1081 bfd_byte *buf,
1082 unsigned int *bytes_read_ptr)
c0c28ab8
L
1083{
1084 bfd_vma result;
f075ee0c
AM
1085 unsigned int shift;
1086 unsigned int num_read;
c0c28ab8
L
1087 unsigned char byte;
1088
1089 result = 0;
1090 shift = 0;
1091 num_read = 0;
1092 do
1093 {
f075ee0c 1094 byte = bfd_get_8 (abfd, buf);
c0c28ab8
L
1095 buf ++;
1096 num_read ++;
1097 result |= (((bfd_vma) byte & 0x7f) << shift);
1098 shift += 7;
1099 }
1100 while (byte & 0x80);
f075ee0c 1101 if (shift < 8 * sizeof (result) && (byte & 0x40))
c0c28ab8
L
1102 result |= (((bfd_vma) -1) << shift);
1103 *bytes_read_ptr = num_read;
1104 return result;
1105}
5420f73d 1106
ccd2ec6a
L
1107bfd_boolean
1108_bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
1109 asection *isec ATTRIBUTE_UNUSED,
1110 bfd *obfd ATTRIBUTE_UNUSED,
1111 asection *osec ATTRIBUTE_UNUSED,
1112 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1113{
1114 return TRUE;
1115}
This page took 0.79266 seconds and 4 git commands to generate.