Coverage Report

Created: 2023-08-28 06:28

/src/binutils-gdb/bfd/libbfd.c
Line
Count
Source (jump to first uncovered line)
1
/* Assorted BFD support routines, only used internally.
2
   Copyright (C) 1990-2023 Free Software Foundation, Inc.
3
   Written by Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
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
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
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.
16
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
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "libbfd.h"
25
#include "objalloc.h"
26
27
#ifndef HAVE_GETPAGESIZE
28
#define getpagesize() 2048
29
#endif
30
31
/*
32
SECTION
33
  Implementation details
34
35
SUBSECTION
36
  Internal functions
37
38
DESCRIPTION
39
  These routines are used within BFD.
40
  They are not intended for export, but are documented here for
41
  completeness.
42
*/
43
44
bool
45
_bfd_bool_bfd_false (bfd *abfd ATTRIBUTE_UNUSED)
46
0
{
47
0
  return false;
48
0
}
49
50
bool
51
_bfd_bool_bfd_asymbol_false (bfd *abfd ATTRIBUTE_UNUSED,
52
           asymbol *sym ATTRIBUTE_UNUSED)
53
0
{
54
0
  return false;
55
0
}
56
57
/* A routine which is used in target vectors for unsupported
58
   operations.  */
59
60
bool
61
_bfd_bool_bfd_false_error (bfd *ignore ATTRIBUTE_UNUSED)
62
1.31k
{
63
1.31k
  bfd_set_error (bfd_error_invalid_operation);
64
1.31k
  return false;
65
1.31k
}
66
67
bool
68
_bfd_bool_bfd_link_false_error (bfd *abfd,
69
        struct bfd_link_info *info ATTRIBUTE_UNUSED)
70
0
{
71
0
  return _bfd_bool_bfd_false_error (abfd);
72
0
}
73
74
/* A routine which is used in target vectors for supported operations
75
   which do not actually do anything.  */
76
77
bool
78
_bfd_bool_bfd_true (bfd *ignore ATTRIBUTE_UNUSED)
79
1.34k
{
80
1.34k
  return true;
81
1.34k
}
82
83
bool
84
_bfd_bool_bfd_link_true (bfd *abfd ATTRIBUTE_UNUSED,
85
       struct bfd_link_info *info ATTRIBUTE_UNUSED)
86
0
{
87
0
  return true;
88
0
}
89
90
bool
91
_bfd_bool_bfd_bfd_true (bfd *ibfd ATTRIBUTE_UNUSED,
92
      bfd *obfd ATTRIBUTE_UNUSED)
93
0
{
94
0
  return true;
95
0
}
96
97
bool
98
_bfd_bool_bfd_uint_true (bfd *abfd ATTRIBUTE_UNUSED,
99
       unsigned int flags ATTRIBUTE_UNUSED)
100
0
{
101
0
  return true;
102
0
}
103
104
bool
105
_bfd_bool_bfd_asection_bfd_asection_true (bfd *ibfd ATTRIBUTE_UNUSED,
106
            asection *isec ATTRIBUTE_UNUSED,
107
            bfd *obfd ATTRIBUTE_UNUSED,
108
            asection *osec ATTRIBUTE_UNUSED)
109
0
{
110
0
  return true;
111
0
}
112
113
bool
114
_bfd_bool_bfd_asymbol_bfd_asymbol_true (bfd *ibfd ATTRIBUTE_UNUSED,
115
          asymbol *isym ATTRIBUTE_UNUSED,
116
          bfd *obfd ATTRIBUTE_UNUSED,
117
          asymbol *osym ATTRIBUTE_UNUSED)
118
0
{
119
0
  return true;
120
0
}
121
122
bool
123
_bfd_bool_bfd_ptr_true (bfd *abfd ATTRIBUTE_UNUSED,
124
      void *ptr ATTRIBUTE_UNUSED)
125
0
{
126
0
  return true;
127
0
}
128
129
/* A routine which is used in target vectors for unsupported
130
   operations which return a pointer value.  */
131
132
void *
133
_bfd_ptr_bfd_null_error (bfd *ignore ATTRIBUTE_UNUSED)
134
487
{
135
487
  bfd_set_error (bfd_error_invalid_operation);
136
487
  return NULL;
137
487
}
138
139
int
140
_bfd_int_bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
141
0
{
142
0
  return 0;
143
0
}
144
145
unsigned int
146
_bfd_uint_bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
147
0
{
148
0
   return 0;
149
0
}
150
151
long
152
_bfd_long_bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
153
0
{
154
0
  return 0;
155
0
}
156
157
/* A routine which is used in target vectors for unsupported
158
   operations which return -1 on error.  */
159
160
long
161
_bfd_long_bfd_n1_error (bfd *ignore_abfd ATTRIBUTE_UNUSED)
162
75
{
163
75
  bfd_set_error (bfd_error_invalid_operation);
164
75
  return -1;
165
75
}
166
167
void
168
_bfd_void_bfd (bfd *ignore ATTRIBUTE_UNUSED)
169
436k
{
170
436k
}
171
172
void
173
_bfd_void_bfd_link (bfd *abfd ATTRIBUTE_UNUSED,
174
        struct bfd_link_info *info ATTRIBUTE_UNUSED)
175
0
{
176
0
}
177
178
void
179
_bfd_void_bfd_asection (bfd *abfd ATTRIBUTE_UNUSED,
180
      asection *sec ATTRIBUTE_UNUSED)
181
0
{
182
0
}
183
184
long
185
_bfd_norelocs_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
186
             asection *sec ATTRIBUTE_UNUSED)
187
0
{
188
0
  return sizeof (arelent *);
189
0
}
190
191
long
192
_bfd_norelocs_canonicalize_reloc (bfd *abfd ATTRIBUTE_UNUSED,
193
          asection *sec ATTRIBUTE_UNUSED,
194
          arelent **relptr,
195
          asymbol **symbols ATTRIBUTE_UNUSED)
196
0
{
197
0
  *relptr = NULL;
198
0
  return 0;
199
0
}
200
201
void
202
_bfd_norelocs_set_reloc (bfd *abfd ATTRIBUTE_UNUSED,
203
       asection *sec ATTRIBUTE_UNUSED,
204
       arelent **relptr ATTRIBUTE_UNUSED,
205
       unsigned int count ATTRIBUTE_UNUSED)
