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