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