206
0
{
207
  /* Do nothing.  */
208
0
}
209
210
bool
211
_bfd_nocore_core_file_matches_executable_p
212
  (bfd *ignore_core_bfd ATTRIBUTE_UNUSED,
213
   bfd *ignore_exec_bfd ATTRIBUTE_UNUSED)
214
0
{
215
0
  bfd_set_error (bfd_error_invalid_operation);
216
0
  return false;
217
0
}
218
219
/* Routine to handle core_file_failing_command entry point for targets
220
   without core file support.  */
221
222
char *
223
_bfd_nocore_core_file_failing_command (bfd *ignore_abfd ATTRIBUTE_UNUSED)
224
0
{
225
0
  bfd_set_error (bfd_error_invalid_operation);
226
0
  return NULL;
227
0
}
228
229
/* Routine to handle core_file_failing_signal entry point for targets
230
   without core file support.  */
231
232
int
233
_bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED)
234
0
{
235
0
  bfd_set_error (bfd_error_invalid_operation);
236
0
  return 0;
237
0
}
238
239
/* Routine to handle the core_file_pid entry point for targets without
240
   core file support.  */
241
242
int
243
_bfd_nocore_core_file_pid (bfd *ignore_abfd ATTRIBUTE_UNUSED)
244
0
{
245
0
  bfd_set_error (bfd_error_invalid_operation);
246
0
  return 0;
247
0
}
248
249
bfd_cleanup
250
_bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED)
251
1.28M
{
252
1.28M
  bfd_set_error (bfd_error_wrong_format);
253
1.28M
  return 0;
254
1.28M
}
255

