Coverage Report

Created: 2023-06-29 07:13

/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
0
{
63
0
  bfd_set_error (bfd_error_invalid_operation);
64
0
  return false;
65
0
}
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
3.85k
{
80
3.85k
  return true;
81
3.85k
}
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
3.21k
{
135
3.21k
  bfd_set_error (bfd_error_invalid_operation);
136
3.21k
  return NULL;
137
3.21k
}
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
0
{
163
0
  bfd_set_error (bfd_error_invalid_operation);
164
0
  return -1;
165
0
}
166
167
void
168
_bfd_void_bfd (bfd *ignore ATTRIBUTE_UNUSED)
169
1.59M
{
170
1.59M
}
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
2.51M
{
252
2.51M
  bfd_set_error (bfd_error_wrong_format);
253
2.51M
  return 0;
254
2.51M
}
255

256
/* Allocate memory using malloc.  */
257
258
#ifndef SSIZE_MAX
259
4.92M
#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
4.88M
{
279
4.88M
  void *ptr;
280
4.88M
  size_t sz = (size_t) size;
281
282
4.88M
  if (size != sz
283
      /* This is to pacify memory checkers like valgrind.  */
284
4.88M
      || sz > SSIZE_MAX)
285
0
    {
286
0
      bfd_set_error (bfd_error_no_memory);
287
0
      return NULL;
288
0
    }
289
290
4.88M
  ptr = malloc (sz ? sz : 1);
291
4.88M
  if (ptr == NULL)
292
0
    bfd_set_error (bfd_error_no_memory);
293
294
4.88M
  return ptr;
295
4.88M
}
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
41.8k
{
323
41.8k
  void *ret;
324
41.8k
  size_t sz = (size_t) size;
325
326
41.8k
  if (ptr == NULL)
327
3.97k
    return bfd_malloc (size);
328
329
37.8k
  if (size != sz
330
      /* This is to pacify memory checkers like valgrind.  */
331
37.8k
      || 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
37.8k
  ret = realloc (ptr, sz ? sz : 1);
340
341
37.8k
  if (ret == NULL)
342
0
    bfd_set_error (bfd_error_no_memory);
343
344
37.8k
  return ret;
345
37.8k
}
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
40.2k
{
375
40.2k
  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
40.2k
  if (size == 0)
380
0
    {
381
0
      free (ptr);
382
0
      return NULL;
383
0
    }
384
      
385
40.2k
  ret = bfd_realloc (ptr, size);
386
40.2k
  if (ret == NULL)
387
0
    free (ptr);
388
389
40.2k
  return ret;
390
40.2k
}
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
618k
{
412
618k
  void *ptr = bfd_malloc (size);
413
414
618k
  if (ptr != NULL)
415
618k
    memset (ptr, 0, size ? (size_t) size : 1);
416
417
618k
  return ptr;
418
618k
}
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
474M
{
435
474M
  void *ret;
436
474M
  unsigned long ul_size = (unsigned long) size;
437
438
474M
  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
474M
      || ((signed long) ul_size) < 0)
447
0
    {
448
0
      bfd_set_error (bfd_error_no_memory);
449
0
      return NULL;
450
0
    }
451
452
474M
  ret = objalloc_alloc ((struct objalloc *) abfd->memory, ul_size);
453
474M
  if (ret == NULL)
454
0
    bfd_set_error (bfd_error_no_memory);
455
474M
  else
456
474M
    abfd->alloc_size += size;
457
474M
  return ret;
458
474M
}
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
196M
{
475
196M
  void *res;
476
477
196M
  res = bfd_alloc (abfd, size);
478
196M
  if (res)
479
196M
    memset (res, 0, (size_t) size);
480
196M
  return res;
481
196M
}
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
179M
{
498
179M
  objalloc_free_block ((struct objalloc *) abfd->memory, block);
499
179M
}
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 ((bfd_vma) i, buffer);
519
0
  return bfd_bwrite (buffer, (bfd_size_type) 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
0
#define COERCE16(x) (((bfd_vma) (x) ^ 0x8000) - 0x8000)
700
949k
#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
701
#define COERCE64(x) \
702
9.87M
  (((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
112M
{
736
112M
  const bfd_byte *addr = (const bfd_byte *) p;
737
112M
  return (addr[0] << 8) | addr[1];
738
112M
}
739
740
bfd_vma
741
bfd_getl16 (const void *p)
742
250M
{
743
250M
  const bfd_byte *addr = (const bfd_byte *) p;
744
250M
  return (addr[1] << 8) | addr[0];
745
250M
}
746
747
bfd_signed_vma
748
bfd_getb_signed_16 (const void *p)
749
0
{
750
0
  const bfd_byte *addr = (const bfd_byte *) p;
751
0
  return COERCE16 ((addr[0] << 8) | addr[1]);
752
0
}
753
754
bfd_signed_vma
755
bfd_getl_signed_16 (const void *p)
756
0
{
757
0
  const bfd_byte *addr = (const bfd_byte *) p;
758
0
  return COERCE16 ((addr[1] << 8) | addr[0]);
759
0
}
760
761
void
762
bfd_putb16 (bfd_vma data, void *p)
763
0
{
764
0
  bfd_byte *addr = (bfd_byte *) p;
765
0
  addr[0] = (data >> 8) & 0xff;
766
0
  addr[1] = data & 0xff;
767
0
}
768
769
void
770
bfd_putl16 (bfd_vma data, void *p)
771
47.4k
{
772
47.4k
  bfd_byte *addr = (bfd_byte *) p;
773
47.4k
  addr[0] = data & 0xff;
774
47.4k
  addr[1] = (data >> 8) & 0xff;
775
47.4k
}
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
315M
{
822
315M
  const bfd_byte *addr = (const bfd_byte *) p;
823
315M
  uint32_t v;
824
825
315M
  v = (uint32_t) addr[0] << 24;
826
315M
  v |= (uint32_t) addr[1] << 16;
827
315M
  v |= (uint32_t) addr[2] << 8;
828
315M
  v |= (uint32_t) addr[3];
829
315M
  return v;
830
315M
}
831
832
bfd_vma
833
bfd_getl32 (const void *p)
834
585M
{
835
585M
  const bfd_byte *addr = (const bfd_byte *) p;
836
585M
  uint32_t v;
837
838
585M
  v = (uint32_t) addr[0];
839
585M
  v |= (uint32_t) addr[1] << 8;
840
585M
  v |= (uint32_t) addr[2] << 16;
841
585M
  v |= (uint32_t) addr[3] << 24;
842
585M
  return v;
843
585M
}
844
845
bfd_signed_vma
846
bfd_getb_signed_32 (const void *p)
847
132k
{
848
132k
  const bfd_byte *addr = (const bfd_byte *) p;
849
132k
  uint32_t v;
850
851
132k
  v = (uint32_t) addr[0] << 24;
852
132k
  v |= (uint32_t) addr[1] << 16;
853
132k
  v |= (uint32_t) addr[2] << 8;
854
132k
  v |= (uint32_t) addr[3];
855
132k
  return COERCE32 (v);
856
132k
}
857
858
bfd_signed_vma
859
bfd_getl_signed_32 (const void *p)
860
816k
{
861
816k
  const bfd_byte *addr = (const bfd_byte *) p;
862
816k
  uint32_t v;
863
864
816k
  v = (uint32_t) addr[0];
865
816k
  v |= (uint32_t) addr[1] << 8;
866
816k
  v |= (uint32_t) addr[2] << 16;
867
816k
  v |= (uint32_t) addr[3] << 24;
868
816k
  return COERCE32 (v);
869
816k
}
870
871
uint64_t
872
bfd_getb64 (const void *p)
873
25.5M
{
874
25.5M
  const bfd_byte *addr = (const bfd_byte *) p;
875
25.5M
  uint64_t v;
876
877
25.5M
  v  = addr[0]; v <<= 8;
878
25.5M
  v |= addr[1]; v <<= 8;
879
25.5M
  v |= addr[2]; v <<= 8;
880
25.5M
  v |= addr[3]; v <<= 8;
881
25.5M
  v |= addr[4]; v <<= 8;
882
25.5M
  v |= addr[5]; v <<= 8;
883
25.5M
  v |= addr[6]; v <<= 8;
884
25.5M
  v |= addr[7];
885
886
25.5M
  return v;
887
25.5M
}
888
889
uint64_t
890
bfd_getl64 (const void *p)
891
40.6M
{
892
40.6M
  const bfd_byte *addr = (const bfd_byte *) p;
893
40.6M
  uint64_t v;
894
895
40.6M
  v  = addr[7]; v <<= 8;
896
40.6M
  v |= addr[6]; v <<= 8;
897
40.6M
  v |= addr[5]; v <<= 8;
898
40.6M
  v |= addr[4]; v <<= 8;
899
40.6M
  v |= addr[3]; v <<= 8;
900
40.6M
  v |= addr[2]; v <<= 8;
901
40.6M
  v |= addr[1]; v <<= 8;
902
40.6M
  v |= addr[0];
903
904
40.6M
  return v;
905
40.6M
}
906
907
int64_t
908
bfd_getb_signed_64 (const void *p)
909
30.4k
{
910
30.4k
  const bfd_byte *addr = (const bfd_byte *) p;
911
30.4k
  uint64_t v;
912
913
30.4k
  v  = addr[0]; v <<= 8;
914
30.4k
  v |= addr[1]; v <<= 8;
915
30.4k
  v |= addr[2]; v <<= 8;
916
30.4k
  v |= addr[3]; v <<= 8;
917
30.4k
  v |= addr[4]; v <<= 8;
918
30.4k
  v |= addr[5]; v <<= 8;
919
30.4k
  v |= addr[6]; v <<= 8;
920
30.4k
  v |= addr[7];
921
922
30.4k
  return COERCE64 (v);
923
30.4k
}
924
925
int64_t
926
bfd_getl_signed_64 (const void *p)
927
9.84M
{
928
9.84M
  const bfd_byte *addr = (const bfd_byte *) p;
929
9.84M
  uint64_t v;
930
931
9.84M
  v  = addr[7]; v <<= 8;
932
9.84M
  v |= addr[6]; v <<= 8;
933
9.84M
  v |= addr[5]; v <<= 8;
934
9.84M
  v |= addr[4]; v <<= 8;
935
9.84M
  v |= addr[3]; v <<= 8;
936
9.84M
  v |= addr[2]; v <<= 8;
937
9.84M
  v |= addr[1]; v <<= 8;
938
9.84M
  v |= addr[0];
939
940
9.84M
  return COERCE64 (v);
941
9.84M
}
942
943
void
944
bfd_putb32 (bfd_vma data, void *p)
945
0
{
946
0
  bfd_byte *addr = (bfd_byte *) p;
947
0
  addr[0] = (data >> 24) & 0xff;
948
0
  addr[1] = (data >> 16) & 0xff;
949
0
  addr[2] = (data >>  8) & 0xff;
950
0
  addr[3] = data & 0xff;
951
0
}
952
953
void
954
bfd_putl32 (bfd_vma data, void *p)
955
47.7k
{
956
47.7k
  bfd_byte *addr = (bfd_byte *) p;
957
47.7k
  addr[0] = data & 0xff;
958
47.7k
  addr[1] = (data >>  8) & 0xff;
959
47.7k
  addr[2] = (data >> 16) & 0xff;
960
47.7k
  addr[3] = (data >> 24) & 0xff;
961
47.7k
}
962
963
void
964
bfd_putb64 (uint64_t data, void *p)
965
0
{
966
0
  bfd_byte *addr = (bfd_byte *) p;
967
0
  addr[0] = (data >> (7*8)) & 0xff;
968
0
  addr[1] = (data >> (6*8)) & 0xff;
969
0
  addr[2] = (data >> (5*8)) & 0xff;
970
0
  addr[3] = (data >> (4*8)) & 0xff;
971
0
  addr[4] = (data >> (3*8)) & 0xff;
972
0
  addr[5] = (data >> (2*8)) & 0xff;
973
0
  addr[6] = (data >> (1*8)) & 0xff;
974
0
  addr[7] = (data >> (0*8)) & 0xff;
975
0
}
976
977
void
978
bfd_putl64 (uint64_t data, void *p)
979
1.24k
{
980
1.24k
  bfd_byte *addr = (bfd_byte *) p;
981
1.24k
  addr[7] = (data >> (7*8)) & 0xff;
982
1.24k
  addr[6] = (data >> (6*8)) & 0xff;
983
1.24k
  addr[5] = (data >> (5*8)) & 0xff;
984
1.24k
  addr[4] = (data >> (4*8)) & 0xff;
985
1.24k
  addr[3] = (data >> (3*8)) & 0xff;
986
1.24k
  addr[2] = (data >> (2*8)) & 0xff;
987
1.24k
  addr[1] = (data >> (1*8)) & 0xff;
988
1.24k
  addr[0] = (data >> (0*8)) & 0xff;
989
1.24k
}
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
71.9k
{
1043
71.9k
  bfd_size_type sz;
1044
71.9k
  if (count == 0)
1045
0
    return true;
1046
1047
71.9k
  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
71.9k
  sz = bfd_get_section_limit_octets (abfd, section);
1058
71.9k
  if (offset + count < count
1059
71.9k
      || offset + count > sz
1060
71.9k
      || (abfd->my_archive != NULL
1061
71.9k
    && !bfd_is_thin_archive (abfd->my_archive)
1062
71.9k
    && ((ufile_ptr) section->filepos + offset + count
1063
71.9k
        > arelt_size (abfd))))
1064
7.14k
    {
1065
7.14k
      bfd_set_error (bfd_error_invalid_operation);
1066
7.14k
      return false;
1067
7.14k
    }
1068
1069
64.7k
  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
1070
64.7k
      || bfd_bread (location, count, abfd) != count)
1071
4.28k
    return false;
1072
1073
60.5k
  return true;
1074
64.7k
}
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_bwrite (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
309k
{
1169
309k
  unsigned int result = 0;
1170
1171
309k
  if (x <= 1)
1172
121k
    return result;
1173
188k
  --x;
1174
188k
  do
1175
3.69M
    ++result;
1176
3.69M
  while ((x >>= 1) != 0);
1177
188k
  return result;
1178
309k
}
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
539k
{
1230
539k
  bfd_vma result = 0;
1231
539k
  unsigned int shift = 0;
1232
539k
  bfd_byte byte = 0;
1233
539k
  bfd_byte *data = *ptr;
1234
1235
907k
  while (data < end)
1236
903k
    {
1237
903k
      byte = bfd_get_8 (abfd, data);
1238
903k
      data++;
1239
903k
      if (shift < 8 * sizeof (result))
1240
776k
  {
1241
776k
    result |= ((bfd_vma) (byte & 0x7f)) << shift;
1242
776k
    shift += 7;
1243
776k
  }
1244
903k
      if ((byte & 0x80) == 0)
1245
535k
  break;
1246
903k
    }
1247
1248
539k
  *ptr = data;
1249
1250
539k
  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
1251
0
    result |= -((bfd_vma) 1 << shift);
1252
1253
539k
  return result;
1254
539k
}
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
}