| 1 | @section Internal functions | 
|---|
| 2 |  | 
|---|
| 3 |  | 
|---|
| 4 | @strong{Description}@* | 
|---|
| 5 | These routines are used within BFD. | 
|---|
| 6 | They are not intended for export, but are documented here for | 
|---|
| 7 | completeness. | 
|---|
| 8 |  | 
|---|
| 9 | @findex bfd_write_bigendian_4byte_int | 
|---|
| 10 | @subsubsection @code{bfd_write_bigendian_4byte_int} | 
|---|
| 11 | @strong{Synopsis} | 
|---|
| 12 | @example | 
|---|
| 13 | bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int); | 
|---|
| 14 | @end example | 
|---|
| 15 | @strong{Description}@* | 
|---|
| 16 | Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big | 
|---|
| 17 | endian order regardless of what else is going on.  This is useful in | 
|---|
| 18 | archives. | 
|---|
| 19 |  | 
|---|
| 20 | @findex bfd_put_size | 
|---|
| 21 | @subsubsection @code{bfd_put_size} | 
|---|
| 22 | @findex bfd_get_size | 
|---|
| 23 | @subsubsection @code{bfd_get_size} | 
|---|
| 24 | @strong{Description}@* | 
|---|
| 25 | These macros as used for reading and writing raw data in | 
|---|
| 26 | sections; each access (except for bytes) is vectored through | 
|---|
| 27 | the target format of the BFD and mangled accordingly. The | 
|---|
| 28 | mangling performs any necessary endian translations and | 
|---|
| 29 | removes alignment restrictions.  Note that types accepted and | 
|---|
| 30 | returned by these macros are identical so they can be swapped | 
|---|
| 31 | around in macros---for example, @file{libaout.h} defines @code{GET_WORD} | 
|---|
| 32 | to either @code{bfd_get_32} or @code{bfd_get_64}. | 
|---|
| 33 |  | 
|---|
| 34 | In the put routines, @var{val} must be a @code{bfd_vma}.  If we are on a | 
|---|
| 35 | system without prototypes, the caller is responsible for making | 
|---|
| 36 | sure that is true, with a cast if necessary.  We don't cast | 
|---|
| 37 | them in the macro definitions because that would prevent @code{lint} | 
|---|
| 38 | or @code{gcc -Wall} from detecting sins such as passing a pointer. | 
|---|
| 39 | To detect calling these with less than a @code{bfd_vma}, use | 
|---|
| 40 | @code{gcc -Wconversion} on a host with 64 bit @code{bfd_vma}'s. | 
|---|
| 41 | @example | 
|---|
| 42 |  | 
|---|
| 43 | /* Byte swapping macros for user section data.  */ | 
|---|
| 44 |  | 
|---|
| 45 | #define bfd_put_8(abfd, val, ptr) \ | 
|---|
| 46 | ((void) (*((unsigned char *) (ptr)) = (unsigned char) (val))) | 
|---|
| 47 | #define bfd_put_signed_8 \ | 
|---|
| 48 | bfd_put_8 | 
|---|
| 49 | #define bfd_get_8(abfd, ptr) \ | 
|---|
| 50 | (*(unsigned char *) (ptr) & 0xff) | 
|---|
| 51 | #define bfd_get_signed_8(abfd, ptr) \ | 
|---|
| 52 | (((*(unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80) | 
|---|
| 53 |  | 
|---|
| 54 | #define bfd_put_16(abfd, val, ptr) \ | 
|---|
| 55 | BFD_SEND(abfd, bfd_putx16, ((val),(ptr))) | 
|---|
| 56 | #define bfd_put_signed_16 \ | 
|---|
| 57 | bfd_put_16 | 
|---|
| 58 | #define bfd_get_16(abfd, ptr) \ | 
|---|
| 59 | BFD_SEND(abfd, bfd_getx16, (ptr)) | 
|---|
| 60 | #define bfd_get_signed_16(abfd, ptr) \ | 
|---|
| 61 | BFD_SEND (abfd, bfd_getx_signed_16, (ptr)) | 
|---|
| 62 |  | 
|---|
| 63 | #define bfd_put_32(abfd, val, ptr) \ | 
|---|
| 64 | BFD_SEND(abfd, bfd_putx32, ((val),(ptr))) | 
|---|
| 65 | #define bfd_put_signed_32 \ | 
|---|
| 66 | bfd_put_32 | 
|---|
| 67 | #define bfd_get_32(abfd, ptr) \ | 
|---|
| 68 | BFD_SEND(abfd, bfd_getx32, (ptr)) | 
|---|
| 69 | #define bfd_get_signed_32(abfd, ptr) \ | 
|---|
| 70 | BFD_SEND(abfd, bfd_getx_signed_32, (ptr)) | 
|---|
| 71 |  | 
|---|
| 72 | #define bfd_put_64(abfd, val, ptr) \ | 
|---|
| 73 | BFD_SEND(abfd, bfd_putx64, ((val), (ptr))) | 
|---|
| 74 | #define bfd_put_signed_64 \ | 
|---|
| 75 | bfd_put_64 | 
|---|
| 76 | #define bfd_get_64(abfd, ptr) \ | 
|---|
| 77 | BFD_SEND(abfd, bfd_getx64, (ptr)) | 
|---|
| 78 | #define bfd_get_signed_64(abfd, ptr) \ | 
|---|
| 79 | BFD_SEND(abfd, bfd_getx_signed_64, (ptr)) | 
|---|
| 80 |  | 
|---|
| 81 | #define bfd_get(bits, abfd, ptr)                               \ | 
|---|
| 82 | ( (bits) ==  8 ? (bfd_vma) bfd_get_8 (abfd, ptr)       \ | 
|---|
| 83 | : (bits) == 16 ? bfd_get_16 (abfd, ptr)        \ | 
|---|
| 84 | : (bits) == 32 ? bfd_get_32 (abfd, ptr)        \ | 
|---|
| 85 | : (bits) == 64 ? bfd_get_64 (abfd, ptr)        \ | 
|---|
| 86 | : (abort (), (bfd_vma) - 1)) | 
|---|
| 87 |  | 
|---|
| 88 | #define bfd_put(bits, abfd, val, ptr)                          \ | 
|---|
| 89 | ( (bits) ==  8 ? bfd_put_8  (abfd, val, ptr)   \ | 
|---|
| 90 | : (bits) == 16 ? bfd_put_16 (abfd, val, ptr)   \ | 
|---|
| 91 | : (bits) == 32 ? bfd_put_32 (abfd, val, ptr)   \ | 
|---|
| 92 | : (bits) == 64 ? bfd_put_64 (abfd, val, ptr)   \ | 
|---|
| 93 | : (abort (), (void) 0)) | 
|---|
| 94 |  | 
|---|
| 95 | @end example | 
|---|
| 96 |  | 
|---|
| 97 | @findex bfd_h_put_size | 
|---|
| 98 | @subsubsection @code{bfd_h_put_size} | 
|---|
| 99 | @strong{Description}@* | 
|---|
| 100 | These macros have the same function as their @code{bfd_get_x} | 
|---|
| 101 | brethren, except that they are used for removing information | 
|---|
| 102 | for the header records of object files. Believe it or not, | 
|---|
| 103 | some object files keep their header records in big endian | 
|---|
| 104 | order and their data in little endian order. | 
|---|
| 105 | @example | 
|---|
| 106 |  | 
|---|
| 107 | /* Byte swapping macros for file header data.  */ | 
|---|
| 108 |  | 
|---|
| 109 | #define bfd_h_put_8(abfd, val, ptr) \ | 
|---|
| 110 | bfd_put_8 (abfd, val, ptr) | 
|---|
| 111 | #define bfd_h_put_signed_8(abfd, val, ptr) \ | 
|---|
| 112 | bfd_put_8 (abfd, val, ptr) | 
|---|
| 113 | #define bfd_h_get_8(abfd, ptr) \ | 
|---|
| 114 | bfd_get_8 (abfd, ptr) | 
|---|
| 115 | #define bfd_h_get_signed_8(abfd, ptr) \ | 
|---|
| 116 | bfd_get_signed_8 (abfd, ptr) | 
|---|
| 117 |  | 
|---|
| 118 | #define bfd_h_put_16(abfd, val, ptr) \ | 
|---|
| 119 | BFD_SEND (abfd, bfd_h_putx16, (val, ptr)) | 
|---|
| 120 | #define bfd_h_put_signed_16 \ | 
|---|
| 121 | bfd_h_put_16 | 
|---|
| 122 | #define bfd_h_get_16(abfd, ptr) \ | 
|---|
| 123 | BFD_SEND (abfd, bfd_h_getx16, (ptr)) | 
|---|
| 124 | #define bfd_h_get_signed_16(abfd, ptr) \ | 
|---|
| 125 | BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr)) | 
|---|
| 126 |  | 
|---|
| 127 | #define bfd_h_put_32(abfd, val, ptr) \ | 
|---|
| 128 | BFD_SEND (abfd, bfd_h_putx32, (val, ptr)) | 
|---|
| 129 | #define bfd_h_put_signed_32 \ | 
|---|
| 130 | bfd_h_put_32 | 
|---|
| 131 | #define bfd_h_get_32(abfd, ptr) \ | 
|---|
| 132 | BFD_SEND (abfd, bfd_h_getx32, (ptr)) | 
|---|
| 133 | #define bfd_h_get_signed_32(abfd, ptr) \ | 
|---|
| 134 | BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr)) | 
|---|
| 135 |  | 
|---|
| 136 | #define bfd_h_put_64(abfd, val, ptr) \ | 
|---|
| 137 | BFD_SEND (abfd, bfd_h_putx64, (val, ptr)) | 
|---|
| 138 | #define bfd_h_put_signed_64 \ | 
|---|
| 139 | bfd_h_put_64 | 
|---|
| 140 | #define bfd_h_get_64(abfd, ptr) \ | 
|---|
| 141 | BFD_SEND (abfd, bfd_h_getx64, (ptr)) | 
|---|
| 142 | #define bfd_h_get_signed_64(abfd, ptr) \ | 
|---|
| 143 | BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr)) | 
|---|
| 144 |  | 
|---|
| 145 | /* Refinements on the above, which should eventually go away.  Save | 
|---|
| 146 | cluttering the source with (bfd_vma) and (bfd_byte *) casts.  */ | 
|---|
| 147 |  | 
|---|
| 148 | #define H_PUT_64(abfd, val, where) \ | 
|---|
| 149 | bfd_h_put_64 ((abfd), (bfd_vma) (val), (bfd_byte *) (where)) | 
|---|
| 150 |  | 
|---|
| 151 | #define H_PUT_32(abfd, val, where) \ | 
|---|
| 152 | bfd_h_put_32 ((abfd), (bfd_vma) (val), (bfd_byte *) (where)) | 
|---|
| 153 |  | 
|---|
| 154 | #define H_PUT_16(abfd, val, where) \ | 
|---|
| 155 | bfd_h_put_16 ((abfd), (bfd_vma) (val), (bfd_byte *) (where)) | 
|---|
| 156 |  | 
|---|
| 157 | #define H_PUT_8 bfd_h_put_8 | 
|---|
| 158 |  | 
|---|
| 159 | #define H_PUT_S64(abfd, val, where) \ | 
|---|
| 160 | bfd_h_put_signed_64 ((abfd), (bfd_vma) (val), (bfd_byte *) (where)) | 
|---|
| 161 |  | 
|---|
| 162 | #define H_PUT_S32(abfd, val, where) \ | 
|---|
| 163 | bfd_h_put_signed_32 ((abfd), (bfd_vma) (val), (bfd_byte *) (where)) | 
|---|
| 164 |  | 
|---|
| 165 | #define H_PUT_S16(abfd, val, where) \ | 
|---|
| 166 | bfd_h_put_signed_16 ((abfd), (bfd_vma) (val), (bfd_byte *) (where)) | 
|---|
| 167 |  | 
|---|
| 168 | #define H_PUT_S8 bfd_h_put_signed_8 | 
|---|
| 169 |  | 
|---|
| 170 | #define H_GET_64(abfd, where) \ | 
|---|
| 171 | bfd_h_get_64 ((abfd), (bfd_byte *) (where)) | 
|---|
| 172 |  | 
|---|
| 173 | #define H_GET_32(abfd, where) \ | 
|---|
| 174 | bfd_h_get_32 ((abfd), (bfd_byte *) (where)) | 
|---|
| 175 |  | 
|---|
| 176 | #define H_GET_16(abfd, where) \ | 
|---|
| 177 | bfd_h_get_16 ((abfd), (bfd_byte *) (where)) | 
|---|
| 178 |  | 
|---|
| 179 | #define H_GET_8 bfd_h_get_8 | 
|---|
| 180 |  | 
|---|
| 181 | #define H_GET_S64(abfd, where) \ | 
|---|
| 182 | bfd_h_get_signed_64 ((abfd), (bfd_byte *) (where)) | 
|---|
| 183 |  | 
|---|
| 184 | #define H_GET_S32(abfd, where) \ | 
|---|
| 185 | bfd_h_get_signed_32 ((abfd), (bfd_byte *) (where)) | 
|---|
| 186 |  | 
|---|
| 187 | #define H_GET_S16(abfd, where) \ | 
|---|
| 188 | bfd_h_get_signed_16 ((abfd), (bfd_byte *) (where)) | 
|---|
| 189 |  | 
|---|
| 190 | #define H_GET_S8 bfd_h_get_signed_8 | 
|---|
| 191 |  | 
|---|
| 192 |  | 
|---|
| 193 | @end example | 
|---|
| 194 |  | 
|---|
| 195 | @findex bfd_log2 | 
|---|
| 196 | @subsubsection @code{bfd_log2} | 
|---|
| 197 | @strong{Synopsis} | 
|---|
| 198 | @example | 
|---|
| 199 | unsigned int bfd_log2 (bfd_vma x); | 
|---|
| 200 | @end example | 
|---|
| 201 | @strong{Description}@* | 
|---|
| 202 | Return the log base 2 of the value supplied, rounded up.  E.g., an | 
|---|
| 203 | @var{x} of 1025 returns 11.  A @var{x} of 0 returns 0. | 
|---|
| 204 |  | 
|---|