256
/* Allocate memory using malloc.  */
257
258
#ifndef SSIZE_MAX
259
2.77M
#define SSIZE_MAX ((size_t) -1 >> 1)
260
#endif
261
262
/*
263
INTERNAL_FUNCTION
264
  bfd_malloc
265
266
SYNOPSIS
267
  void *bfd_malloc (bfd_size_type {*size*});
268
269
DESCRIPTION
270
  Returns a pointer to an allocated block of memory that is at least
271
  SIZE bytes long.  If SIZE is 0 then it will be treated as if it were
272
  1.  If SIZE is too big then NULL will be returned.
273
  
274
  Returns NULL upon error and sets bfd_error.
275
*/
276
void *
277
bfd_malloc (bfd_size_type size)
278
2.75M
{
279
2.75M
  void *ptr;
280
2.75M
  size_t sz = (size_t) size;
281
282
2.75M
  if (size != sz
283
      /* This is to pacify memory checkers like valgrind.  */
284
2.75M
      || sz > SSIZE_MAX)
285
0
    {
286
0
      bfd_set_error (bfd_error_no_memory);
287
0
      return NULL;
288
0
    }
289
290
2.75M
  ptr = malloc (sz ? sz : 1);
291
2.75M
  if (ptr == NULL)
292
0
    bfd_set_error (bfd_error_no_memory);
293
294
2.75M
  return ptr;
295
2.75M
}
296
297
/*
298
INTERNAL_FUNCTION
299
  bfd_realloc
300
301
SYNOPSIS
302
  void *bfd_realloc (void *{*mem*}, bfd_size_type {*size*});
303
304
DESCRIPTION
305
  Returns a pointer to an allocated block of memory that is at least
306
  SIZE bytes long.  If SIZE is 0 then it will be treated as if it were
307
  1.  If SIZE is too big then NULL will be returned.
308
  
309
  If MEM is not NULL then it must point to an allocated block of memory.
310
  If this block is large enough then MEM may be used as the return
311
  value for this function, but this is not guaranteed.
312
313
  If MEM is not returned then the first N bytes in the returned block
314
  will be identical to the first N bytes in region pointed to by MEM,
315
  where N is the lessor of SIZE and the length of the region of memory
316
  currently addressed by MEM.
317
318
  Returns NULL upon error and sets bfd_error.
319
*/
320
void *
321
bfd_realloc (void *ptr, bfd_size_type size)
322
23.3k
{
323
23.3k
  void *ret;
324
23.3k
  size_t sz = (size_t) size;
325
326
23.3k
  if (ptr == NULL)
327
3.96k
    return bfd_malloc (size);
328
329
19.3k
  if (size != sz
330
      /* This is to pacify memory checkers like valgrind.  */
331
19.3k
      || sz > SSIZE_MAX)
332
0
    {
333
0
      bfd_set_error (bfd_error_no_memory);
334
0
      return NULL;
335
0
    }
336
337
  /* The behaviour of realloc(0) is implementation defined,
338
     but for this function we always allocate memory.  */
339
19.3k
  ret = realloc (ptr, sz ? sz : 1);
340
341
19.3k
  if (ret == NULL)
342
0
    bfd_set_error (bfd_error_no_memory);
343
344
19.3k
  return ret;
345
19.3k
}
346
347
/*
348
INTERNAL_FUNCTION
349
  bfd_realloc_or_free
350
351
SYNOPSIS
352
  void *bfd_realloc_or_free (void *{*mem*}, bfd_size_type {*size*});
353
354
DESCRIPTION
355
  Returns a pointer to an allocated block of memory that is at least
356
  SIZE bytes long.  If SIZE is 0 then no memory will be allocated,
357
  MEM will be freed, and NULL will be returned.  This will not cause
358
  bfd_error to be set.
359
360
  If SIZE is too big then NULL will be returned and bfd_error will be
361
  set. 
362
  
363
  If MEM is not NULL then it must point to an allocated block of memory.
364
  If this block is large enough then MEM may be used as the return
365
  value for this function, but this is not guaranteed.
366
367
  If MEM is not returned then the first N bytes in the returned block
368
  will be identical to the first N bytes in region pointed to by MEM,
369
  where N is the lessor of SIZE and the length of the region of memory
370
  currently addressed by MEM.
371
*/
372
void *
373
bfd_realloc_or_free (void *ptr, bfd_size_type size)
374
16.1k
{
375
16.1k
  void *ret;
376
377
  /* The behaviour of realloc(0) is implementation defined, but
378
     for this function we treat it is always freeing the memory.  */
379
16.1k
  if (size == 0)
380
0
    {
381
0
      free (ptr);
382
0
      return NULL;
383
0
    }
384
      
385
16.1k
  ret = bfd_realloc (ptr, size);
386
16.1k
  if (ret == NULL)
387
0
    free (ptr);
388
389
16.1k
  return ret;
390
16.1k
}
391
392
/*
393
INTERNAL_FUNCTION
394
  bfd_zmalloc
395
396
SYNOPSIS
397
  void *bfd_zmalloc (bfd_size_type {*size*});
398
399
DESCRIPTION
400
  Returns a pointer to an allocated block of memory that is at least
401
  SIZE bytes long.  If SIZE is 0 then it will be treated as if it were
402
  1.  If SIZE is too big then NULL will be returned.
403
  
404
  Returns NULL upon error and sets bfd_error.
405
406
  If NULL is not returned then the allocated block of memory will
407
  have been cleared.
408
*/
409
void *
410
bfd_zmalloc (bfd_size_type size)
411
479k
{
412
479k
  void *ptr = bfd_malloc (size);
413
414
479k
  if (ptr != NULL)
415
479k
    memset (ptr, 0, size ? (size_t) size : 1);
416
417
479k
  return ptr;
418
479k
}
419
420
/*
421
FUNCTION
422
  bfd_alloc
423
424
SYNOPSIS
425
  void *bfd_alloc (bfd *abfd, bfd_size_type wanted);
426
427
DESCRIPTION
428
  Allocate a block of @var{wanted} bytes of memory attached to
429
  <<abfd>> and return a pointer to it.
430
*/
431
432
void *
433
bfd_alloc (bfd *abfd, bfd_size_type size)
434
147M
{
435
147M
  void *ret;
436
147M
  unsigned long ul_size = (unsigned long) size;
437
438
147M
  if (size != ul_size
439
      /* Note - although objalloc_alloc takes an unsigned long as its
440
   argument, internally the size is treated as a signed long.  This can
441
   lead to problems where, for example, a request to allocate -1 bytes
442
   can result in just 1 byte being allocated, rather than
443
   ((unsigned long) -1) bytes.  Also memory checkers will often
444
   complain about attempts to allocate a negative amount of memory.
445
   So to stop these problems we fail if the size is negative.  */
446
147M
      || ((signed long) ul_size) < 0)
447
0
    {
448
0
      bfd_set_error (bfd_error_no_memory);
449
0
      return NULL;
450
0
    }
451
452
147M
  ret = objalloc_alloc ((struct objalloc *) abfd->memory, ul_size);
453
147M
  if (ret == NULL)
454
0
    bfd_set_error (bfd_error_no_memory);
455
147M
  else
456
147M
    abfd->alloc_size += size;
457
147M
  return ret;
458
147M
}
459
460
/*
461
FUNCTION
462
  bfd_zalloc
463
464
SYNOPSIS
465
  void *bfd_zalloc (bfd *abfd, bfd_size_type wanted);
466
467
DESCRIPTION
468
  Allocate a block of @var{wanted} bytes of zeroed memory
469
  attached to <<abfd>> and return a pointer to it.
470
*/
471
472
void *
473
bfd_zalloc (bfd *abfd, bfd_size_type size)
474
42.3M
{
475
42.3M
  void *res;
476
477
42.3M
  res = bfd_alloc (abfd, size);
478
42.3M
  if (res)
479
42.3M
    memset (res, 0, (size_t) size);
480
42.3M
  return res;
481
42.3M
}
482
483
/*
484
FUNCTION
485
  bfd_release
486
487
SYNOPSIS
488
  void bfd_release (bfd *, void *);
489
490
DESCRIPTION
491
  Free a block allocated for a BFD.
492
  Note: Also frees all more recently allocated blocks!
493
*/
494
495
void
496
bfd_release (bfd *abfd, void *block)
497
83.7M
{
498
83.7M
  objalloc_free_block ((struct objalloc *) abfd->memory, block);
499
83.7M
}
500
501
/*
502
INTERNAL_FUNCTION
503
  bfd_write_bigendian_4byte_int
504
505
SYNOPSIS
506
  bool bfd_write_bigendian_4byte_int (bfd *, unsigned int);
507
508
DESCRIPTION
509
  Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
510
  endian order regardless of what else is going on.  This is useful in
511
  archives.
512
513
*/
514
bool
515
bfd_write_bigendian_4byte_int (bfd *abfd, unsigned int i)
516
0
{
517
0
  bfd_byte buffer[4];
518
0
  bfd_putb32 (i, buffer);
519
0
  return bfd_write (buffer, 4, abfd) == 4;
520
0
}
521
522

523
/** The do-it-yourself (byte) sex-change kit */
524
525
/* The middle letter e.g. get<b>short indicates Big or Little endian
526
   target machine.  It doesn't matter what the byte order of the host
527
   machine is; these routines work for either.  */
528
529
/* FIXME: Should these take a count argument?
530
   Answer (gnu@cygnus.com):  No, but perhaps they should be inline
531
           functions in swap.h #ifdef __GNUC__.
532
           Gprof them later and find out.  */
