| 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 |
|
|---|