00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "bfd.h"
00028 #include "sysdep.h"
00029 #include "libbfd.h"
00030
00031 #ifndef HAVE_GETPAGESIZE
00032 #define getpagesize() 2048
00033 #endif
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 bfd_boolean
00049 bfd_false (bfd *ignore ATTRIBUTE_UNUSED)
00050 {
00051 bfd_set_error (bfd_error_invalid_operation);
00052 return FALSE;
00053 }
00054
00055
00056
00057
00058 bfd_boolean
00059 bfd_true (bfd *ignore ATTRIBUTE_UNUSED)
00060 {
00061 return TRUE;
00062 }
00063
00064
00065
00066
00067 void *
00068 bfd_nullvoidptr (bfd *ignore ATTRIBUTE_UNUSED)
00069 {
00070 bfd_set_error (bfd_error_invalid_operation);
00071 return NULL;
00072 }
00073
00074 int
00075 bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
00076 {
00077 return 0;
00078 }
00079
00080 unsigned int
00081 bfd_0u (bfd *ignore ATTRIBUTE_UNUSED)
00082 {
00083 return 0;
00084 }
00085
00086 long
00087 bfd_0l (bfd *ignore ATTRIBUTE_UNUSED)
00088 {
00089 return 0;
00090 }
00091
00092
00093
00094
00095 long
00096 _bfd_n1 (bfd *ignore_abfd ATTRIBUTE_UNUSED)
00097 {
00098 bfd_set_error (bfd_error_invalid_operation);
00099 return -1;
00100 }
00101
00102 void
00103 bfd_void (bfd *ignore ATTRIBUTE_UNUSED)
00104 {
00105 }
00106
00107 bfd_boolean
00108 _bfd_nocore_core_file_matches_executable_p
00109 (bfd *ignore_core_bfd ATTRIBUTE_UNUSED,
00110 bfd *ignore_exec_bfd ATTRIBUTE_UNUSED)
00111 {
00112 bfd_set_error (bfd_error_invalid_operation);
00113 return FALSE;
00114 }
00115
00116
00117
00118
00119 char *
00120 _bfd_nocore_core_file_failing_command (bfd *ignore_abfd ATTRIBUTE_UNUSED)
00121 {
00122 bfd_set_error (bfd_error_invalid_operation);
00123 return NULL;
00124 }
00125
00126
00127
00128
00129 int
00130 _bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED)
00131 {
00132 bfd_set_error (bfd_error_invalid_operation);
00133 return 0;
00134 }
00135
00136 const bfd_target *
00137 _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED)
00138 {
00139 bfd_set_error (bfd_error_wrong_format);
00140 return 0;
00141 }
00142
00143
00144
00145 void *
00146 bfd_malloc (bfd_size_type size)
00147 {
00148 void *ptr;
00149
00150 if (size != (size_t) size)
00151 {
00152 bfd_set_error (bfd_error_no_memory);
00153 return NULL;
00154 }
00155
00156 ptr = malloc ((size_t) size);
00157 if (ptr == NULL && (size_t) size != 0)
00158 bfd_set_error (bfd_error_no_memory);
00159
00160 return ptr;
00161 }
00162
00163
00164
00165 void *
00166 bfd_realloc (void *ptr, bfd_size_type size)
00167 {
00168 void *ret;
00169
00170 if (size != (size_t) size)
00171 {
00172 bfd_set_error (bfd_error_no_memory);
00173 return NULL;
00174 }
00175
00176 if (ptr == NULL)
00177 ret = malloc ((size_t) size);
00178 else
00179 ret = realloc (ptr, (size_t) size);
00180
00181 if (ret == NULL && (size_t) size != 0)
00182 bfd_set_error (bfd_error_no_memory);
00183
00184 return ret;
00185 }
00186
00187
00188
00189 void *
00190 bfd_zmalloc (bfd_size_type size)
00191 {
00192 void *ptr;
00193
00194 if (size != (size_t) size)
00195 {
00196 bfd_set_error (bfd_error_no_memory);
00197 return NULL;
00198 }
00199
00200 ptr = malloc ((size_t) size);
00201
00202 if ((size_t) size != 0)
00203 {
00204 if (ptr == NULL)
00205 bfd_set_error (bfd_error_no_memory);
00206 else
00207 memset (ptr, 0, (size_t) size);
00208 }
00209
00210 return ptr;
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 bfd_boolean
00226 bfd_write_bigendian_4byte_int (bfd *abfd, unsigned int i)
00227 {
00228 bfd_byte buffer[4];
00229 bfd_putb32 ((bfd_vma) i, buffer);
00230 return bfd_bwrite (buffer, (bfd_size_type) 4, abfd) == 4;
00231 }
00232
00233
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396 #define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000)
00397 #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
00398 #define EIGHT_GAZILLION ((bfd_int64_t) 1 << 63)
00399 #define COERCE64(x) \
00400 (((bfd_int64_t) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION)
00401
00402 bfd_vma
00403 bfd_getb16 (const void *p)
00404 {
00405 const bfd_byte *addr = p;
00406 return (addr[0] << 8) | addr[1];
00407 }
00408
00409 bfd_vma
00410 bfd_getl16 (const void *p)
00411 {
00412 const bfd_byte *addr = p;
00413 return (addr[1] << 8) | addr[0];
00414 }
00415
00416 bfd_signed_vma
00417 bfd_getb_signed_16 (const void *p)
00418 {
00419 const bfd_byte *addr = p;
00420 return COERCE16 ((addr[0] << 8) | addr[1]);
00421 }
00422
00423 bfd_signed_vma
00424 bfd_getl_signed_16 (const void *p)
00425 {
00426 const bfd_byte *addr = p;
00427 return COERCE16 ((addr[1] << 8) | addr[0]);
00428 }
00429
00430 void
00431 bfd_putb16 (bfd_vma data, void *p)
00432 {
00433 bfd_byte *addr = p;
00434 addr[0] = (data >> 8) & 0xff;
00435 addr[1] = data & 0xff;
00436 }
00437
00438 void
00439 bfd_putl16 (bfd_vma data, void *p)
00440 {
00441 bfd_byte *addr = p;
00442 addr[0] = data & 0xff;
00443 addr[1] = (data >> 8) & 0xff;
00444 }
00445
00446 bfd_vma
00447 bfd_getb32 (const void *p)
00448 {
00449 const bfd_byte *addr = p;
00450 unsigned long v;
00451
00452 v = (unsigned long) addr[0] << 24;
00453 v |= (unsigned long) addr[1] << 16;
00454 v |= (unsigned long) addr[2] << 8;
00455 v |= (unsigned long) addr[3];
00456 return v;
00457 }
00458
00459 bfd_vma
00460 bfd_getl32 (const void *p)
00461 {
00462 const bfd_byte *addr = p;
00463 unsigned long v;
00464
00465 v = (unsigned long) addr[0];
00466 v |= (unsigned long) addr[1] << 8;
00467 v |= (unsigned long) addr[2] << 16;
00468 v |= (unsigned long) addr[3] << 24;
00469 return v;
00470 }
00471
00472 bfd_signed_vma
00473 bfd_getb_signed_32 (const void *p)
00474 {
00475 const bfd_byte *addr = p;
00476 unsigned long v;
00477
00478 v = (unsigned long) addr[0] << 24;
00479 v |= (unsigned long) addr[1] << 16;
00480 v |= (unsigned long) addr[2] << 8;
00481 v |= (unsigned long) addr[3];
00482 return COERCE32 (v);
00483 }
00484
00485 bfd_signed_vma
00486 bfd_getl_signed_32 (const void *p)
00487 {
00488 const bfd_byte *addr = p;
00489 unsigned long v;
00490
00491 v = (unsigned long) addr[0];
00492 v |= (unsigned long) addr[1] << 8;
00493 v |= (unsigned long) addr[2] << 16;
00494 v |= (unsigned long) addr[3] << 24;
00495 return COERCE32 (v);
00496 }
00497
00498 bfd_uint64_t
00499 bfd_getb64 (const void *p ATTRIBUTE_UNUSED)
00500 {
00501 #ifdef BFD_HOST_64_BIT
00502 const bfd_byte *addr = p;
00503 bfd_uint64_t v;
00504
00505 v = addr[0]; v <<= 8;
00506 v |= addr[1]; v <<= 8;
00507 v |= addr[2]; v <<= 8;
00508 v |= addr[3]; v <<= 8;
00509 v |= addr[4]; v <<= 8;
00510 v |= addr[5]; v <<= 8;
00511 v |= addr[6]; v <<= 8;
00512 v |= addr[7];
00513
00514 return v;
00515 #else
00516 BFD_FAIL();
00517 return 0;
00518 #endif
00519 }
00520
00521 bfd_uint64_t
00522 bfd_getl64 (const void *p ATTRIBUTE_UNUSED)
00523 {
00524 #ifdef BFD_HOST_64_BIT
00525 const bfd_byte *addr = p;
00526 bfd_uint64_t v;
00527
00528 v = addr[7]; v <<= 8;
00529 v |= addr[6]; v <<= 8;
00530 v |= addr[5]; v <<= 8;
00531 v |= addr[4]; v <<= 8;
00532 v |= addr[3]; v <<= 8;
00533 v |= addr[2]; v <<= 8;
00534 v |= addr[1]; v <<= 8;
00535 v |= addr[0];
00536
00537 return v;
00538 #else
00539 BFD_FAIL();
00540 return 0;
00541 #endif
00542
00543 }
00544
00545 bfd_int64_t
00546 bfd_getb_signed_64 (const void *p ATTRIBUTE_UNUSED)
00547 {
00548 #ifdef BFD_HOST_64_BIT
00549 const bfd_byte *addr = p;
00550 bfd_uint64_t v;
00551
00552 v = addr[0]; v <<= 8;
00553 v |= addr[1]; v <<= 8;
00554 v |= addr[2]; v <<= 8;
00555 v |= addr[3]; v <<= 8;
00556 v |= addr[4]; v <<= 8;
00557 v |= addr[5]; v <<= 8;
00558 v |= addr[6]; v <<= 8;
00559 v |= addr[7];
00560
00561 return COERCE64 (v);
00562 #else
00563 BFD_FAIL();
00564 return 0;
00565 #endif
00566 }
00567
00568 bfd_int64_t
00569 bfd_getl_signed_64 (const void *p ATTRIBUTE_UNUSED)
00570 {
00571 #ifdef BFD_HOST_64_BIT
00572 const bfd_byte *addr = p;
00573 bfd_uint64_t v;
00574
00575 v = addr[7]; v <<= 8;
00576 v |= addr[6]; v <<= 8;
00577 v |= addr[5]; v <<= 8;
00578 v |= addr[4]; v <<= 8;
00579 v |= addr[3]; v <<= 8;
00580 v |= addr[2]; v <<= 8;
00581 v |= addr[1]; v <<= 8;
00582 v |= addr[0];
00583
00584 return COERCE64 (v);
00585 #else
00586 BFD_FAIL();
00587 return 0;
00588 #endif
00589 }
00590
00591 void
00592 bfd_putb32 (bfd_vma data, void *p)
00593 {
00594 bfd_byte *addr = p;
00595 addr[0] = (data >> 24) & 0xff;
00596 addr[1] = (data >> 16) & 0xff;
00597 addr[2] = (data >> 8) & 0xff;
00598 addr[3] = data & 0xff;
00599 }
00600
00601 void
00602 bfd_putl32 (bfd_vma data, void *p)
00603 {
00604 bfd_byte *addr = p;
00605 addr[0] = data & 0xff;
00606 addr[1] = (data >> 8) & 0xff;
00607 addr[2] = (data >> 16) & 0xff;
00608 addr[3] = (data >> 24) & 0xff;
00609 }
00610
00611 void
00612 bfd_putb64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
00613 {
00614 #ifdef BFD_HOST_64_BIT
00615 bfd_byte *addr = p;
00616 addr[0] = (data >> (7*8)) & 0xff;
00617 addr[1] = (data >> (6*8)) & 0xff;
00618 addr[2] = (data >> (5*8)) & 0xff;
00619 addr[3] = (data >> (4*8)) & 0xff;
00620 addr[4] = (data >> (3*8)) & 0xff;
00621 addr[5] = (data >> (2*8)) & 0xff;
00622 addr[6] = (data >> (1*8)) & 0xff;
00623 addr[7] = (data >> (0*8)) & 0xff;
00624 #else
00625 BFD_FAIL();
00626 #endif
00627 }
00628
00629 void
00630 bfd_putl64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
00631 {
00632 #ifdef BFD_HOST_64_BIT
00633 bfd_byte *addr = p;
00634 addr[7] = (data >> (7*8)) & 0xff;
00635 addr[6] = (data >> (6*8)) & 0xff;
00636 addr[5] = (data >> (5*8)) & 0xff;
00637 addr[4] = (data >> (4*8)) & 0xff;
00638 addr[3] = (data >> (3*8)) & 0xff;
00639 addr[2] = (data >> (2*8)) & 0xff;
00640 addr[1] = (data >> (1*8)) & 0xff;
00641 addr[0] = (data >> (0*8)) & 0xff;
00642 #else
00643 BFD_FAIL();
00644 #endif
00645 }
00646
00647 void
00648 bfd_put_bits (bfd_uint64_t data, void *p, int bits, bfd_boolean big_p)
00649 {
00650 bfd_byte *addr = p;
00651 int i;
00652 int bytes;
00653
00654 if (bits % 8 != 0)
00655 abort ();
00656
00657 bytes = bits / 8;
00658 for (i = 0; i < bytes; i++)
00659 {
00660 int index = big_p ? bytes - i - 1 : i;
00661
00662 addr[index] = data & 0xff;
00663 data >>= 8;
00664 }
00665 }
00666
00667 bfd_uint64_t
00668 bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
00669 {
00670 const bfd_byte *addr = p;
00671 bfd_uint64_t data;
00672 int i;
00673 int bytes;
00674
00675 if (bits % 8 != 0)
00676 abort ();
00677
00678 data = 0;
00679 bytes = bits / 8;
00680 for (i = 0; i < bytes; i++)
00681 {
00682 int index = big_p ? i : bytes - i - 1;
00683
00684 data = (data << 8) | addr[index];
00685 }
00686
00687 return data;
00688 }
00689
00690
00691
00692 bfd_boolean
00693 _bfd_generic_get_section_contents (bfd *abfd,
00694 sec_ptr section,
00695 void *location,
00696 file_ptr offset,
00697 bfd_size_type count)
00698 {
00699 bfd_size_type sz;
00700 if (count == 0)
00701 return TRUE;
00702
00703 sz = section->rawsize ? section->rawsize : section->size;
00704 if (offset + count > sz)
00705 {
00706 bfd_set_error (bfd_error_invalid_operation);
00707 return FALSE;
00708 }
00709
00710 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
00711 || bfd_bread (location, count, abfd) != count)
00712 return FALSE;
00713
00714 return TRUE;
00715 }
00716
00717 bfd_boolean
00718 _bfd_generic_get_section_contents_in_window
00719 (bfd *abfd ATTRIBUTE_UNUSED,
00720 sec_ptr section ATTRIBUTE_UNUSED,
00721 bfd_window *w ATTRIBUTE_UNUSED,
00722 file_ptr offset ATTRIBUTE_UNUSED,
00723 bfd_size_type count ATTRIBUTE_UNUSED)
00724 {
00725 #ifdef USE_MMAP
00726 bfd_size_type sz;
00727
00728 if (count == 0)
00729 return TRUE;
00730 if (abfd->xvec->_bfd_get_section_contents
00731 != _bfd_generic_get_section_contents)
00732 {
00733
00734
00735
00736
00737
00738 bfd_free_window (w);
00739 w->i = bfd_zmalloc (sizeof (bfd_window_internal));
00740 if (w->i == NULL)
00741 return FALSE;
00742 w->i->data = bfd_malloc (count);
00743 if (w->i->data == NULL)
00744 {
00745 free (w->i);
00746 w->i = NULL;
00747 return FALSE;
00748 }
00749 w->i->mapped = 0;
00750 w->i->refcount = 1;
00751 w->size = w->i->size = count;
00752 w->data = w->i->data;
00753 return bfd_get_section_contents (abfd, section, w->data, offset, count);
00754 }
00755 sz = section->rawsize ? section->rawsize : section->size;
00756 if (offset + count > sz
00757 || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
00758 TRUE))
00759 return FALSE;
00760 return TRUE;
00761 #else
00762 abort ();
00763 #endif
00764 }
00765
00766
00767
00768
00769
00770 bfd_boolean
00771 _bfd_generic_set_section_contents (bfd *abfd,
00772 sec_ptr section,
00773 const void *location,
00774 file_ptr offset,
00775 bfd_size_type count)
00776 {
00777 if (count == 0)
00778 return TRUE;
00779
00780 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
00781 || bfd_bwrite (location, count, abfd) != count)
00782 return FALSE;
00783
00784 return TRUE;
00785 }
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799 unsigned int
00800 bfd_log2 (bfd_vma x)
00801 {
00802 unsigned int result = 0;
00803
00804 while ((x = (x >> 1)) != 0)
00805 ++result;
00806 return result;
00807 }
00808
00809 bfd_boolean
00810 bfd_generic_is_local_label_name (bfd *abfd, const char *name)
00811 {
00812 char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
00813
00814 return name[0] == locals_prefix;
00815 }
00816
00817
00818
00819
00820 bfd_boolean
00821 _bfd_generic_verify_endian_match (bfd *ibfd, bfd *obfd)
00822 {
00823 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
00824 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
00825 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
00826 {
00827 const char *msg;
00828
00829 if (bfd_big_endian (ibfd))
00830 msg = _("%B: compiled for a big endian system and target is little endian");
00831 else
00832 msg = _("%B: compiled for a little endian system and target is big endian");
00833
00834 (*_bfd_error_handler) (msg, ibfd);
00835
00836 bfd_set_error (bfd_error_wrong_format);
00837 return FALSE;
00838 }
00839
00840 return TRUE;
00841 }
00842
00843
00844
00845
00846 void
00847 warn_deprecated (const char *what,
00848 const char *file,
00849 int line,
00850 const char *func)
00851 {
00852
00853 static size_t mask = 0;
00854
00855 if (~(size_t) func & ~mask)
00856 {
00857
00858
00859 if (func)
00860 fprintf (stderr, _("Deprecated %s called at %s line %d in %s\n"),
00861 what, file, line, func);
00862 else
00863 fprintf (stderr, _("Deprecated %s called\n"), what);
00864 mask |= ~(size_t) func;
00865 }
00866 }
00867
00868
00869
00870 bfd_vma
00871 read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
00872 bfd_byte *buf,
00873 unsigned int *bytes_read_ptr)
00874 {
00875 bfd_vma result;
00876 unsigned int num_read;
00877 unsigned int shift;
00878 unsigned char byte;
00879
00880 result = 0;
00881 shift = 0;
00882 num_read = 0;
00883 do
00884 {
00885 byte = bfd_get_8 (abfd, buf);
00886 buf++;
00887 num_read++;
00888 result |= (((bfd_vma) byte & 0x7f) << shift);
00889 shift += 7;
00890 }
00891 while (byte & 0x80);
00892 *bytes_read_ptr = num_read;
00893 return result;
00894 }
00895
00896
00897
00898 bfd_signed_vma
00899 read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
00900 bfd_byte *buf,
00901 unsigned int *bytes_read_ptr)
00902 {
00903 bfd_vma result;
00904 unsigned int shift;
00905 unsigned int num_read;
00906 unsigned char byte;
00907
00908 result = 0;
00909 shift = 0;
00910 num_read = 0;
00911 do
00912 {
00913 byte = bfd_get_8 (abfd, buf);
00914 buf ++;
00915 num_read ++;
00916 result |= (((bfd_vma) byte & 0x7f) << shift);
00917 shift += 7;
00918 }
00919 while (byte & 0x80);
00920 if (shift < 8 * sizeof (result) && (byte & 0x40))
00921 result |= (((bfd_vma) -1) << shift);
00922 *bytes_read_ptr = num_read;
00923 return result;
00924 }