533
534
/*
535
FUNCTION
536
  bfd_put_size
537
FUNCTION
538
  bfd_get_size
539
540
DESCRIPTION
541
  These macros as used for reading and writing raw data in
542
  sections; each access (except for bytes) is vectored through
543
  the target format of the BFD and mangled accordingly. The
544
  mangling performs any necessary endian translations and
545
  removes alignment restrictions.  Note that types accepted and
546
  returned by these macros are identical so they can be swapped
547
  around in macros---for example, @file{libaout.h} defines <<GET_WORD>>
548
  to either <<bfd_get_32>> or <<bfd_get_64>>.
549
550
  In the put routines, @var{val} must be a <<bfd_vma>>.  If we are on a
551
  system without prototypes, the caller is responsible for making
552
  sure that is true, with a cast if necessary.  We don't cast
553
  them in the macro definitions because that would prevent <<lint>>
554
  or <<gcc -Wall>> from detecting sins such as passing a pointer.
555
  To detect calling these with less than a <<bfd_vma>>, use
556
  <<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s.
557
558
.
559
.{* Byte swapping macros for user section data.  *}
560
.
561
.#define bfd_put_8(abfd, val, ptr) \
562
.  ((void) (*((bfd_byte *) (ptr)) = (val) & 0xff))
563
.#define bfd_put_signed_8 \
564
.  bfd_put_8
565
.#define bfd_get_8(abfd, ptr) \
566
.  ((bfd_vma) *(const bfd_byte *) (ptr) & 0xff)
567
.#define bfd_get_signed_8(abfd, ptr) \
568
.  ((((bfd_signed_vma) *(const bfd_byte *) (ptr) & 0xff) ^ 0x80) - 0x80)
569
.
570
.#define bfd_put_16(abfd, val, ptr) \
571
.  BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
572
.#define bfd_put_signed_16 \
573
.  bfd_put_16
574
.#define bfd_get_16(abfd, ptr) \
575
.  BFD_SEND (abfd, bfd_getx16, (ptr))
576
.#define bfd_get_signed_16(abfd, ptr) \
577
.  BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
578
.
579
.#define bfd_put_24(abfd, val, ptr) \
580
.  do         \
581
.    if (bfd_big_endian (abfd))   \
582
.      bfd_putb24 ((val), (ptr)); \
583
.    else       \
584
.      bfd_putl24 ((val), (ptr)); \
585
.  while (0)
586
.
587
.bfd_vma bfd_getb24 (const void *p);
588
.bfd_vma bfd_getl24 (const void *p);
589
.
590
.#define bfd_get_24(abfd, ptr) \
591
.  (bfd_big_endian (abfd) ? bfd_getb24 (ptr) : bfd_getl24 (ptr))
592
.
593
.#define bfd_put_32(abfd, val, ptr) \
594
.  BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
595
.#define bfd_put_signed_32 \
596
.  bfd_put_32
597
.#define bfd_get_32(abfd, ptr) \
598
.  BFD_SEND (abfd, bfd_getx32, (ptr))
599
.#define bfd_get_signed_32(abfd, ptr) \
600
.  BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
601
.
602
.#define bfd_put_64(abfd, val, ptr) \
603
.  BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
604
.#define bfd_put_signed_64 \
605
.  bfd_put_64
606
.#define bfd_get_64(abfd, ptr) \
607
.  BFD_SEND (abfd, bfd_getx64, (ptr))
608
.#define bfd_get_signed_64(abfd, ptr) \
609
.  BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
610
.
611
.#define bfd_get(bits, abfd, ptr)     \
612
.  ((bits) == 8 ? bfd_get_8 (abfd, ptr)     \
613
.   : (bits) == 16 ? bfd_get_16 (abfd, ptr)   \
614
.   : (bits) == 32 ? bfd_get_32 (abfd, ptr)   \
615
.   : (bits) == 64 ? bfd_get_64 (abfd, ptr)   \
616
.   : (abort (), (bfd_vma) - 1))
617
.
618
.#define bfd_put(bits, abfd, val, ptr)      \
619
.  ((bits) == 8 ? bfd_put_8  (abfd, val, ptr)   \
620
.   : (bits) == 16 ? bfd_put_16 (abfd, val, ptr)  \
621
.   : (bits) == 32 ? bfd_put_32 (abfd, val, ptr)  \
622
.   : (bits) == 64 ? bfd_put_64 (abfd, val, ptr)  \
623
.   : (abort (), (void) 0))
624
.
625
*/
626
627
/*
628
FUNCTION
629
  bfd_h_put_size
630
  bfd_h_get_size
631
632
DESCRIPTION
633
  These macros have the same function as their <<bfd_get_x>>
634
  brethren, except that they are used for removing information
635
  for the header records of object files. Believe it or not,
636
  some object files keep their header records in big endian
637
  order and their data in little endian order.
638
.
639
.{* Byte swapping macros for file header data.  *}
640
.
641
.#define bfd_h_put_8(abfd, val, ptr) \
642
.  bfd_put_8 (abfd, val, ptr)
643
.#define bfd_h_put_signed_8(abfd, val, ptr) \
644
.  bfd_put_8 (abfd, val, ptr)
645
.#define bfd_h_get_8(abfd, ptr) \
646
.  bfd_get_8 (abfd, ptr)
647
.#define bfd_h_get_signed_8(abfd, ptr) \
648
.  bfd_get_signed_8 (abfd, ptr)
649
.
650
.#define bfd_h_put_16(abfd, val, ptr) \
651
.  BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
652
.#define bfd_h_put_signed_16 \
653
.  bfd_h_put_16
654
.#define bfd_h_get_16(abfd, ptr) \
655
.  BFD_SEND (abfd, bfd_h_getx16, (ptr))
656
.#define bfd_h_get_signed_16(abfd, ptr) \
657
.  BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
658
.
659
.#define bfd_h_put_32(abfd, val, ptr) \
660
.  BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
661
.#define bfd_h_put_signed_32 \
662
.  bfd_h_put_32
663
.#define bfd_h_get_32(abfd, ptr) \
664
.  BFD_SEND (abfd, bfd_h_getx32, (ptr))
665
.#define bfd_h_get_signed_32(abfd, ptr) \
666
.  BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
667
.
668
.#define bfd_h_put_64(abfd, val, ptr) \
669
.  BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
670
.#define bfd_h_put_signed_64 \
671
.  bfd_h_put_64
672
.#define bfd_h_get_64(abfd, ptr) \
673
.  BFD_SEND (abfd, bfd_h_getx64, (ptr))
674
.#define bfd_h_get_signed_64(abfd, ptr) \
675
.  BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
676
.
677
.{* Aliases for the above, which should eventually go away.  *}
678
.
679
.#define H_PUT_64  bfd_h_put_64
680
.#define H_PUT_32  bfd_h_put_32
681
.#define H_PUT_16  bfd_h_put_16
682
.#define H_PUT_8   bfd_h_put_8
683
.#define H_PUT_S64 bfd_h_put_signed_64
684
.#define H_PUT_S32 bfd_h_put_signed_32
685
.#define H_PUT_S16 bfd_h_put_signed_16
686
.#define H_PUT_S8  bfd_h_put_signed_8
687
.#define H_GET_64  bfd_h_get_64
688
.#define H_GET_32  bfd_h_get_32
689
.#define H_GET_16  bfd_h_get_16
690
.#define H_GET_8   bfd_h_get_8
691
.#define H_GET_S64 bfd_h_get_signed_64
692
.#define H_GET_S32 bfd_h_get_signed_32
693
.#define H_GET_S16 bfd_h_get_signed_16
694
.#define H_GET_S8  bfd_h_get_signed_8
695
.
696
.*/
697
698
/* Sign extension to bfd_signed_vma.  */
699
4.98k
#define COERCE16(x) (((bfd_vma) (x) ^ 0x8000) - 0x8000)
700
782k
#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
701
#define COERCE64(x) \
702
533k
  (((uint64_t) (x) ^ ((uint64_t) 1 << 63)) - ((uint64_t) 1 << 63))
703
704
/*
705
FUNCTION
706
  Byte swapping routines.
707
708
SYNOPSIS
709
  uint64_t bfd_getb64 (const void *);
710
  uint64_t bfd_getl64 (const void *);
711
  int64_t bfd_getb_signed_64 (const void *);
712
  int64_t bfd_getl_signed_64 (const void *);
713
  bfd_vma bfd_getb32 (const void *);
714
  bfd_vma bfd_getl32 (const void *);
715
  bfd_signed_vma bfd_getb_signed_32 (const void *);
716
  bfd_signed_vma bfd_getl_signed_32 (const void *);
717
  bfd_vma bfd_getb16 (const void *);
718
  bfd_vma bfd_getl16 (const void *);
719
  bfd_signed_vma bfd_getb_signed_16 (const void *);
720
  bfd_signed_vma bfd_getl_signed_16 (const void *);
721
  void bfd_putb64 (uint64_t, void *);
722
  void bfd_putl64 (uint64_t, void *);
723
  void bfd_putb32 (bfd_vma, void *);
724
  void bfd_putl32 (bfd_vma, void *);
725
  void bfd_putb24 (bfd_vma, void *);
726
  void bfd_putl24 (bfd_vma, void *);
727
  void bfd_putb16 (bfd_vma, void *);
728
  void bfd_putl16 (bfd_vma, void *);
729
  uint64_t bfd_get_bits (const void *, int, bool);
730
  void bfd_put_bits (uint64_t, void *, int, bool);
731
*/
732
733
bfd_vma
734
bfd_getb16 (const void *p)
735
43.4M
{
736
43.4M
  const bfd_byte *addr = (const bfd_byte *) p;
737
43.4M
  return (addr[0] << 8) | addr[1];
738
43.4M
}
739
740
bfd_vma
741
bfd_getl16 (const void *p)
742
105M
{
743
105M
  const bfd_byte *addr = (const bfd_byte *) p;
744
105M
  return (addr[1] << 8) | addr[0];
745
105M
}
746
747
bfd_signed_vma
748
bfd_getb_signed_16 (const void *p)
749
20
{
750
20
  const bfd_byte *addr = (const bfd_byte *) p;
751
20
  return COERCE16 ((addr[0] << 8) | addr[1]);
752
20
}
753
754
bfd_signed_vma
755
bfd_getl_signed_16 (const void *p)
756
4.96k
{
757
4.96k
  const bfd_byte *addr = (const bfd_byte *) p;
758
4.96k
  return COERCE16 ((addr[1] << 8) | addr[0]);
759
4.96k
}
760
761
void
762
bfd_putb16 (bfd_vma data, void *p)
763
721
{
764
721
  bfd_byte *addr = (bfd_byte *) p;
765
721
  addr[0] = (data >> 8) & 0xff;
766
721
  addr[1] = data & 0xff;
767
721
}
768
769
void
770
bfd_putl16 (bfd_vma data, void *p)
771
23.6k
{
772
23.6k
  bfd_byte *addr = (bfd_byte *) p;
773
23.6k
  addr[0] = data & 0xff;
774
23.6k
  addr[1] = (data >> 8) & 0xff;
775
23.6k
}
776
777
void
778
bfd_putb24 (bfd_vma data, void *p)
779
0
{
780
0
  bfd_byte *addr = (bfd_byte *) p;
781
0
  addr[0] = (data >> 16) & 0xff;
782
0
  addr[1] = (data >> 8) & 0xff;
783
0
  addr[2] = data & 0xff;
784
0
}
785
786
void
787
bfd_putl24 (bfd_vma data, void *p)
788
0
{
789
0
  bfd_byte *addr = (bfd_byte *) p;
790
0
  addr[0] = data & 0xff;
791
0
  addr[1] = (data >> 8) & 0xff;
792
0
  addr[2] = (data >> 16) & 0xff;
793
0
}
794
795
bfd_vma
796
bfd_getb24 (const void *p)
797
0
{
798
0
  const bfd_byte *addr = (const bfd_byte *) p;
799
0
  uint32_t v;
800
801
0
  v =  (uint32_t) addr[0] << 16;
802
0
  v |= (uint32_t) addr[1] << 8;
803
0
  v |= (uint32_t) addr[2];
804
0
  return v;
805
0
}
806
807
bfd_vma
808
bfd_getl24 (const void *p)
809
0
{
810
0
  const bfd_byte *addr = (const bfd_byte *) p;
811
0
  uint32_t v;
812
813
0
  v = (uint32_t) addr[0];
814
0
  v |= (uint32_t) addr[1] << 8;
815
0
  v |= (uint32_t) addr[2] << 16;
816
0
  return v;
817
0
}
818
819
bfd_vma
820
bfd_getb32 (const void *p)
821
83.3M
{
822
83.3M
  const bfd_byte *addr = (const bfd_byte *) p;
823
83.3M
  uint32_t v;
824
825
83.3M
  v = (uint32_t) addr[0] << 24;
826
83.3M
  v |= (uint32_t) addr[1] << 16;
827
83.3M
  v |= (uint32_t) addr[2] << 8;
828
83.3M
  v |= (uint32_t) addr[3];
829
83.3M
  return v;
830
83.3M
}
831
832
bfd_vma
833
bfd_getl32 (const void *p)
834
152M
{
835
152M
  const bfd_byte *addr = (const bfd_byte *) p;
836
152M
  uint32_t v;
837
838
152M
  v = (uint32_t) addr[0];
839
152M
  v |= (uint32_t) addr[1] << 8;
840
152M
  v |= (uint32_t) addr[2] << 16;
841
152M
  v |= (uint32_t) addr[3] << 24;
842
152M
  return v;
843
152M
}
844
845
bfd_signed_vma
846
bfd_getb_signed_32 (const void *p)
847
19.1k
{
848
19.1k
  const bfd_byte *addr = (const bfd_byte *) p;
849
19.1k
  uint32_t v;
850
851
19.1k
  v = (uint32_t) addr[0] << 24;
852
19.1k
  v |= (uint32_t) addr[1] << 16;
853
19.1k
  v |= (uint32_t) addr[2] << 8;
854
19.1k
  v |= (uint32_t) addr[3];
855
19.1k
  return COERCE32 (v);
856
19.1k
}
857
858
bfd_signed_vma
859
bfd_getl_signed_32 (const void *p)
860
762k
{
861
762k
  const bfd_byte *addr = (const bfd_byte *) p;
862
762k
  uint32_t v;
863
864
762k
  v = (uint32_t) addr[0];
865
762k
  v |= (uint32_t) addr[1] << 8;
866
762k
  v |= (uint32_t) addr[2] << 16;
867
762k
  v |= (uint32_t) addr[3] << 24;
868
762k
  return COERCE32 (v);
869
762k
}
870
871
uint64_t
872
bfd_getb64 (const void *p)
873
6.22M
{
874
6.22M
  const bfd_byte *addr = (const bfd_byte *) p;
875
6.22M
  uint64_t v;
876
877
6.22M
  v  = addr[0]; v <<= 8;
878
6.22M
  v |= addr[1]; v <<= 8;
879
6.22M
  v |= addr[2]; v <<= 8;
880
6.22M
  v |= addr[3]; v <<= 8;
881
6.22M
  v |= addr[4]; v <<= 8;
882
6.22M
  v |= addr[5]; v <<= 8;
883
6.22M
  v |= addr[6]; v <<= 8;
884
6.22M
  v |= addr[7];
885
886
6.22M
  return v;
887
6.22M
}
888
889
uint64_t
890
bfd_getl64 (const void *p)
891
10.5M
{
892
10.5M
  const bfd_byte *addr = (const bfd_byte *) p;
893
10.5M
  uint64_t v;
894
895
10.5M
  v  = addr[7]; v <<= 8;
896
10.5M
  v |= addr[6]; v <<= 8;
897
10.5M
  v |= addr[5]; v <<= 8;
898
10.5M
  v |= addr[4]; v <<= 8;
899
10.5M
  v |= addr[3]; v <<= 8;
900
10.5M
  v |= addr[2]; v <<= 8;
901
10.5M
  v |= addr[1]; v <<= 8;
902
10.5M
  v |= addr[0];
903
904
10.5M
  return v;
905
10.5M
}
906
907
int64_t
908
bfd_getb_signed_64 (const void *p)
909
3.88k
{
910
3.88k
  const bfd_byte *addr = (const bfd_byte *) p;
911
3.88k
  uint64_t v;
912
913
3.88k
  v  = addr[0]; v <<= 8;
914
3.88k
  v |= addr[1]; v <<= 8;
915
3.88k
  v |= addr[2]; v <<= 8;
916
3.88k
  v |= addr[3]; v <<= 8;
917
3.88k
  v |= addr[4]; v <<= 8;
918
3.88k
  v |= addr[5]; v <<= 8;
919
3.88k
  v |= addr[6]; v <<= 8;
920
3.88k
  v |= addr[7];
921
922
3.88k
  return COERCE64 (v);
923
3.88k
}
924
925
int64_t
926
bfd_getl_signed_64 (const void *p)
927
529k
{
928
529k
  const bfd_byte *addr = (const bfd_byte *) p;
929
529k
  uint64_t v;
930
931
529k
  v  = addr[7]; v <<= 8;
932
529k
  v |= addr[6]; v <<= 8;
933
529k
  v |= addr[5]; v <<= 8;
934
529k
  v |= addr[4]; v <<= 8;
935
529k
  v |= addr[3]; v <<= 8;
936
529k
  v |= addr[2]; v <<= 8;
937
529k
  v |= addr[1]; v <<= 8;
938
529k
  v |= addr[0];
939
940
529k
  return COERCE64 (v);
941
529k
}
942
943
void
944
bfd_putb32 (bfd_vma data, void *p)
945
365k
{
946
365k
  bfd_byte *addr = (bfd_byte *) p;
947
365k
  addr[0] = (data >> 24) & 0xff;
948
365k
  addr[1] = (data >> 16) & 0xff;
949
365k
  addr[2] = (data >>  8) & 0xff;
950
365k
  addr[3] = data & 0xff;
951
365k
}
952
953
void
954
bfd_putl32 (bfd_vma data, void *p)
955
41.2k
{
956
41.2k
  bfd_byte *addr = (bfd_byte *) p;
957
41.2k
  addr[0] = data & 0xff;
958
41.2k
  addr[1] = (data >>  8) & 0xff;
959
41.2k
  addr[2] = (data >> 16) & 0xff;
960
41.2k
  addr[3] = (data >> 24) & 0xff;
961
41.2k
}
962
963
void
964
bfd_putb64 (uint64_t data, void *p)
965
275
{
966
275
  bfd_byte *addr = (bfd_byte *) p;
967
275
  addr[0] = (data >> (7*8)) & 0xff;
968
275
  addr[1] = (data >> (6*8)) & 0xff;
969
275
  addr[2] = (data >> (5*8)) & 0xff;
970
275
  addr[3] = (data >> (4*8)) & 0xff;
971
275
  addr[4] = (data >> (3*8)) & 0xff;
972
275
  addr[5] = (data >> (2*8)) & 0xff;
973
275
  addr[6] = (data >> (1*8)) & 0xff;
974
275
  addr[7] = (data >> (0*8)) & 0xff;
975
275
}
976
977
void
978
bfd_putl64 (uint64_t data, void *p)
979
81.8k
{
980
81.8k
  bfd_byte *addr = (bfd_byte *) p;
981
81.8k
  addr[7] = (data >> (7*8)) & 0xff;
982
81.8k
  addr[6] = (data >> (6*8)) & 0xff;
983
81.8k
  addr[5] = (data >> (5*8)) & 0xff;
984
81.8k
  addr[4] = (data >> (4*8)) & 0xff;
985
81.8k
  addr[3] = (data >> (3*8)) & 0xff;
986
81.8k
  addr[2] = (data >> (2*8)) & 0xff;
987
81.8k
  addr[1] = (data >> (1*8)) & 0xff;
988
81.8k
  addr[0] = (data >> (0*8)) & 0xff;
989
81.8k
}
990
991
void
992
bfd_put_bits (uint64_t data, void *p, int bits, bool big_p)
993
0
{
994
0
  bfd_byte *addr = (bfd_byte *) p;
995
0
  int i;
996
0
  int bytes;
997
998
0
  if (bits % 8 != 0)
999
0
    abort ();
1000
1001
0
  bytes = bits / 8;
1002
0
  for (i = 0; i < bytes; i++)
1003
0
    {
1004
0
      int addr_index = big_p ? bytes - i - 1 : i;
1005
1006
0
      addr[addr_index] = data & 0xff;
1007
0
      data >>= 8;
1008
0
    }
1009
0
}
1010
1011
uint64_t
1012
bfd_get_bits (const void *p, int bits, bool big_p)
1013
0
{
1014
0
  const bfd_byte *addr = (const bfd_byte *) p;
1015
0
  uint64_t data;
1016
0
  int i;
1017
0
  int bytes;
1018
1019
0
  if (bits % 8 != 0)
1020
0
    abort ();
1021
1022
0
  data = 0;
1023
0
  bytes = bits / 8;
1024
0
  for (i = 0; i < bytes; i++)
1025
0
    {
1026
0
      int addr_index = big_p ? i : bytes - i - 1;
1027
1028
0
      data = (data << 8) | addr[addr_index];
1029
0
    }
1030
1031
0
  return data;
1032
0
}
1033

1034
/* Default implementation */
1035
1036
bool
1037
_bfd_generic_get_section_contents (bfd *abfd,
1038
           sec_ptr section,
1039
           void *location,
1040
           file_ptr offset,
1041
           bfd_size_type count)
1042
23.8k
{
1043
23.8k
  bfd_size_type sz;
1044
23.8k
  if (count == 0)
1045
0
    return true;
1046
1047
23.8k
  if (section->compress_status != COMPRESS_SECTION_NONE)
1048
0
    {
1049
0
      _bfd_error_handler
1050
  /* xgettext:c-format */
1051
0
  (_("%pB: unable to get decompressed section %pA"),
1052
0
   abfd, section);
1053
0
      bfd_set_error (bfd_error_invalid_operation);
1054
0
      return false;
1055
0
    }
1056
1057
23.8k
  sz = bfd_get_section_limit_octets (abfd, section);
1058
23.8k
  if (offset + count < count
1059
23.8k
      || offset + count > sz
1060
23.8k
      || (abfd->my_archive != NULL
1061
23.8k
    && !bfd_is_thin_archive (abfd->my_archive)
1062
23.8k
    && ((ufile_ptr) section->filepos + offset + count
1063
15.6k
        > arelt_size (abfd))))
1064
1.75k
    {
1065
1.75k
      bfd_set_error (bfd_error_invalid_operation);
1066
1.75k
      return false;
1067
1.75k
    }
1068
1069
22.1k
  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
1070
22.1k
      || bfd_read (location, count, abfd) != count)
1071
1.15k
    return false;
1072
1073
20.9k
  return true;
1074
22.1k
}
1075
1076
bool
1077
_bfd_generic_get_section_contents_in_window
1078
  (bfd *abfd ATTRIBUTE_UNUSED,
1079
   sec_ptr section ATTRIBUTE_UNUSED,
1080
   bfd_window *w ATTRIBUTE_UNUSED,
1081
   file_ptr offset ATTRIBUTE_UNUSED,
1082
   bfd_size_type count ATTRIBUTE_UNUSED)
1083
0
{
1084
#ifdef USE_MMAP
1085
  bfd_size_type sz;
1086
1087
  if (count == 0)
1088
    return true;
1089
  if (abfd->xvec->_bfd_get_section_contents
1090
      != _bfd_generic_get_section_contents)
1091
    {
1092
      /* We don't know what changes the bfd's get_section_contents
1093
   method may have to make.  So punt trying to map the file
1094
   window, and let get_section_contents do its thing.  */
1095
      /* @@ FIXME : If the internal window has a refcount of 1 and was
1096
   allocated with malloc instead of mmap, just reuse it.  */
1097
      bfd_free_window (w);
1098
      w->i = bfd_zmalloc (sizeof (bfd_window_internal));
1099
      if (w->i == NULL)
1100
  return false;
1101
      w->i->data = bfd_malloc (count);
1102
      if (w->i->data == NULL)
1103
  {
1104
    free (w->i);
1105
    w->i = NULL;
1106
    return false;
1107
  }
1108
      w->i->mapped = 0;
1109
      w->i->refcount = 1;
1110
      w->size = w->i->size = count;
1111
      w->data = w->i->data;
1112
      return bfd_get_section_contents (abfd, section, w->data, offset, count);
1113
    }
1114
  if (abfd->direction != write_direction && section->rawsize != 0)
1115
    sz = section->rawsize;
1116
  else
1117
    sz = section->size;
1118
  if (offset + count < count
1119
      || offset + count > sz
1120
      || (abfd->my_archive != NULL
1121
    && !bfd_is_thin_archive (abfd->my_archive)
1122
    && ((ufile_ptr) section->filepos + offset + count
1123
        > arelt_size (abfd)))
1124
      || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
1125
        true))
1126
    return false;
1127
  return true;
1128
#else
1129
0
  abort ();
1130
0
#endif
1131
0
}
1132
1133
/* This generic function can only be used in implementations where creating
1134
   NEW sections is disallowed.  It is useful in patching existing sections
1135
   in read-write files, though.  See other set_section_contents functions
1136
   to see why it doesn't work for new sections.  */
1137
bool
1138
_bfd_generic_set_section_contents (bfd *abfd,
1139
           sec_ptr section,
1140
           const void *location,
1141
           file_ptr offset,
1142
           bfd_size_type count)
1143
0
{
1144
0
  if (count == 0)
1145
0
    return true;
1146
1147
0
  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
1148
0
      || bfd_write (location, count, abfd) != count)
1149
0
    return false;
1150
1151
0
  return true;
1152
0
}
1153
1154
/*
1155
INTERNAL_FUNCTION
1156
  bfd_log2
1157
1158
SYNOPSIS
1159
  unsigned int bfd_log2 (bfd_vma x);
1160
1161
DESCRIPTION
1162
  Return the log base 2 of the value supplied, rounded up.  E.g., an
1163
  @var{x} of 1025 returns 11.  A @var{x} of 0 returns 0.
1164
*/
1165
1166
unsigned int
1167
bfd_log2 (bfd_vma x)
1168
271k
{
1169
271k
  unsigned int result = 0;
1170
1171
271k
  if (x <= 1)
1172
153k
    return result;
1173
118k
  --x;
1174
118k
  do
1175
618k
    ++result;
1176
618k
  while ((x >>= 1) != 0);
1177
118k
  return result;
1178
271k
}
1179
1180
bool
1181
bfd_generic_is_local_label_name (bfd *abfd, const char *name)
1182
0
{
1183
0
  char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
1184
1185
0
  return name[0] == locals_prefix;
1186
0
}
1187
1188
/* Helper function for reading uleb128 encoded data.  */
1189
1190
bfd_vma
1191
_bfd_read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
1192
         bfd_byte *buf,
1193
         unsigned int *bytes_read_ptr)
1194
0
{
1195
0
  bfd_vma result;
1196
0
  unsigned int num_read;
1197
0
  unsigned int shift;
1198
0
  bfd_byte byte;
1199
1200
0
  result = 0;
1201
0
  shift = 0;
1202
0
  num_read = 0;
1203
0
  do
1204
0
    {
1205
0
      byte = bfd_get_8 (abfd, buf);
1206
0
      buf++;
1207
0
      num_read++;
1208
0
      if (shift < 8 * sizeof (result))
1209
0
  {
1210
0
    result |= (((bfd_vma) byte & 0x7f) << shift);
1211
0
    shift += 7;
1212
0
  }
1213
0
    }
1214
0
  while (byte & 0x80);
1215
0
  *bytes_read_ptr = num_read;
1216
0
  return result;
1217
0
}
1218
1219
/* Read in a LEB128 encoded value from ABFD starting at *PTR.
1220
   If SIGN is true, return a signed LEB128 value.
1221
   *PTR is incremented by the number of bytes read.
1222
   No bytes will be read at address END or beyond.  */
1223
1224
bfd_vma
1225
_bfd_safe_read_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
1226
           bfd_byte **ptr,
1227
           bool sign,
1228
           const bfd_byte * const end)
1229
523k
{
1230
523k
  bfd_vma result = 0;
1231
523k
  unsigned int shift = 0;
1232
523k
  bfd_byte byte = 0;
1233
523k
  bfd_byte *data = *ptr;
1234
1235
652k
  while (data < end)
1236
652k
    {
1237
652k
      byte = bfd_get_8 (abfd, data);
1238
652k
      data++;
1239
652k
      if (shift < 8 * sizeof (result))
1240
652k
  {
1241
652k
    result |= ((bfd_vma) (byte & 0x7f)) << shift;
1242
652k
    shift += 7;
1243
652k
  }
1244
652k
      if ((byte & 0x80) == 0)
1245
522k
  break;
1246
652k
    }
1247
1248
523k
  *ptr = data;
1249
1250
523k
  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
1251
72.4k
    result |= -((bfd_vma) 1 << shift);
1252
1253
523k
  return result;
1254
523k
}
1255
1256
/* Helper function for reading sleb128 encoded data.  */
1257
1258
bfd_signed_vma
1259
_bfd_read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
1260
       bfd_byte *buf,
1261
       unsigned int *bytes_read_ptr)
1262
0
{
1263
0
  bfd_vma result;
1264
0
  unsigned int shift;
1265
0
  unsigned int num_read;
1266
0
  bfd_byte byte;
1267
1268
0
  result = 0;
1269
0
  shift = 0;
1270
0
  num_read = 0;
1271
0
  do
1272
0
    {
1273
0
      byte = bfd_get_8 (abfd, buf);
1274
0
      buf ++;
1275
0
      num_read ++;
1276
0
      if (shift < 8 * sizeof (result))
1277
0
  {
1278
0
    result |= (((bfd_vma) byte & 0x7f) << shift);
1279
0
    shift += 7;
1280
0
  }
1281
0
    }
1282
0
  while (byte & 0x80);
1283
0
  if (shift < 8 * sizeof (result) && (byte & 0x40))
1284
0
    result |= (((bfd_vma) -1) << shift);
1285
0
  *bytes_read_ptr = num_read;
1286
0
  return result;
1287
0
}
1288
1289
/* Write VAL in uleb128 format to P.
1290
   END indicates the last byte of allocated space for the uleb128 value to fit
1291
   in.
1292
   Return a pointer to the byte following the last byte that was written, or
1293
   NULL if the uleb128 value does not fit in the allocated space between P and
1294
   END.  */
1295
bfd_byte *
1296
_bfd_write_unsigned_leb128 (bfd_byte *p, bfd_byte *end, bfd_vma val)
1297
0
{
1298
0
  bfd_byte c;
1299
0
  do
1300
0
    {
1301
0
      if (p > end)
1302
0
  return NULL;
1303
0
      c = val & 0x7f;
1304
0
      val >>= 7;
1305
0
      if (val)
1306
0
  c |= 0x80;
1307
0
      *(p++) = c;
1308
0
    }
1309
0
  while (val);
1310
0
  return p;
1311
0
}
1312
1313
bool
1314
_bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
1315
          asection *isec ATTRIBUTE_UNUSED,
1316
          bfd *obfd ATTRIBUTE_UNUSED,
1317
          asection *osec ATTRIBUTE_UNUSED,
1318
          struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1319
0
{
1320
0
  return true;
1321
0
}