coff-rs6000.c revision 1.1 1 1.1 skrll /* BFD back-end for IBM RS/6000 "XCOFF" files.
2 1.1 skrll Copyright 1990-1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 1.1 skrll 2008 Free Software Foundation, Inc.
4 1.1 skrll Written by Metin G. Ozisik, Mimi Phuong-Thao Vo, and John Gilmore.
5 1.1 skrll Archive support from Damon A. Permezel.
6 1.1 skrll Contributed by IBM Corporation and Cygnus Support.
7 1.1 skrll
8 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
9 1.1 skrll
10 1.1 skrll This program is free software; you can redistribute it and/or modify
11 1.1 skrll it under the terms of the GNU General Public License as published by
12 1.1 skrll the Free Software Foundation; either version 3 of the License, or
13 1.1 skrll (at your option) any later version.
14 1.1 skrll
15 1.1 skrll This program is distributed in the hope that it will be useful,
16 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
17 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 1.1 skrll GNU General Public License for more details.
19 1.1 skrll
20 1.1 skrll You should have received a copy of the GNU General Public License
21 1.1 skrll along with this program; if not, write to the Free Software
22 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 1.1 skrll MA 02110-1301, USA. */
24 1.1 skrll
25 1.1 skrll #include "sysdep.h"
26 1.1 skrll #include "bfd.h"
27 1.1 skrll #include "bfdlink.h"
28 1.1 skrll #include "libbfd.h"
29 1.1 skrll #include "coff/internal.h"
30 1.1 skrll #include "coff/xcoff.h"
31 1.1 skrll #include "coff/rs6000.h"
32 1.1 skrll #include "libcoff.h"
33 1.1 skrll #include "libxcoff.h"
34 1.1 skrll
35 1.1 skrll extern bfd_boolean _bfd_xcoff_mkobject
36 1.1 skrll PARAMS ((bfd *));
37 1.1 skrll extern bfd_boolean _bfd_xcoff_copy_private_bfd_data
38 1.1 skrll PARAMS ((bfd *, bfd *));
39 1.1 skrll extern bfd_boolean _bfd_xcoff_is_local_label_name
40 1.1 skrll PARAMS ((bfd *, const char *));
41 1.1 skrll extern reloc_howto_type *_bfd_xcoff_reloc_type_lookup
42 1.1 skrll PARAMS ((bfd *, bfd_reloc_code_real_type));
43 1.1 skrll extern bfd_boolean _bfd_xcoff_slurp_armap
44 1.1 skrll PARAMS ((bfd *));
45 1.1 skrll extern const bfd_target *_bfd_xcoff_archive_p
46 1.1 skrll PARAMS ((bfd *));
47 1.1 skrll extern PTR _bfd_xcoff_read_ar_hdr
48 1.1 skrll PARAMS ((bfd *));
49 1.1 skrll extern bfd *_bfd_xcoff_openr_next_archived_file
50 1.1 skrll PARAMS ((bfd *, bfd *));
51 1.1 skrll extern int _bfd_xcoff_stat_arch_elt
52 1.1 skrll PARAMS ((bfd *, struct stat *));
53 1.1 skrll extern bfd_boolean _bfd_xcoff_write_armap
54 1.1 skrll PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
55 1.1 skrll extern bfd_boolean _bfd_xcoff_write_archive_contents
56 1.1 skrll PARAMS ((bfd *));
57 1.1 skrll extern int _bfd_xcoff_sizeof_headers
58 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *));
59 1.1 skrll extern void _bfd_xcoff_swap_sym_in
60 1.1 skrll PARAMS ((bfd *, PTR, PTR));
61 1.1 skrll extern unsigned int _bfd_xcoff_swap_sym_out
62 1.1 skrll PARAMS ((bfd *, PTR, PTR));
63 1.1 skrll extern void _bfd_xcoff_swap_aux_in
64 1.1 skrll PARAMS ((bfd *, PTR, int, int, int, int, PTR));
65 1.1 skrll extern unsigned int _bfd_xcoff_swap_aux_out
66 1.1 skrll PARAMS ((bfd *, PTR, int, int, int, int, PTR));
67 1.1 skrll static void xcoff_swap_reloc_in
68 1.1 skrll PARAMS ((bfd *, PTR, PTR));
69 1.1 skrll static unsigned int xcoff_swap_reloc_out
70 1.1 skrll PARAMS ((bfd *, PTR, PTR));
71 1.1 skrll
72 1.1 skrll /* Forward declare xcoff_rtype2howto for coffcode.h macro. */
73 1.1 skrll void xcoff_rtype2howto
74 1.1 skrll PARAMS ((arelent *, struct internal_reloc *));
75 1.1 skrll
76 1.1 skrll /* coffcode.h needs these to be defined. */
77 1.1 skrll #define RS6000COFF_C 1
78 1.1 skrll
79 1.1 skrll #define SELECT_RELOC(internal, howto) \
80 1.1 skrll { \
81 1.1 skrll internal.r_type = howto->type; \
82 1.1 skrll internal.r_size = \
83 1.1 skrll ((howto->complain_on_overflow == complain_overflow_signed \
84 1.1 skrll ? 0x80 \
85 1.1 skrll : 0) \
86 1.1 skrll | (howto->bitsize - 1)); \
87 1.1 skrll }
88 1.1 skrll
89 1.1 skrll #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
90 1.1 skrll #define COFF_LONG_FILENAMES
91 1.1 skrll #define NO_COFF_SYMBOLS
92 1.1 skrll #define RTYPE2HOWTO(cache_ptr, dst) xcoff_rtype2howto (cache_ptr, dst)
93 1.1 skrll #define coff_mkobject _bfd_xcoff_mkobject
94 1.1 skrll #define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
95 1.1 skrll #define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
96 1.1 skrll #define coff_bfd_reloc_type_lookup _bfd_xcoff_reloc_type_lookup
97 1.1 skrll #define coff_bfd_reloc_name_lookup _bfd_xcoff_reloc_name_lookup
98 1.1 skrll #ifdef AIX_CORE
99 1.1 skrll extern const bfd_target * rs6000coff_core_p
100 1.1 skrll PARAMS ((bfd *abfd));
101 1.1 skrll extern bfd_boolean rs6000coff_core_file_matches_executable_p
102 1.1 skrll PARAMS ((bfd *cbfd, bfd *ebfd));
103 1.1 skrll extern char *rs6000coff_core_file_failing_command
104 1.1 skrll PARAMS ((bfd *abfd));
105 1.1 skrll extern int rs6000coff_core_file_failing_signal
106 1.1 skrll PARAMS ((bfd *abfd));
107 1.1 skrll #define CORE_FILE_P rs6000coff_core_p
108 1.1 skrll #define coff_core_file_failing_command \
109 1.1 skrll rs6000coff_core_file_failing_command
110 1.1 skrll #define coff_core_file_failing_signal \
111 1.1 skrll rs6000coff_core_file_failing_signal
112 1.1 skrll #define coff_core_file_matches_executable_p \
113 1.1 skrll rs6000coff_core_file_matches_executable_p
114 1.1 skrll #else
115 1.1 skrll #define CORE_FILE_P _bfd_dummy_target
116 1.1 skrll #define coff_core_file_failing_command \
117 1.1 skrll _bfd_nocore_core_file_failing_command
118 1.1 skrll #define coff_core_file_failing_signal \
119 1.1 skrll _bfd_nocore_core_file_failing_signal
120 1.1 skrll #define coff_core_file_matches_executable_p \
121 1.1 skrll _bfd_nocore_core_file_matches_executable_p
122 1.1 skrll #endif
123 1.1 skrll #define coff_SWAP_sym_in _bfd_xcoff_swap_sym_in
124 1.1 skrll #define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out
125 1.1 skrll #define coff_SWAP_aux_in _bfd_xcoff_swap_aux_in
126 1.1 skrll #define coff_SWAP_aux_out _bfd_xcoff_swap_aux_out
127 1.1 skrll #define coff_swap_reloc_in xcoff_swap_reloc_in
128 1.1 skrll #define coff_swap_reloc_out xcoff_swap_reloc_out
129 1.1 skrll #define NO_COFF_RELOCS
130 1.1 skrll
131 1.1 skrll #ifndef bfd_pe_print_pdata
132 1.1 skrll #define bfd_pe_print_pdata NULL
133 1.1 skrll #endif
134 1.1 skrll
135 1.1 skrll #include "coffcode.h"
136 1.1 skrll
137 1.1 skrll /* The main body of code is in coffcode.h. */
138 1.1 skrll
139 1.1 skrll static const char *normalize_filename
140 1.1 skrll PARAMS ((bfd *));
141 1.1 skrll static bfd_boolean xcoff_write_armap_old
142 1.1 skrll PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
143 1.1 skrll static bfd_boolean xcoff_write_armap_big
144 1.1 skrll PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int));
145 1.1 skrll static bfd_boolean xcoff_write_archive_contents_old
146 1.1 skrll PARAMS ((bfd *));
147 1.1 skrll static bfd_boolean xcoff_write_archive_contents_big
148 1.1 skrll PARAMS ((bfd *));
149 1.1 skrll static void xcoff_swap_ldhdr_in
150 1.1 skrll PARAMS ((bfd *, const PTR, struct internal_ldhdr *));
151 1.1 skrll static void xcoff_swap_ldhdr_out
152 1.1 skrll PARAMS ((bfd *, const struct internal_ldhdr *, PTR));
153 1.1 skrll static void xcoff_swap_ldsym_in
154 1.1 skrll PARAMS ((bfd *, const PTR, struct internal_ldsym *));
155 1.1 skrll static void xcoff_swap_ldsym_out
156 1.1 skrll PARAMS ((bfd *, const struct internal_ldsym *, PTR));
157 1.1 skrll static void xcoff_swap_ldrel_in
158 1.1 skrll PARAMS ((bfd *, const PTR, struct internal_ldrel *));
159 1.1 skrll static void xcoff_swap_ldrel_out
160 1.1 skrll PARAMS ((bfd *, const struct internal_ldrel *, PTR));
161 1.1 skrll static bfd_boolean xcoff_ppc_relocate_section
162 1.1 skrll PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
163 1.1 skrll struct internal_reloc *, struct internal_syment *, asection **));
164 1.1 skrll static bfd_boolean _bfd_xcoff_put_ldsymbol_name
165 1.1 skrll PARAMS ((bfd *, struct xcoff_loader_info *, struct internal_ldsym *,
166 1.1 skrll const char *));
167 1.1 skrll static asection *xcoff_create_csect_from_smclas
168 1.1 skrll PARAMS ((bfd *, union internal_auxent *, const char *));
169 1.1 skrll static bfd_boolean xcoff_is_lineno_count_overflow
170 1.1 skrll PARAMS ((bfd *, bfd_vma));
171 1.1 skrll static bfd_boolean xcoff_is_reloc_count_overflow
172 1.1 skrll PARAMS ((bfd *, bfd_vma));
173 1.1 skrll static bfd_vma xcoff_loader_symbol_offset
174 1.1 skrll PARAMS ((bfd *, struct internal_ldhdr *));
175 1.1 skrll static bfd_vma xcoff_loader_reloc_offset
176 1.1 skrll PARAMS ((bfd *, struct internal_ldhdr *));
177 1.1 skrll static bfd_boolean xcoff_generate_rtinit
178 1.1 skrll PARAMS ((bfd *, const char *, const char *, bfd_boolean));
179 1.1 skrll static bfd_boolean do_pad
180 1.1 skrll PARAMS ((bfd *, unsigned int));
181 1.1 skrll static bfd_boolean do_copy
182 1.1 skrll PARAMS ((bfd *, bfd *));
183 1.1 skrll static bfd_boolean do_shared_object_padding
184 1.1 skrll PARAMS ((bfd *, bfd *, file_ptr *, int));
185 1.1 skrll
186 1.1 skrll /* Relocation functions */
187 1.1 skrll static bfd_boolean xcoff_reloc_type_br
188 1.1 skrll PARAMS ((XCOFF_RELOC_FUNCTION_ARGS));
189 1.1 skrll
190 1.1 skrll static bfd_boolean xcoff_complain_overflow_dont_func
191 1.1 skrll PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
192 1.1 skrll static bfd_boolean xcoff_complain_overflow_bitfield_func
193 1.1 skrll PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
194 1.1 skrll static bfd_boolean xcoff_complain_overflow_signed_func
195 1.1 skrll PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
196 1.1 skrll static bfd_boolean xcoff_complain_overflow_unsigned_func
197 1.1 skrll PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS));
198 1.1 skrll
199 1.1 skrll bfd_boolean (*xcoff_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION])
200 1.1 skrll PARAMS ((XCOFF_RELOC_FUNCTION_ARGS)) =
201 1.1 skrll {
202 1.1 skrll xcoff_reloc_type_pos, /* R_POS (0x00) */
203 1.1 skrll xcoff_reloc_type_neg, /* R_NEG (0x01) */
204 1.1 skrll xcoff_reloc_type_rel, /* R_REL (0x02) */
205 1.1 skrll xcoff_reloc_type_toc, /* R_TOC (0x03) */
206 1.1 skrll xcoff_reloc_type_fail, /* R_RTB (0x04) */
207 1.1 skrll xcoff_reloc_type_toc, /* R_GL (0x05) */
208 1.1 skrll xcoff_reloc_type_toc, /* R_TCL (0x06) */
209 1.1 skrll xcoff_reloc_type_fail, /* (0x07) */
210 1.1 skrll xcoff_reloc_type_ba, /* R_BA (0x08) */
211 1.1 skrll xcoff_reloc_type_fail, /* (0x09) */
212 1.1 skrll xcoff_reloc_type_br, /* R_BR (0x0a) */
213 1.1 skrll xcoff_reloc_type_fail, /* (0x0b) */
214 1.1 skrll xcoff_reloc_type_pos, /* R_RL (0x0c) */
215 1.1 skrll xcoff_reloc_type_pos, /* R_RLA (0x0d) */
216 1.1 skrll xcoff_reloc_type_fail, /* (0x0e) */
217 1.1 skrll xcoff_reloc_type_noop, /* R_REF (0x0f) */
218 1.1 skrll xcoff_reloc_type_fail, /* (0x10) */
219 1.1 skrll xcoff_reloc_type_fail, /* (0x11) */
220 1.1 skrll xcoff_reloc_type_toc, /* R_TRL (0x12) */
221 1.1 skrll xcoff_reloc_type_toc, /* R_TRLA (0x13) */
222 1.1 skrll xcoff_reloc_type_fail, /* R_RRTBI (0x14) */
223 1.1 skrll xcoff_reloc_type_fail, /* R_RRTBA (0x15) */
224 1.1 skrll xcoff_reloc_type_ba, /* R_CAI (0x16) */
225 1.1 skrll xcoff_reloc_type_crel, /* R_CREL (0x17) */
226 1.1 skrll xcoff_reloc_type_ba, /* R_RBA (0x18) */
227 1.1 skrll xcoff_reloc_type_ba, /* R_RBAC (0x19) */
228 1.1 skrll xcoff_reloc_type_br, /* R_RBR (0x1a) */
229 1.1 skrll xcoff_reloc_type_ba, /* R_RBRC (0x1b) */
230 1.1 skrll };
231 1.1 skrll
232 1.1 skrll bfd_boolean (*xcoff_complain_overflow[XCOFF_MAX_COMPLAIN_OVERFLOW])
233 1.1 skrll PARAMS ((XCOFF_COMPLAIN_FUNCTION_ARGS)) =
234 1.1 skrll {
235 1.1 skrll xcoff_complain_overflow_dont_func,
236 1.1 skrll xcoff_complain_overflow_bitfield_func,
237 1.1 skrll xcoff_complain_overflow_signed_func,
238 1.1 skrll xcoff_complain_overflow_unsigned_func,
239 1.1 skrll };
240 1.1 skrll
241 1.1 skrll /* We use our own tdata type. Its first field is the COFF tdata type,
242 1.1 skrll so the COFF routines are compatible. */
243 1.1 skrll
244 1.1 skrll bfd_boolean
245 1.1 skrll _bfd_xcoff_mkobject (abfd)
246 1.1 skrll bfd *abfd;
247 1.1 skrll {
248 1.1 skrll coff_data_type *coff;
249 1.1 skrll bfd_size_type amt = sizeof (struct xcoff_tdata);
250 1.1 skrll
251 1.1 skrll abfd->tdata.xcoff_obj_data = (struct xcoff_tdata *) bfd_zalloc (abfd, amt);
252 1.1 skrll if (abfd->tdata.xcoff_obj_data == NULL)
253 1.1 skrll return FALSE;
254 1.1 skrll coff = coff_data (abfd);
255 1.1 skrll coff->symbols = (coff_symbol_type *) NULL;
256 1.1 skrll coff->conversion_table = (unsigned int *) NULL;
257 1.1 skrll coff->raw_syments = (struct coff_ptr_struct *) NULL;
258 1.1 skrll coff->relocbase = 0;
259 1.1 skrll
260 1.1 skrll xcoff_data (abfd)->modtype = ('1' << 8) | 'L';
261 1.1 skrll
262 1.1 skrll /* We set cputype to -1 to indicate that it has not been
263 1.1 skrll initialized. */
264 1.1 skrll xcoff_data (abfd)->cputype = -1;
265 1.1 skrll
266 1.1 skrll xcoff_data (abfd)->csects = NULL;
267 1.1 skrll xcoff_data (abfd)->debug_indices = NULL;
268 1.1 skrll
269 1.1 skrll /* text section alignment is different than the default */
270 1.1 skrll bfd_xcoff_text_align_power (abfd) = 2;
271 1.1 skrll
272 1.1 skrll return TRUE;
273 1.1 skrll }
274 1.1 skrll
275 1.1 skrll /* Copy XCOFF data from one BFD to another. */
276 1.1 skrll
277 1.1 skrll bfd_boolean
278 1.1 skrll _bfd_xcoff_copy_private_bfd_data (ibfd, obfd)
279 1.1 skrll bfd *ibfd;
280 1.1 skrll bfd *obfd;
281 1.1 skrll {
282 1.1 skrll struct xcoff_tdata *ix, *ox;
283 1.1 skrll asection *sec;
284 1.1 skrll
285 1.1 skrll if (ibfd->xvec != obfd->xvec)
286 1.1 skrll return TRUE;
287 1.1 skrll ix = xcoff_data (ibfd);
288 1.1 skrll ox = xcoff_data (obfd);
289 1.1 skrll ox->full_aouthdr = ix->full_aouthdr;
290 1.1 skrll ox->toc = ix->toc;
291 1.1 skrll if (ix->sntoc == 0)
292 1.1 skrll ox->sntoc = 0;
293 1.1 skrll else
294 1.1 skrll {
295 1.1 skrll sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
296 1.1 skrll if (sec == NULL)
297 1.1 skrll ox->sntoc = 0;
298 1.1 skrll else
299 1.1 skrll ox->sntoc = sec->output_section->target_index;
300 1.1 skrll }
301 1.1 skrll if (ix->snentry == 0)
302 1.1 skrll ox->snentry = 0;
303 1.1 skrll else
304 1.1 skrll {
305 1.1 skrll sec = coff_section_from_bfd_index (ibfd, ix->snentry);
306 1.1 skrll if (sec == NULL)
307 1.1 skrll ox->snentry = 0;
308 1.1 skrll else
309 1.1 skrll ox->snentry = sec->output_section->target_index;
310 1.1 skrll }
311 1.1 skrll bfd_xcoff_text_align_power (obfd) = bfd_xcoff_text_align_power (ibfd);
312 1.1 skrll bfd_xcoff_data_align_power (obfd) = bfd_xcoff_data_align_power (ibfd);
313 1.1 skrll ox->modtype = ix->modtype;
314 1.1 skrll ox->cputype = ix->cputype;
315 1.1 skrll ox->maxdata = ix->maxdata;
316 1.1 skrll ox->maxstack = ix->maxstack;
317 1.1 skrll return TRUE;
318 1.1 skrll }
319 1.1 skrll
320 1.1 skrll /* I don't think XCOFF really has a notion of local labels based on
321 1.1 skrll name. This will mean that ld -X doesn't actually strip anything.
322 1.1 skrll The AIX native linker does not have a -X option, and it ignores the
323 1.1 skrll -x option. */
324 1.1 skrll
325 1.1 skrll bfd_boolean
326 1.1 skrll _bfd_xcoff_is_local_label_name (abfd, name)
327 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
328 1.1 skrll const char *name ATTRIBUTE_UNUSED;
329 1.1 skrll {
330 1.1 skrll return FALSE;
331 1.1 skrll }
332 1.1 skrll
333 1.1 skrll void
335 1.1 skrll _bfd_xcoff_swap_sym_in (abfd, ext1, in1)
336 1.1 skrll bfd *abfd;
337 1.1 skrll PTR ext1;
338 1.1 skrll PTR in1;
339 1.1 skrll {
340 1.1 skrll SYMENT *ext = (SYMENT *)ext1;
341 1.1 skrll struct internal_syment * in = (struct internal_syment *)in1;
342 1.1 skrll
343 1.1 skrll if (ext->e.e_name[0] != 0)
344 1.1 skrll {
345 1.1 skrll memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
346 1.1 skrll }
347 1.1 skrll else
348 1.1 skrll {
349 1.1 skrll in->_n._n_n._n_zeroes = 0;
350 1.1 skrll in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
351 1.1 skrll }
352 1.1 skrll
353 1.1 skrll in->n_value = H_GET_32 (abfd, ext->e_value);
354 1.1 skrll in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
355 1.1 skrll in->n_type = H_GET_16 (abfd, ext->e_type);
356 1.1 skrll in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
357 1.1 skrll in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
358 1.1 skrll }
359 1.1 skrll
360 1.1 skrll unsigned int
361 1.1 skrll _bfd_xcoff_swap_sym_out (abfd, inp, extp)
362 1.1 skrll bfd *abfd;
363 1.1 skrll PTR inp;
364 1.1 skrll PTR extp;
365 1.1 skrll {
366 1.1 skrll struct internal_syment *in = (struct internal_syment *)inp;
367 1.1 skrll SYMENT *ext =(SYMENT *)extp;
368 1.1 skrll
369 1.1 skrll if (in->_n._n_name[0] != 0)
370 1.1 skrll {
371 1.1 skrll memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
372 1.1 skrll }
373 1.1 skrll else
374 1.1 skrll {
375 1.1 skrll H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
376 1.1 skrll H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
377 1.1 skrll }
378 1.1 skrll
379 1.1 skrll H_PUT_32 (abfd, in->n_value, ext->e_value);
380 1.1 skrll H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
381 1.1 skrll H_PUT_16 (abfd, in->n_type, ext->e_type);
382 1.1 skrll H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
383 1.1 skrll H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
384 1.1 skrll return bfd_coff_symesz (abfd);
385 1.1 skrll }
386 1.1 skrll
387 1.1 skrll void
388 1.1 skrll _bfd_xcoff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
389 1.1 skrll bfd *abfd;
390 1.1 skrll PTR ext1;
391 1.1 skrll int type;
392 1.1 skrll int class;
393 1.1 skrll int indx;
394 1.1 skrll int numaux;
395 1.1 skrll PTR in1;
396 1.1 skrll {
397 1.1 skrll AUXENT * ext = (AUXENT *)ext1;
398 1.1 skrll union internal_auxent *in = (union internal_auxent *)in1;
399 1.1 skrll
400 1.1 skrll switch (class)
401 1.1 skrll {
402 1.1 skrll case C_FILE:
403 1.1 skrll if (ext->x_file.x_fname[0] == 0)
404 1.1 skrll {
405 1.1 skrll in->x_file.x_n.x_zeroes = 0;
406 1.1 skrll in->x_file.x_n.x_offset =
407 1.1 skrll H_GET_32 (abfd, ext->x_file.x_n.x_offset);
408 1.1 skrll }
409 1.1 skrll else
410 1.1 skrll {
411 1.1 skrll if (numaux > 1)
412 1.1 skrll {
413 1.1 skrll if (indx == 0)
414 1.1 skrll memcpy (in->x_file.x_fname, ext->x_file.x_fname,
415 1.1 skrll numaux * sizeof (AUXENT));
416 1.1 skrll }
417 1.1 skrll else
418 1.1 skrll {
419 1.1 skrll memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
420 1.1 skrll }
421 1.1 skrll }
422 1.1 skrll goto end;
423 1.1 skrll
424 1.1 skrll /* RS/6000 "csect" auxents */
425 1.1 skrll case C_EXT:
426 1.1 skrll case C_HIDEXT:
427 1.1 skrll if (indx + 1 == numaux)
428 1.1 skrll {
429 1.1 skrll in->x_csect.x_scnlen.l = H_GET_32 (abfd, ext->x_csect.x_scnlen);
430 1.1 skrll in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
431 1.1 skrll in->x_csect.x_snhash = H_GET_16 (abfd, ext->x_csect.x_snhash);
432 1.1 skrll /* We don't have to hack bitfields in x_smtyp because it's
433 1.1 skrll defined by shifts-and-ands, which are equivalent on all
434 1.1 skrll byte orders. */
435 1.1 skrll in->x_csect.x_smtyp = H_GET_8 (abfd, ext->x_csect.x_smtyp);
436 1.1 skrll in->x_csect.x_smclas = H_GET_8 (abfd, ext->x_csect.x_smclas);
437 1.1 skrll in->x_csect.x_stab = H_GET_32 (abfd, ext->x_csect.x_stab);
438 1.1 skrll in->x_csect.x_snstab = H_GET_16 (abfd, ext->x_csect.x_snstab);
439 1.1 skrll goto end;
440 1.1 skrll }
441 1.1 skrll break;
442 1.1 skrll
443 1.1 skrll case C_STAT:
444 1.1 skrll case C_LEAFSTAT:
445 1.1 skrll case C_HIDDEN:
446 1.1 skrll if (type == T_NULL)
447 1.1 skrll {
448 1.1 skrll in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
449 1.1 skrll in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
450 1.1 skrll in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
451 1.1 skrll /* PE defines some extra fields; we zero them out for
452 1.1 skrll safety. */
453 1.1 skrll in->x_scn.x_checksum = 0;
454 1.1 skrll in->x_scn.x_associated = 0;
455 1.1 skrll in->x_scn.x_comdat = 0;
456 1.1 skrll
457 1.1 skrll goto end;
458 1.1 skrll }
459 1.1 skrll break;
460 1.1 skrll }
461 1.1 skrll
462 1.1 skrll in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
463 1.1 skrll in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
464 1.1 skrll
465 1.1 skrll if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
466 1.1 skrll {
467 1.1 skrll in->x_sym.x_fcnary.x_fcn.x_lnnoptr =
468 1.1 skrll H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
469 1.1 skrll in->x_sym.x_fcnary.x_fcn.x_endndx.l =
470 1.1 skrll H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
471 1.1 skrll }
472 1.1 skrll else
473 1.1 skrll {
474 1.1 skrll in->x_sym.x_fcnary.x_ary.x_dimen[0] =
475 1.1 skrll H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
476 1.1 skrll in->x_sym.x_fcnary.x_ary.x_dimen[1] =
477 1.1 skrll H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
478 1.1 skrll in->x_sym.x_fcnary.x_ary.x_dimen[2] =
479 1.1 skrll H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
480 1.1 skrll in->x_sym.x_fcnary.x_ary.x_dimen[3] =
481 1.1 skrll H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
482 1.1 skrll }
483 1.1 skrll
484 1.1 skrll if (ISFCN (type))
485 1.1 skrll {
486 1.1 skrll in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
487 1.1 skrll }
488 1.1 skrll else
489 1.1 skrll {
490 1.1 skrll in->x_sym.x_misc.x_lnsz.x_lnno =
491 1.1 skrll H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno);
492 1.1 skrll in->x_sym.x_misc.x_lnsz.x_size =
493 1.1 skrll H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size);
494 1.1 skrll }
495 1.1 skrll
496 1.1 skrll end: ;
497 1.1 skrll /* The semicolon is because MSVC doesn't like labels at
498 1.1 skrll end of block. */
499 1.1 skrll }
500 1.1 skrll
501 1.1 skrll
502 1.1 skrll unsigned int _bfd_xcoff_swap_aux_out
503 1.1 skrll PARAMS ((bfd *, PTR, int, int, int, int, PTR));
504 1.1 skrll
505 1.1 skrll unsigned int
506 1.1 skrll _bfd_xcoff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
507 1.1 skrll bfd * abfd;
508 1.1 skrll PTR inp;
509 1.1 skrll int type;
510 1.1 skrll int class;
511 1.1 skrll int indx ATTRIBUTE_UNUSED;
512 1.1 skrll int numaux ATTRIBUTE_UNUSED;
513 1.1 skrll PTR extp;
514 1.1 skrll {
515 1.1 skrll union internal_auxent *in = (union internal_auxent *)inp;
516 1.1 skrll AUXENT *ext = (AUXENT *)extp;
517 1.1 skrll
518 1.1 skrll memset ((PTR)ext, 0, bfd_coff_auxesz (abfd));
519 1.1 skrll switch (class)
520 1.1 skrll {
521 1.1 skrll case C_FILE:
522 1.1 skrll if (in->x_file.x_fname[0] == 0)
523 1.1 skrll {
524 1.1 skrll H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
525 1.1 skrll H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
526 1.1 skrll }
527 1.1 skrll else
528 1.1 skrll {
529 1.1 skrll memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
530 1.1 skrll }
531 1.1 skrll goto end;
532 1.1 skrll
533 1.1 skrll /* RS/6000 "csect" auxents */
534 1.1 skrll case C_EXT:
535 1.1 skrll case C_HIDEXT:
536 1.1 skrll if (indx + 1 == numaux)
537 1.1 skrll {
538 1.1 skrll H_PUT_32 (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen);
539 1.1 skrll H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
540 1.1 skrll H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
541 1.1 skrll /* We don't have to hack bitfields in x_smtyp because it's
542 1.1 skrll defined by shifts-and-ands, which are equivalent on all
543 1.1 skrll byte orders. */
544 1.1 skrll H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
545 1.1 skrll H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
546 1.1 skrll H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
547 1.1 skrll H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
548 1.1 skrll goto end;
549 1.1 skrll }
550 1.1 skrll break;
551 1.1 skrll
552 1.1 skrll case C_STAT:
553 1.1 skrll case C_LEAFSTAT:
554 1.1 skrll case C_HIDDEN:
555 1.1 skrll if (type == T_NULL)
556 1.1 skrll {
557 1.1 skrll H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
558 1.1 skrll H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
559 1.1 skrll H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
560 1.1 skrll goto end;
561 1.1 skrll }
562 1.1 skrll break;
563 1.1 skrll }
564 1.1 skrll
565 1.1 skrll H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
566 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
567 1.1 skrll
568 1.1 skrll if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
569 1.1 skrll {
570 1.1 skrll H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
571 1.1 skrll ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
572 1.1 skrll H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
573 1.1 skrll ext->x_sym.x_fcnary.x_fcn.x_endndx);
574 1.1 skrll }
575 1.1 skrll else
576 1.1 skrll {
577 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
578 1.1 skrll ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
579 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
580 1.1 skrll ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
581 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
582 1.1 skrll ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
583 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
584 1.1 skrll ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
585 1.1 skrll }
586 1.1 skrll
587 1.1 skrll if (ISFCN (type))
588 1.1 skrll H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
589 1.1 skrll else
590 1.1 skrll {
591 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
592 1.1 skrll ext->x_sym.x_misc.x_lnsz.x_lnno);
593 1.1 skrll H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
594 1.1 skrll ext->x_sym.x_misc.x_lnsz.x_size);
595 1.1 skrll }
596 1.1 skrll
597 1.1 skrll end:
598 1.1 skrll return bfd_coff_auxesz (abfd);
599 1.1 skrll }
600 1.1 skrll
601 1.1 skrll
602 1.1 skrll
603 1.1 skrll /* The XCOFF reloc table. Actually, XCOFF relocations specify the
605 1.1 skrll bitsize and whether they are signed or not, along with a
606 1.1 skrll conventional type. This table is for the types, which are used for
607 1.1 skrll different algorithms for putting in the reloc. Many of these
608 1.1 skrll relocs need special_function entries, which I have not written. */
609 1.1 skrll
610 1.1 skrll
611 1.1 skrll reloc_howto_type xcoff_howto_table[] =
612 1.1 skrll {
613 1.1 skrll /* Standard 32 bit relocation. */
614 1.1 skrll HOWTO (R_POS, /* type */
615 1.1 skrll 0, /* rightshift */
616 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
617 1.1 skrll 32, /* bitsize */
618 1.1 skrll FALSE, /* pc_relative */
619 1.1 skrll 0, /* bitpos */
620 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
621 1.1 skrll 0, /* special_function */
622 1.1 skrll "R_POS", /* name */
623 1.1 skrll TRUE, /* partial_inplace */
624 1.1 skrll 0xffffffff, /* src_mask */
625 1.1 skrll 0xffffffff, /* dst_mask */
626 1.1 skrll FALSE), /* pcrel_offset */
627 1.1 skrll
628 1.1 skrll /* 32 bit relocation, but store negative value. */
629 1.1 skrll HOWTO (R_NEG, /* type */
630 1.1 skrll 0, /* rightshift */
631 1.1 skrll -2, /* size (0 = byte, 1 = short, 2 = long) */
632 1.1 skrll 32, /* bitsize */
633 1.1 skrll FALSE, /* pc_relative */
634 1.1 skrll 0, /* bitpos */
635 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
636 1.1 skrll 0, /* special_function */
637 1.1 skrll "R_NEG", /* name */
638 1.1 skrll TRUE, /* partial_inplace */
639 1.1 skrll 0xffffffff, /* src_mask */
640 1.1 skrll 0xffffffff, /* dst_mask */
641 1.1 skrll FALSE), /* pcrel_offset */
642 1.1 skrll
643 1.1 skrll /* 32 bit PC relative relocation. */
644 1.1 skrll HOWTO (R_REL, /* type */
645 1.1 skrll 0, /* rightshift */
646 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
647 1.1 skrll 32, /* bitsize */
648 1.1 skrll TRUE, /* pc_relative */
649 1.1 skrll 0, /* bitpos */
650 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
651 1.1 skrll 0, /* special_function */
652 1.1 skrll "R_REL", /* name */
653 1.1 skrll TRUE, /* partial_inplace */
654 1.1 skrll 0xffffffff, /* src_mask */
655 1.1 skrll 0xffffffff, /* dst_mask */
656 1.1 skrll FALSE), /* pcrel_offset */
657 1.1 skrll
658 1.1 skrll /* 16 bit TOC relative relocation. */
659 1.1 skrll HOWTO (R_TOC, /* type */
660 1.1 skrll 0, /* rightshift */
661 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
662 1.1 skrll 16, /* bitsize */
663 1.1 skrll FALSE, /* pc_relative */
664 1.1 skrll 0, /* bitpos */
665 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
666 1.1 skrll 0, /* special_function */
667 1.1 skrll "R_TOC", /* name */
668 1.1 skrll TRUE, /* partial_inplace */
669 1.1 skrll 0xffff, /* src_mask */
670 1.1 skrll 0xffff, /* dst_mask */
671 1.1 skrll FALSE), /* pcrel_offset */
672 1.1 skrll
673 1.1 skrll /* I don't really know what this is. */
674 1.1 skrll HOWTO (R_RTB, /* type */
675 1.1 skrll 1, /* rightshift */
676 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
677 1.1 skrll 32, /* bitsize */
678 1.1 skrll FALSE, /* pc_relative */
679 1.1 skrll 0, /* bitpos */
680 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
681 1.1 skrll 0, /* special_function */
682 1.1 skrll "R_RTB", /* name */
683 1.1 skrll TRUE, /* partial_inplace */
684 1.1 skrll 0xffffffff, /* src_mask */
685 1.1 skrll 0xffffffff, /* dst_mask */
686 1.1 skrll FALSE), /* pcrel_offset */
687 1.1 skrll
688 1.1 skrll /* External TOC relative symbol. */
689 1.1 skrll HOWTO (R_GL, /* type */
690 1.1 skrll 0, /* rightshift */
691 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
692 1.1 skrll 16, /* bitsize */
693 1.1 skrll FALSE, /* pc_relative */
694 1.1 skrll 0, /* bitpos */
695 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
696 1.1 skrll 0, /* special_function */
697 1.1 skrll "R_GL", /* name */
698 1.1 skrll TRUE, /* partial_inplace */
699 1.1 skrll 0xffff, /* src_mask */
700 1.1 skrll 0xffff, /* dst_mask */
701 1.1 skrll FALSE), /* pcrel_offset */
702 1.1 skrll
703 1.1 skrll /* Local TOC relative symbol. */
704 1.1 skrll HOWTO (R_TCL, /* type */
705 1.1 skrll 0, /* rightshift */
706 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
707 1.1 skrll 16, /* bitsize */
708 1.1 skrll FALSE, /* pc_relative */
709 1.1 skrll 0, /* bitpos */
710 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
711 1.1 skrll 0, /* special_function */
712 1.1 skrll "R_TCL", /* name */
713 1.1 skrll TRUE, /* partial_inplace */
714 1.1 skrll 0xffff, /* src_mask */
715 1.1 skrll 0xffff, /* dst_mask */
716 1.1 skrll FALSE), /* pcrel_offset */
717 1.1 skrll
718 1.1 skrll EMPTY_HOWTO (7),
719 1.1 skrll
720 1.1 skrll /* Non modifiable absolute branch. */
721 1.1 skrll HOWTO (R_BA, /* type */
722 1.1 skrll 0, /* rightshift */
723 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
724 1.1 skrll 26, /* bitsize */
725 1.1 skrll FALSE, /* pc_relative */
726 1.1 skrll 0, /* bitpos */
727 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
728 1.1 skrll 0, /* special_function */
729 1.1 skrll "R_BA_26", /* name */
730 1.1 skrll TRUE, /* partial_inplace */
731 1.1 skrll 0x03fffffc, /* src_mask */
732 1.1 skrll 0x03fffffc, /* dst_mask */
733 1.1 skrll FALSE), /* pcrel_offset */
734 1.1 skrll
735 1.1 skrll EMPTY_HOWTO (9),
736 1.1 skrll
737 1.1 skrll /* Non modifiable relative branch. */
738 1.1 skrll HOWTO (R_BR, /* type */
739 1.1 skrll 0, /* rightshift */
740 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
741 1.1 skrll 26, /* bitsize */
742 1.1 skrll TRUE, /* pc_relative */
743 1.1 skrll 0, /* bitpos */
744 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
745 1.1 skrll 0, /* special_function */
746 1.1 skrll "R_BR", /* name */
747 1.1 skrll TRUE, /* partial_inplace */
748 1.1 skrll 0x03fffffc, /* src_mask */
749 1.1 skrll 0x03fffffc, /* dst_mask */
750 1.1 skrll FALSE), /* pcrel_offset */
751 1.1 skrll
752 1.1 skrll EMPTY_HOWTO (0xb),
753 1.1 skrll
754 1.1 skrll /* Indirect load. */
755 1.1 skrll HOWTO (R_RL, /* type */
756 1.1 skrll 0, /* rightshift */
757 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
758 1.1 skrll 16, /* bitsize */
759 1.1 skrll FALSE, /* pc_relative */
760 1.1 skrll 0, /* bitpos */
761 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
762 1.1 skrll 0, /* special_function */
763 1.1 skrll "R_RL", /* name */
764 1.1 skrll TRUE, /* partial_inplace */
765 1.1 skrll 0xffff, /* src_mask */
766 1.1 skrll 0xffff, /* dst_mask */
767 1.1 skrll FALSE), /* pcrel_offset */
768 1.1 skrll
769 1.1 skrll /* Load address. */
770 1.1 skrll HOWTO (R_RLA, /* type */
771 1.1 skrll 0, /* rightshift */
772 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
773 1.1 skrll 16, /* bitsize */
774 1.1 skrll FALSE, /* pc_relative */
775 1.1 skrll 0, /* bitpos */
776 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
777 1.1 skrll 0, /* special_function */
778 1.1 skrll "R_RLA", /* name */
779 1.1 skrll TRUE, /* partial_inplace */
780 1.1 skrll 0xffff, /* src_mask */
781 1.1 skrll 0xffff, /* dst_mask */
782 1.1 skrll FALSE), /* pcrel_offset */
783 1.1 skrll
784 1.1 skrll EMPTY_HOWTO (0xe),
785 1.1 skrll
786 1.1 skrll /* Non-relocating reference. */
787 1.1 skrll HOWTO (R_REF, /* type */
788 1.1 skrll 0, /* rightshift */
789 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
790 1.1 skrll 32, /* bitsize */
791 1.1 skrll FALSE, /* pc_relative */
792 1.1 skrll 0, /* bitpos */
793 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
794 1.1 skrll 0, /* special_function */
795 1.1 skrll "R_REF", /* name */
796 1.1 skrll FALSE, /* partial_inplace */
797 1.1 skrll 0, /* src_mask */
798 1.1 skrll 0, /* dst_mask */
799 1.1 skrll FALSE), /* pcrel_offset */
800 1.1 skrll
801 1.1 skrll EMPTY_HOWTO (0x10),
802 1.1 skrll EMPTY_HOWTO (0x11),
803 1.1 skrll
804 1.1 skrll /* TOC relative indirect load. */
805 1.1 skrll HOWTO (R_TRL, /* type */
806 1.1 skrll 0, /* rightshift */
807 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
808 1.1 skrll 16, /* bitsize */
809 1.1 skrll FALSE, /* pc_relative */
810 1.1 skrll 0, /* bitpos */
811 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
812 1.1 skrll 0, /* special_function */
813 1.1 skrll "R_TRL", /* name */
814 1.1 skrll TRUE, /* partial_inplace */
815 1.1 skrll 0xffff, /* src_mask */
816 1.1 skrll 0xffff, /* dst_mask */
817 1.1 skrll FALSE), /* pcrel_offset */
818 1.1 skrll
819 1.1 skrll /* TOC relative load address. */
820 1.1 skrll HOWTO (R_TRLA, /* type */
821 1.1 skrll 0, /* rightshift */
822 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
823 1.1 skrll 16, /* bitsize */
824 1.1 skrll FALSE, /* pc_relative */
825 1.1 skrll 0, /* bitpos */
826 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
827 1.1 skrll 0, /* special_function */
828 1.1 skrll "R_TRLA", /* name */
829 1.1 skrll TRUE, /* partial_inplace */
830 1.1 skrll 0xffff, /* src_mask */
831 1.1 skrll 0xffff, /* dst_mask */
832 1.1 skrll FALSE), /* pcrel_offset */
833 1.1 skrll
834 1.1 skrll /* Modifiable relative branch. */
835 1.1 skrll HOWTO (R_RRTBI, /* type */
836 1.1 skrll 1, /* rightshift */
837 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
838 1.1 skrll 32, /* bitsize */
839 1.1 skrll FALSE, /* pc_relative */
840 1.1 skrll 0, /* bitpos */
841 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
842 1.1 skrll 0, /* special_function */
843 1.1 skrll "R_RRTBI", /* name */
844 1.1 skrll TRUE, /* partial_inplace */
845 1.1 skrll 0xffffffff, /* src_mask */
846 1.1 skrll 0xffffffff, /* dst_mask */
847 1.1 skrll FALSE), /* pcrel_offset */
848 1.1 skrll
849 1.1 skrll /* Modifiable absolute branch. */
850 1.1 skrll HOWTO (R_RRTBA, /* type */
851 1.1 skrll 1, /* rightshift */
852 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
853 1.1 skrll 32, /* bitsize */
854 1.1 skrll FALSE, /* pc_relative */
855 1.1 skrll 0, /* bitpos */
856 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
857 1.1 skrll 0, /* special_function */
858 1.1 skrll "R_RRTBA", /* name */
859 1.1 skrll TRUE, /* partial_inplace */
860 1.1 skrll 0xffffffff, /* src_mask */
861 1.1 skrll 0xffffffff, /* dst_mask */
862 1.1 skrll FALSE), /* pcrel_offset */
863 1.1 skrll
864 1.1 skrll /* Modifiable call absolute indirect. */
865 1.1 skrll HOWTO (R_CAI, /* type */
866 1.1 skrll 0, /* rightshift */
867 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
868 1.1 skrll 16, /* bitsize */
869 1.1 skrll FALSE, /* pc_relative */
870 1.1 skrll 0, /* bitpos */
871 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
872 1.1 skrll 0, /* special_function */
873 1.1 skrll "R_CAI", /* name */
874 1.1 skrll TRUE, /* partial_inplace */
875 1.1 skrll 0xffff, /* src_mask */
876 1.1 skrll 0xffff, /* dst_mask */
877 1.1 skrll FALSE), /* pcrel_offset */
878 1.1 skrll
879 1.1 skrll /* Modifiable call relative. */
880 1.1 skrll HOWTO (R_CREL, /* type */
881 1.1 skrll 0, /* rightshift */
882 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
883 1.1 skrll 16, /* bitsize */
884 1.1 skrll FALSE, /* pc_relative */
885 1.1 skrll 0, /* bitpos */
886 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
887 1.1 skrll 0, /* special_function */
888 1.1 skrll "R_CREL", /* name */
889 1.1 skrll TRUE, /* partial_inplace */
890 1.1 skrll 0xffff, /* src_mask */
891 1.1 skrll 0xffff, /* dst_mask */
892 1.1 skrll FALSE), /* pcrel_offset */
893 1.1 skrll
894 1.1 skrll /* Modifiable branch absolute. */
895 1.1 skrll HOWTO (R_RBA, /* type */
896 1.1 skrll 0, /* rightshift */
897 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
898 1.1 skrll 26, /* bitsize */
899 1.1 skrll FALSE, /* pc_relative */
900 1.1 skrll 0, /* bitpos */
901 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
902 1.1 skrll 0, /* special_function */
903 1.1 skrll "R_RBA", /* name */
904 1.1 skrll TRUE, /* partial_inplace */
905 1.1 skrll 0x03fffffc, /* src_mask */
906 1.1 skrll 0x03fffffc, /* dst_mask */
907 1.1 skrll FALSE), /* pcrel_offset */
908 1.1 skrll
909 1.1 skrll /* Modifiable branch absolute. */
910 1.1 skrll HOWTO (R_RBAC, /* type */
911 1.1 skrll 0, /* rightshift */
912 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
913 1.1 skrll 32, /* bitsize */
914 1.1 skrll FALSE, /* pc_relative */
915 1.1 skrll 0, /* bitpos */
916 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
917 1.1 skrll 0, /* special_function */
918 1.1 skrll "R_RBAC", /* name */
919 1.1 skrll TRUE, /* partial_inplace */
920 1.1 skrll 0xffffffff, /* src_mask */
921 1.1 skrll 0xffffffff, /* dst_mask */
922 1.1 skrll FALSE), /* pcrel_offset */
923 1.1 skrll
924 1.1 skrll /* Modifiable branch relative. */
925 1.1 skrll HOWTO (R_RBR, /* type */
926 1.1 skrll 0, /* rightshift */
927 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
928 1.1 skrll 26, /* bitsize */
929 1.1 skrll FALSE, /* pc_relative */
930 1.1 skrll 0, /* bitpos */
931 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
932 1.1 skrll 0, /* special_function */
933 1.1 skrll "R_RBR_26", /* name */
934 1.1 skrll TRUE, /* partial_inplace */
935 1.1 skrll 0x03fffffc, /* src_mask */
936 1.1 skrll 0x03fffffc, /* dst_mask */
937 1.1 skrll FALSE), /* pcrel_offset */
938 1.1 skrll
939 1.1 skrll /* Modifiable branch absolute. */
940 1.1 skrll HOWTO (R_RBRC, /* type */
941 1.1 skrll 0, /* rightshift */
942 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
943 1.1 skrll 16, /* bitsize */
944 1.1 skrll FALSE, /* pc_relative */
945 1.1 skrll 0, /* bitpos */
946 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
947 1.1 skrll 0, /* special_function */
948 1.1 skrll "R_RBRC", /* name */
949 1.1 skrll TRUE, /* partial_inplace */
950 1.1 skrll 0xffff, /* src_mask */
951 1.1 skrll 0xffff, /* dst_mask */
952 1.1 skrll FALSE), /* pcrel_offset */
953 1.1 skrll
954 1.1 skrll /* 16 bit Non modifiable absolute branch. */
955 1.1 skrll HOWTO (R_BA, /* type */
956 1.1 skrll 0, /* rightshift */
957 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
958 1.1 skrll 16, /* bitsize */
959 1.1 skrll FALSE, /* pc_relative */
960 1.1 skrll 0, /* bitpos */
961 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
962 1.1 skrll 0, /* special_function */
963 1.1 skrll "R_BA_16", /* name */
964 1.1 skrll TRUE, /* partial_inplace */
965 1.1 skrll 0xfffc, /* src_mask */
966 1.1 skrll 0xfffc, /* dst_mask */
967 1.1 skrll FALSE), /* pcrel_offset */
968 1.1 skrll
969 1.1 skrll /* Modifiable branch relative. */
970 1.1 skrll HOWTO (R_RBR, /* type */
971 1.1 skrll 0, /* rightshift */
972 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
973 1.1 skrll 16, /* bitsize */
974 1.1 skrll FALSE, /* pc_relative */
975 1.1 skrll 0, /* bitpos */
976 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
977 1.1 skrll 0, /* special_function */
978 1.1 skrll "R_RBR_16", /* name */
979 1.1 skrll TRUE, /* partial_inplace */
980 1.1 skrll 0xffff, /* src_mask */
981 1.1 skrll 0xffff, /* dst_mask */
982 1.1 skrll FALSE), /* pcrel_offset */
983 1.1 skrll
984 1.1 skrll /* Modifiable branch relative. */
985 1.1 skrll HOWTO (R_RBA, /* type */
986 1.1 skrll 0, /* rightshift */
987 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
988 1.1 skrll 16, /* bitsize */
989 1.1 skrll FALSE, /* pc_relative */
990 1.1 skrll 0, /* bitpos */
991 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
992 1.1 skrll 0, /* special_function */
993 1.1 skrll "R_RBA_16", /* name */
994 1.1 skrll TRUE, /* partial_inplace */
995 1.1 skrll 0xffff, /* src_mask */
996 1.1 skrll 0xffff, /* dst_mask */
997 1.1 skrll FALSE), /* pcrel_offset */
998 1.1 skrll
999 1.1 skrll };
1000 1.1 skrll
1001 1.1 skrll void
1002 1.1 skrll xcoff_rtype2howto (relent, internal)
1003 1.1 skrll arelent *relent;
1004 1.1 skrll struct internal_reloc *internal;
1005 1.1 skrll {
1006 1.1 skrll if (internal->r_type > R_RBRC)
1007 1.1 skrll abort ();
1008 1.1 skrll
1009 1.1 skrll /* Default howto layout works most of the time */
1010 1.1 skrll relent->howto = &xcoff_howto_table[internal->r_type];
1011 1.1 skrll
1012 1.1 skrll /* Special case some 16 bit reloc */
1013 1.1 skrll if (15 == (internal->r_size & 0x1f))
1014 1.1 skrll {
1015 1.1 skrll if (R_BA == internal->r_type)
1016 1.1 skrll relent->howto = &xcoff_howto_table[0x1c];
1017 1.1 skrll else if (R_RBR == internal->r_type)
1018 1.1 skrll relent->howto = &xcoff_howto_table[0x1d];
1019 1.1 skrll else if (R_RBA == internal->r_type)
1020 1.1 skrll relent->howto = &xcoff_howto_table[0x1e];
1021 1.1 skrll }
1022 1.1 skrll
1023 1.1 skrll /* The r_size field of an XCOFF reloc encodes the bitsize of the
1024 1.1 skrll relocation, as well as indicating whether it is signed or not.
1025 1.1 skrll Doublecheck that the relocation information gathered from the
1026 1.1 skrll type matches this information. The bitsize is not significant
1027 1.1 skrll for R_REF relocs. */
1028 1.1 skrll if (relent->howto->dst_mask != 0
1029 1.1 skrll && (relent->howto->bitsize
1030 1.1 skrll != ((unsigned int) internal->r_size & 0x1f) + 1))
1031 1.1 skrll abort ();
1032 1.1 skrll }
1033 1.1 skrll
1034 1.1 skrll reloc_howto_type *
1035 1.1 skrll _bfd_xcoff_reloc_type_lookup (abfd, code)
1036 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
1037 1.1 skrll bfd_reloc_code_real_type code;
1038 1.1 skrll {
1039 1.1 skrll switch (code)
1040 1.1 skrll {
1041 1.1 skrll case BFD_RELOC_PPC_B26:
1042 1.1 skrll return &xcoff_howto_table[0xa];
1043 1.1 skrll case BFD_RELOC_PPC_BA16:
1044 1.1 skrll return &xcoff_howto_table[0x1c];
1045 1.1 skrll case BFD_RELOC_PPC_BA26:
1046 1.1 skrll return &xcoff_howto_table[8];
1047 1.1 skrll case BFD_RELOC_PPC_TOC16:
1048 1.1 skrll return &xcoff_howto_table[3];
1049 1.1 skrll case BFD_RELOC_32:
1050 1.1 skrll case BFD_RELOC_CTOR:
1051 1.1 skrll return &xcoff_howto_table[0];
1052 1.1 skrll default:
1053 1.1 skrll return NULL;
1054 1.1 skrll }
1055 1.1 skrll }
1056 1.1 skrll
1057 1.1 skrll static reloc_howto_type *
1058 1.1 skrll _bfd_xcoff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1059 1.1 skrll const char *r_name)
1060 1.1 skrll {
1061 1.1 skrll unsigned int i;
1062 1.1 skrll
1063 1.1 skrll for (i = 0;
1064 1.1 skrll i < sizeof (xcoff_howto_table) / sizeof (xcoff_howto_table[0]);
1065 1.1 skrll i++)
1066 1.1 skrll if (xcoff_howto_table[i].name != NULL
1067 1.1 skrll && strcasecmp (xcoff_howto_table[i].name, r_name) == 0)
1068 1.1 skrll return &xcoff_howto_table[i];
1069 1.1 skrll
1070 1.1 skrll return NULL;
1071 1.1 skrll }
1072 1.1 skrll
1073 1.1 skrll /* XCOFF archive support. The original version of this code was by
1075 1.1 skrll Damon A. Permezel. It was enhanced to permit cross support, and
1076 1.1 skrll writing archive files, by Ian Lance Taylor, Cygnus Support.
1077 1.1 skrll
1078 1.1 skrll XCOFF uses its own archive format. Everything is hooked together
1079 1.1 skrll with file offset links, so it is possible to rapidly update an
1080 1.1 skrll archive in place. Of course, we don't do that. An XCOFF archive
1081 1.1 skrll has a real file header, not just an ARMAG string. The structure of
1082 1.1 skrll the file header and of each archive header appear below.
1083 1.1 skrll
1084 1.1 skrll An XCOFF archive also has a member table, which is a list of
1085 1.1 skrll elements in the archive (you can get that by looking through the
1086 1.1 skrll linked list, but you have to read a lot more of the file). The
1087 1.1 skrll member table has a normal archive header with an empty name. It is
1088 1.1 skrll normally (and perhaps must be) the second to last entry in the
1089 1.1 skrll archive. The member table data is almost printable ASCII. It
1090 1.1 skrll starts with a 12 character decimal string which is the number of
1091 1.1 skrll entries in the table. For each entry it has a 12 character decimal
1092 1.1 skrll string which is the offset in the archive of that member. These
1093 1.1 skrll entries are followed by a series of null terminated strings which
1094 1.1 skrll are the member names for each entry.
1095 1.1 skrll
1096 1.1 skrll Finally, an XCOFF archive has a global symbol table, which is what
1097 1.1 skrll we call the armap. The global symbol table has a normal archive
1098 1.1 skrll header with an empty name. It is normally (and perhaps must be)
1099 1.1 skrll the last entry in the archive. The contents start with a four byte
1100 1.1 skrll binary number which is the number of entries. This is followed by
1101 1.1 skrll a that many four byte binary numbers; each is the file offset of an
1102 1.1 skrll entry in the archive. These numbers are followed by a series of
1103 1.1 skrll null terminated strings, which are symbol names.
1104 1.1 skrll
1105 1.1 skrll AIX 4.3 introduced a new archive format which can handle larger
1106 1.1 skrll files and also 32- and 64-bit objects in the same archive. The
1107 1.1 skrll things said above remain true except that there is now more than
1108 1.1 skrll one global symbol table. The one is used to index 32-bit objects,
1109 1.1 skrll the other for 64-bit objects.
1110 1.1 skrll
1111 1.1 skrll The new archives (recognizable by the new ARMAG string) has larger
1112 1.1 skrll field lengths so that we cannot really share any code. Also we have
1113 1.1 skrll to take care that we are not generating the new form of archives
1114 1.1 skrll on AIX 4.2 or earlier systems. */
1115 1.1 skrll
1116 1.1 skrll /* XCOFF archives use this as a magic string. Note that both strings
1117 1.1 skrll have the same length. */
1118 1.1 skrll
1119 1.1 skrll /* Set the magic for archive. */
1120 1.1 skrll
1121 1.1 skrll bfd_boolean
1122 1.1 skrll bfd_xcoff_ar_archive_set_magic (abfd, magic)
1123 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
1124 1.1 skrll char *magic ATTRIBUTE_UNUSED;
1125 1.1 skrll {
1126 1.1 skrll /* Not supported yet. */
1127 1.1 skrll return FALSE;
1128 1.1 skrll /* bfd_xcoff_archive_set_magic (abfd, magic); */
1129 1.1 skrll }
1130 1.1 skrll
1131 1.1 skrll /* Read in the armap of an XCOFF archive. */
1132 1.1 skrll
1133 1.1 skrll bfd_boolean
1134 1.1 skrll _bfd_xcoff_slurp_armap (abfd)
1135 1.1 skrll bfd *abfd;
1136 1.1 skrll {
1137 1.1 skrll file_ptr off;
1138 1.1 skrll size_t namlen;
1139 1.1 skrll bfd_size_type sz;
1140 1.1 skrll bfd_byte *contents, *cend;
1141 1.1 skrll bfd_vma c, i;
1142 1.1 skrll carsym *arsym;
1143 1.1 skrll bfd_byte *p;
1144 1.1 skrll
1145 1.1 skrll if (xcoff_ardata (abfd) == NULL)
1146 1.1 skrll {
1147 1.1 skrll bfd_has_map (abfd) = FALSE;
1148 1.1 skrll return TRUE;
1149 1.1 skrll }
1150 1.1 skrll
1151 1.1 skrll if (! xcoff_big_format_p (abfd))
1152 1.1 skrll {
1153 1.1 skrll /* This is for the old format. */
1154 1.1 skrll struct xcoff_ar_hdr hdr;
1155 1.1 skrll
1156 1.1 skrll off = strtol (xcoff_ardata (abfd)->symoff, (char **) NULL, 10);
1157 1.1 skrll if (off == 0)
1158 1.1 skrll {
1159 1.1 skrll bfd_has_map (abfd) = FALSE;
1160 1.1 skrll return TRUE;
1161 1.1 skrll }
1162 1.1 skrll
1163 1.1 skrll if (bfd_seek (abfd, off, SEEK_SET) != 0)
1164 1.1 skrll return FALSE;
1165 1.1 skrll
1166 1.1 skrll /* The symbol table starts with a normal archive header. */
1167 1.1 skrll if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1168 1.1 skrll != SIZEOF_AR_HDR)
1169 1.1 skrll return FALSE;
1170 1.1 skrll
1171 1.1 skrll /* Skip the name (normally empty). */
1172 1.1 skrll namlen = strtol (hdr.namlen, (char **) NULL, 10);
1173 1.1 skrll off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
1174 1.1 skrll if (bfd_seek (abfd, off, SEEK_CUR) != 0)
1175 1.1 skrll return FALSE;
1176 1.1 skrll
1177 1.1 skrll sz = strtol (hdr.size, (char **) NULL, 10);
1178 1.1 skrll
1179 1.1 skrll /* Read in the entire symbol table. */
1180 1.1 skrll contents = (bfd_byte *) bfd_alloc (abfd, sz);
1181 1.1 skrll if (contents == NULL)
1182 1.1 skrll return FALSE;
1183 1.1 skrll if (bfd_bread ((PTR) contents, sz, abfd) != sz)
1184 1.1 skrll return FALSE;
1185 1.1 skrll
1186 1.1 skrll /* The symbol table starts with a four byte count. */
1187 1.1 skrll c = H_GET_32 (abfd, contents);
1188 1.1 skrll
1189 1.1 skrll if (c * 4 >= sz)
1190 1.1 skrll {
1191 1.1 skrll bfd_set_error (bfd_error_bad_value);
1192 1.1 skrll return FALSE;
1193 1.1 skrll }
1194 1.1 skrll
1195 1.1 skrll bfd_ardata (abfd)->symdefs =
1196 1.1 skrll ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
1197 1.1 skrll if (bfd_ardata (abfd)->symdefs == NULL)
1198 1.1 skrll return FALSE;
1199 1.1 skrll
1200 1.1 skrll /* After the count comes a list of four byte file offsets. */
1201 1.1 skrll for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
1202 1.1 skrll i < c;
1203 1.1 skrll ++i, ++arsym, p += 4)
1204 1.1 skrll arsym->file_offset = H_GET_32 (abfd, p);
1205 1.1 skrll }
1206 1.1 skrll else
1207 1.1 skrll {
1208 1.1 skrll /* This is for the new format. */
1209 1.1 skrll struct xcoff_ar_hdr_big hdr;
1210 1.1 skrll
1211 1.1 skrll off = strtol (xcoff_ardata_big (abfd)->symoff, (char **) NULL, 10);
1212 1.1 skrll if (off == 0)
1213 1.1 skrll {
1214 1.1 skrll bfd_has_map (abfd) = FALSE;
1215 1.1 skrll return TRUE;
1216 1.1 skrll }
1217 1.1 skrll
1218 1.1 skrll if (bfd_seek (abfd, off, SEEK_SET) != 0)
1219 1.1 skrll return FALSE;
1220 1.1 skrll
1221 1.1 skrll /* The symbol table starts with a normal archive header. */
1222 1.1 skrll if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1223 1.1 skrll != SIZEOF_AR_HDR_BIG)
1224 1.1 skrll return FALSE;
1225 1.1 skrll
1226 1.1 skrll /* Skip the name (normally empty). */
1227 1.1 skrll namlen = strtol (hdr.namlen, (char **) NULL, 10);
1228 1.1 skrll off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
1229 1.1 skrll if (bfd_seek (abfd, off, SEEK_CUR) != 0)
1230 1.1 skrll return FALSE;
1231 1.1 skrll
1232 1.1 skrll /* XXX This actually has to be a call to strtoll (at least on 32-bit
1233 1.1 skrll machines) since the field width is 20 and there numbers with more
1234 1.1 skrll than 32 bits can be represented. */
1235 1.1 skrll sz = strtol (hdr.size, (char **) NULL, 10);
1236 1.1 skrll
1237 1.1 skrll /* Read in the entire symbol table. */
1238 1.1 skrll contents = (bfd_byte *) bfd_alloc (abfd, sz);
1239 1.1 skrll if (contents == NULL)
1240 1.1 skrll return FALSE;
1241 1.1 skrll if (bfd_bread ((PTR) contents, sz, abfd) != sz)
1242 1.1 skrll return FALSE;
1243 1.1 skrll
1244 1.1 skrll /* The symbol table starts with an eight byte count. */
1245 1.1 skrll c = H_GET_64 (abfd, contents);
1246 1.1 skrll
1247 1.1 skrll if (c * 8 >= sz)
1248 1.1 skrll {
1249 1.1 skrll bfd_set_error (bfd_error_bad_value);
1250 1.1 skrll return FALSE;
1251 1.1 skrll }
1252 1.1 skrll
1253 1.1 skrll bfd_ardata (abfd)->symdefs =
1254 1.1 skrll ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
1255 1.1 skrll if (bfd_ardata (abfd)->symdefs == NULL)
1256 1.1 skrll return FALSE;
1257 1.1 skrll
1258 1.1 skrll /* After the count comes a list of eight byte file offsets. */
1259 1.1 skrll for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
1260 1.1 skrll i < c;
1261 1.1 skrll ++i, ++arsym, p += 8)
1262 1.1 skrll arsym->file_offset = H_GET_64 (abfd, p);
1263 1.1 skrll }
1264 1.1 skrll
1265 1.1 skrll /* After the file offsets come null terminated symbol names. */
1266 1.1 skrll cend = contents + sz;
1267 1.1 skrll for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
1268 1.1 skrll i < c;
1269 1.1 skrll ++i, ++arsym, p += strlen ((char *) p) + 1)
1270 1.1 skrll {
1271 1.1 skrll if (p >= cend)
1272 1.1 skrll {
1273 1.1 skrll bfd_set_error (bfd_error_bad_value);
1274 1.1 skrll return FALSE;
1275 1.1 skrll }
1276 1.1 skrll arsym->name = (char *) p;
1277 1.1 skrll }
1278 1.1 skrll
1279 1.1 skrll bfd_ardata (abfd)->symdef_count = c;
1280 1.1 skrll bfd_has_map (abfd) = TRUE;
1281 1.1 skrll
1282 1.1 skrll return TRUE;
1283 1.1 skrll }
1284 1.1 skrll
1285 1.1 skrll /* See if this is an XCOFF archive. */
1286 1.1 skrll
1287 1.1 skrll const bfd_target *
1288 1.1 skrll _bfd_xcoff_archive_p (abfd)
1289 1.1 skrll bfd *abfd;
1290 1.1 skrll {
1291 1.1 skrll struct artdata *tdata_hold;
1292 1.1 skrll char magic[SXCOFFARMAG];
1293 1.1 skrll bfd_size_type amt = SXCOFFARMAG;
1294 1.1 skrll
1295 1.1 skrll if (bfd_bread ((PTR) magic, amt, abfd) != amt)
1296 1.1 skrll {
1297 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
1298 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1299 1.1 skrll return NULL;
1300 1.1 skrll }
1301 1.1 skrll
1302 1.1 skrll if (strncmp (magic, XCOFFARMAG, SXCOFFARMAG) != 0
1303 1.1 skrll && strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
1304 1.1 skrll {
1305 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1306 1.1 skrll return NULL;
1307 1.1 skrll }
1308 1.1 skrll
1309 1.1 skrll tdata_hold = bfd_ardata (abfd);
1310 1.1 skrll
1311 1.1 skrll amt = sizeof (struct artdata);
1312 1.1 skrll bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
1313 1.1 skrll if (bfd_ardata (abfd) == (struct artdata *) NULL)
1314 1.1 skrll goto error_ret_restore;
1315 1.1 skrll
1316 1.1 skrll /* Cleared by bfd_zalloc above.
1317 1.1 skrll bfd_ardata (abfd)->cache = NULL;
1318 1.1 skrll bfd_ardata (abfd)->archive_head = NULL;
1319 1.1 skrll bfd_ardata (abfd)->symdefs = NULL;
1320 1.1 skrll bfd_ardata (abfd)->extended_names = NULL;
1321 1.1 skrll bfd_ardata (abfd)->extended_names_size = 0; */
1322 1.1 skrll
1323 1.1 skrll /* Now handle the two formats. */
1324 1.1 skrll if (magic[1] != 'b')
1325 1.1 skrll {
1326 1.1 skrll /* This is the old format. */
1327 1.1 skrll struct xcoff_ar_file_hdr hdr;
1328 1.1 skrll
1329 1.1 skrll /* Copy over the magic string. */
1330 1.1 skrll memcpy (hdr.magic, magic, SXCOFFARMAG);
1331 1.1 skrll
1332 1.1 skrll /* Now read the rest of the file header. */
1333 1.1 skrll amt = SIZEOF_AR_FILE_HDR - SXCOFFARMAG;
1334 1.1 skrll if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
1335 1.1 skrll {
1336 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
1337 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1338 1.1 skrll goto error_ret;
1339 1.1 skrll }
1340 1.1 skrll
1341 1.1 skrll bfd_ardata (abfd)->first_file_filepos = strtol (hdr.firstmemoff,
1342 1.1 skrll (char **) NULL, 10);
1343 1.1 skrll
1344 1.1 skrll amt = SIZEOF_AR_FILE_HDR;
1345 1.1 skrll bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1346 1.1 skrll if (bfd_ardata (abfd)->tdata == NULL)
1347 1.1 skrll goto error_ret;
1348 1.1 skrll
1349 1.1 skrll memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR);
1350 1.1 skrll }
1351 1.1 skrll else
1352 1.1 skrll {
1353 1.1 skrll /* This is the new format. */
1354 1.1 skrll struct xcoff_ar_file_hdr_big hdr;
1355 1.1 skrll
1356 1.1 skrll /* Copy over the magic string. */
1357 1.1 skrll memcpy (hdr.magic, magic, SXCOFFARMAG);
1358 1.1 skrll
1359 1.1 skrll /* Now read the rest of the file header. */
1360 1.1 skrll amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
1361 1.1 skrll if (bfd_bread ((PTR) &hdr.memoff, amt, abfd) != amt)
1362 1.1 skrll {
1363 1.1 skrll if (bfd_get_error () != bfd_error_system_call)
1364 1.1 skrll bfd_set_error (bfd_error_wrong_format);
1365 1.1 skrll goto error_ret;
1366 1.1 skrll }
1367 1.1 skrll
1368 1.1 skrll bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
1369 1.1 skrll (const char **) 0,
1370 1.1 skrll 10);
1371 1.1 skrll
1372 1.1 skrll amt = SIZEOF_AR_FILE_HDR_BIG;
1373 1.1 skrll bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1374 1.1 skrll if (bfd_ardata (abfd)->tdata == NULL)
1375 1.1 skrll goto error_ret;
1376 1.1 skrll
1377 1.1 skrll memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR_BIG);
1378 1.1 skrll }
1379 1.1 skrll
1380 1.1 skrll if (! _bfd_xcoff_slurp_armap (abfd))
1381 1.1 skrll {
1382 1.1 skrll error_ret:
1383 1.1 skrll bfd_release (abfd, bfd_ardata (abfd));
1384 1.1 skrll error_ret_restore:
1385 1.1 skrll bfd_ardata (abfd) = tdata_hold;
1386 1.1 skrll return NULL;
1387 1.1 skrll }
1388 1.1 skrll
1389 1.1 skrll return abfd->xvec;
1390 1.1 skrll }
1391 1.1 skrll
1392 1.1 skrll /* Read the archive header in an XCOFF archive. */
1393 1.1 skrll
1394 1.1 skrll PTR
1395 1.1 skrll _bfd_xcoff_read_ar_hdr (abfd)
1396 1.1 skrll bfd *abfd;
1397 1.1 skrll {
1398 1.1 skrll bfd_size_type namlen;
1399 1.1 skrll struct areltdata *ret;
1400 1.1 skrll bfd_size_type amt = sizeof (struct areltdata);
1401 1.1 skrll
1402 1.1 skrll ret = (struct areltdata *) bfd_alloc (abfd, amt);
1403 1.1 skrll if (ret == NULL)
1404 1.1 skrll return NULL;
1405 1.1 skrll
1406 1.1 skrll if (! xcoff_big_format_p (abfd))
1407 1.1 skrll {
1408 1.1 skrll struct xcoff_ar_hdr hdr;
1409 1.1 skrll struct xcoff_ar_hdr *hdrp;
1410 1.1 skrll
1411 1.1 skrll if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1412 1.1 skrll != SIZEOF_AR_HDR)
1413 1.1 skrll {
1414 1.1 skrll free (ret);
1415 1.1 skrll return NULL;
1416 1.1 skrll }
1417 1.1 skrll
1418 1.1 skrll namlen = strtol (hdr.namlen, (char **) NULL, 10);
1419 1.1 skrll amt = SIZEOF_AR_HDR + namlen + 1;
1420 1.1 skrll hdrp = (struct xcoff_ar_hdr *) bfd_alloc (abfd, amt);
1421 1.1 skrll if (hdrp == NULL)
1422 1.1 skrll {
1423 1.1 skrll free (ret);
1424 1.1 skrll return NULL;
1425 1.1 skrll }
1426 1.1 skrll memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
1427 1.1 skrll if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR, namlen, abfd) != namlen)
1428 1.1 skrll {
1429 1.1 skrll free (ret);
1430 1.1 skrll return NULL;
1431 1.1 skrll }
1432 1.1 skrll ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0';
1433 1.1 skrll
1434 1.1 skrll ret->arch_header = (char *) hdrp;
1435 1.1 skrll ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
1436 1.1 skrll ret->filename = (char *) hdrp + SIZEOF_AR_HDR;
1437 1.1 skrll }
1438 1.1 skrll else
1439 1.1 skrll {
1440 1.1 skrll struct xcoff_ar_hdr_big hdr;
1441 1.1 skrll struct xcoff_ar_hdr_big *hdrp;
1442 1.1 skrll
1443 1.1 skrll if (bfd_bread ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1444 1.1 skrll != SIZEOF_AR_HDR_BIG)
1445 1.1 skrll {
1446 1.1 skrll free (ret);
1447 1.1 skrll return NULL;
1448 1.1 skrll }
1449 1.1 skrll
1450 1.1 skrll namlen = strtol (hdr.namlen, (char **) NULL, 10);
1451 1.1 skrll amt = SIZEOF_AR_HDR_BIG + namlen + 1;
1452 1.1 skrll hdrp = (struct xcoff_ar_hdr_big *) bfd_alloc (abfd, amt);
1453 1.1 skrll if (hdrp == NULL)
1454 1.1 skrll {
1455 1.1 skrll free (ret);
1456 1.1 skrll return NULL;
1457 1.1 skrll }
1458 1.1 skrll memcpy (hdrp, &hdr, SIZEOF_AR_HDR_BIG);
1459 1.1 skrll if (bfd_bread ((char *) hdrp + SIZEOF_AR_HDR_BIG, namlen, abfd) != namlen)
1460 1.1 skrll {
1461 1.1 skrll free (ret);
1462 1.1 skrll return NULL;
1463 1.1 skrll }
1464 1.1 skrll ((char *) hdrp)[SIZEOF_AR_HDR_BIG + namlen] = '\0';
1465 1.1 skrll
1466 1.1 skrll ret->arch_header = (char *) hdrp;
1467 1.1 skrll /* XXX This actually has to be a call to strtoll (at least on 32-bit
1468 1.1 skrll machines) since the field width is 20 and there numbers with more
1469 1.1 skrll than 32 bits can be represented. */
1470 1.1 skrll ret->parsed_size = strtol (hdr.size, (char **) NULL, 10);
1471 1.1 skrll ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
1472 1.1 skrll }
1473 1.1 skrll
1474 1.1 skrll /* Skip over the XCOFFARFMAG at the end of the file name. */
1475 1.1 skrll if (bfd_seek (abfd, (file_ptr) ((namlen & 1) + SXCOFFARFMAG), SEEK_CUR) != 0)
1476 1.1 skrll return NULL;
1477 1.1 skrll
1478 1.1 skrll return (PTR) ret;
1479 1.1 skrll }
1480 1.1 skrll
1481 1.1 skrll /* Open the next element in an XCOFF archive. */
1482 1.1 skrll
1483 1.1 skrll bfd *
1484 1.1 skrll _bfd_xcoff_openr_next_archived_file (archive, last_file)
1485 1.1 skrll bfd *archive;
1486 1.1 skrll bfd *last_file;
1487 1.1 skrll {
1488 1.1 skrll file_ptr filestart;
1489 1.1 skrll
1490 1.1 skrll if (xcoff_ardata (archive) == NULL)
1491 1.1 skrll {
1492 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
1493 1.1 skrll return NULL;
1494 1.1 skrll }
1495 1.1 skrll
1496 1.1 skrll if (! xcoff_big_format_p (archive))
1497 1.1 skrll {
1498 1.1 skrll if (last_file == NULL)
1499 1.1 skrll filestart = bfd_ardata (archive)->first_file_filepos;
1500 1.1 skrll else
1501 1.1 skrll filestart = strtol (arch_xhdr (last_file)->nextoff, (char **) NULL,
1502 1.1 skrll 10);
1503 1.1 skrll
1504 1.1 skrll if (filestart == 0
1505 1.1 skrll || filestart == strtol (xcoff_ardata (archive)->memoff,
1506 1.1 skrll (char **) NULL, 10)
1507 1.1 skrll || filestart == strtol (xcoff_ardata (archive)->symoff,
1508 1.1 skrll (char **) NULL, 10))
1509 1.1 skrll {
1510 1.1 skrll bfd_set_error (bfd_error_no_more_archived_files);
1511 1.1 skrll return NULL;
1512 1.1 skrll }
1513 1.1 skrll }
1514 1.1 skrll else
1515 1.1 skrll {
1516 1.1 skrll if (last_file == NULL)
1517 1.1 skrll filestart = bfd_ardata (archive)->first_file_filepos;
1518 1.1 skrll else
1519 1.1 skrll /* XXX These actually have to be a calls to strtoll (at least
1520 1.1 skrll on 32-bit machines) since the fields's width is 20 and
1521 1.1 skrll there numbers with more than 32 bits can be represented. */
1522 1.1 skrll filestart = strtol (arch_xhdr_big (last_file)->nextoff, (char **) NULL,
1523 1.1 skrll 10);
1524 1.1 skrll
1525 1.1 skrll /* XXX These actually have to be calls to strtoll (at least on 32-bit
1526 1.1 skrll machines) since the fields's width is 20 and there numbers with more
1527 1.1 skrll than 32 bits can be represented. */
1528 1.1 skrll if (filestart == 0
1529 1.1 skrll || filestart == strtol (xcoff_ardata_big (archive)->memoff,
1530 1.1 skrll (char **) NULL, 10)
1531 1.1 skrll || filestart == strtol (xcoff_ardata_big (archive)->symoff,
1532 1.1 skrll (char **) NULL, 10))
1533 1.1 skrll {
1534 1.1 skrll bfd_set_error (bfd_error_no_more_archived_files);
1535 1.1 skrll return NULL;
1536 1.1 skrll }
1537 1.1 skrll }
1538 1.1 skrll
1539 1.1 skrll return _bfd_get_elt_at_filepos (archive, filestart);
1540 1.1 skrll }
1541 1.1 skrll
1542 1.1 skrll /* Stat an element in an XCOFF archive. */
1543 1.1 skrll
1544 1.1 skrll int
1545 1.1 skrll _bfd_xcoff_stat_arch_elt (abfd, s)
1546 1.1 skrll bfd *abfd;
1547 1.1 skrll struct stat *s;
1548 1.1 skrll {
1549 1.1 skrll if (abfd->arelt_data == NULL)
1550 1.1 skrll {
1551 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
1552 1.1 skrll return -1;
1553 1.1 skrll }
1554 1.1 skrll
1555 1.1 skrll if (! xcoff_big_format_p (abfd->my_archive))
1556 1.1 skrll {
1557 1.1 skrll struct xcoff_ar_hdr *hdrp = arch_xhdr (abfd);
1558 1.1 skrll
1559 1.1 skrll s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
1560 1.1 skrll s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
1561 1.1 skrll s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
1562 1.1 skrll s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
1563 1.1 skrll s->st_size = arch_eltdata (abfd)->parsed_size;
1564 1.1 skrll }
1565 1.1 skrll else
1566 1.1 skrll {
1567 1.1 skrll struct xcoff_ar_hdr_big *hdrp = arch_xhdr_big (abfd);
1568 1.1 skrll
1569 1.1 skrll s->st_mtime = strtol (hdrp->date, (char **) NULL, 10);
1570 1.1 skrll s->st_uid = strtol (hdrp->uid, (char **) NULL, 10);
1571 1.1 skrll s->st_gid = strtol (hdrp->gid, (char **) NULL, 10);
1572 1.1 skrll s->st_mode = strtol (hdrp->mode, (char **) NULL, 8);
1573 1.1 skrll s->st_size = arch_eltdata (abfd)->parsed_size;
1574 1.1 skrll }
1575 1.1 skrll
1576 1.1 skrll return 0;
1577 1.1 skrll }
1578 1.1 skrll
1579 1.1 skrll /* Normalize a file name for inclusion in an archive. */
1580 1.1 skrll
1581 1.1 skrll static const char *
1582 1.1 skrll normalize_filename (abfd)
1583 1.1 skrll bfd *abfd;
1584 1.1 skrll {
1585 1.1 skrll const char *file;
1586 1.1 skrll const char *filename;
1587 1.1 skrll
1588 1.1 skrll file = bfd_get_filename (abfd);
1589 1.1 skrll filename = strrchr (file, '/');
1590 1.1 skrll if (filename != NULL)
1591 1.1 skrll filename++;
1592 1.1 skrll else
1593 1.1 skrll filename = file;
1594 1.1 skrll return filename;
1595 1.1 skrll }
1596 1.1 skrll
1597 1.1 skrll /* Write out an XCOFF armap. */
1598 1.1 skrll
1599 1.1 skrll static bfd_boolean
1600 1.1 skrll xcoff_write_armap_old (abfd, elength, map, orl_count, stridx)
1601 1.1 skrll bfd *abfd;
1602 1.1 skrll unsigned int elength ATTRIBUTE_UNUSED;
1603 1.1 skrll struct orl *map;
1604 1.1 skrll unsigned int orl_count;
1605 1.1 skrll int stridx;
1606 1.1 skrll {
1607 1.1 skrll struct xcoff_ar_hdr hdr;
1608 1.1 skrll char *p;
1609 1.1 skrll unsigned char buf[4];
1610 1.1 skrll bfd *sub;
1611 1.1 skrll file_ptr fileoff;
1612 1.1 skrll unsigned int i;
1613 1.1 skrll
1614 1.1 skrll memset (&hdr, 0, sizeof hdr);
1615 1.1 skrll sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
1616 1.1 skrll sprintf (hdr.nextoff, "%d", 0);
1617 1.1 skrll memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, XCOFFARMAG_ELEMENT_SIZE);
1618 1.1 skrll sprintf (hdr.date, "%d", 0);
1619 1.1 skrll sprintf (hdr.uid, "%d", 0);
1620 1.1 skrll sprintf (hdr.gid, "%d", 0);
1621 1.1 skrll sprintf (hdr.mode, "%d", 0);
1622 1.1 skrll sprintf (hdr.namlen, "%d", 0);
1623 1.1 skrll
1624 1.1 skrll /* We need spaces, not null bytes, in the header. */
1625 1.1 skrll for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++)
1626 1.1 skrll if (*p == '\0')
1627 1.1 skrll *p = ' ';
1628 1.1 skrll
1629 1.1 skrll if (bfd_bwrite ((PTR) &hdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
1630 1.1 skrll != SIZEOF_AR_HDR
1631 1.1 skrll || (bfd_bwrite (XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
1632 1.1 skrll != SXCOFFARFMAG))
1633 1.1 skrll return FALSE;
1634 1.1 skrll
1635 1.1 skrll H_PUT_32 (abfd, orl_count, buf);
1636 1.1 skrll if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
1637 1.1 skrll return FALSE;
1638 1.1 skrll
1639 1.1 skrll sub = abfd->archive_head;
1640 1.1 skrll fileoff = SIZEOF_AR_FILE_HDR;
1641 1.1 skrll i = 0;
1642 1.1 skrll while (sub != NULL && i < orl_count)
1643 1.1 skrll {
1644 1.1 skrll size_t namlen;
1645 1.1 skrll
1646 1.1 skrll while (map[i].u.abfd == sub)
1647 1.1 skrll {
1648 1.1 skrll H_PUT_32 (abfd, fileoff, buf);
1649 1.1 skrll if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
1650 1.1 skrll return FALSE;
1651 1.1 skrll ++i;
1652 1.1 skrll }
1653 1.1 skrll namlen = strlen (normalize_filename (sub));
1654 1.1 skrll namlen = (namlen + 1) &~ (size_t) 1;
1655 1.1 skrll fileoff += (SIZEOF_AR_HDR
1656 1.1 skrll + namlen
1657 1.1 skrll + SXCOFFARFMAG
1658 1.1 skrll + arelt_size (sub));
1659 1.1 skrll fileoff = (fileoff + 1) &~ 1;
1660 1.1 skrll sub = sub->archive_next;
1661 1.1 skrll }
1662 1.1 skrll
1663 1.1 skrll for (i = 0; i < orl_count; i++)
1664 1.1 skrll {
1665 1.1 skrll const char *name;
1666 1.1 skrll size_t namlen;
1667 1.1 skrll
1668 1.1 skrll name = *map[i].name;
1669 1.1 skrll namlen = strlen (name);
1670 1.1 skrll if (bfd_bwrite (name, (bfd_size_type) (namlen + 1), abfd) != namlen + 1)
1671 1.1 skrll return FALSE;
1672 1.1 skrll }
1673 1.1 skrll
1674 1.1 skrll if ((stridx & 1) != 0)
1675 1.1 skrll {
1676 1.1 skrll char b;
1677 1.1 skrll
1678 1.1 skrll b = '\0';
1679 1.1 skrll if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
1680 1.1 skrll return FALSE;
1681 1.1 skrll }
1682 1.1 skrll
1683 1.1 skrll return TRUE;
1684 1.1 skrll }
1685 1.1 skrll
1686 1.1 skrll static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
1687 1.1 skrll #define FMT20 "%-20lld"
1688 1.1 skrll #define FMT12 "%-12d"
1689 1.1 skrll #define FMT12_OCTAL "%-12o"
1690 1.1 skrll #define FMT4 "%-4d"
1691 1.1 skrll #define PRINT20(d, v) \
1692 1.1 skrll sprintf (buff20, FMT20, (long long)(v)), \
1693 1.1 skrll memcpy ((void *) (d), buff20, 20)
1694 1.1 skrll
1695 1.1 skrll #define PRINT12(d, v) \
1696 1.1 skrll sprintf (buff20, FMT12, (int)(v)), \
1697 1.1 skrll memcpy ((void *) (d), buff20, 12)
1698 1.1 skrll
1699 1.1 skrll #define PRINT12_OCTAL(d, v) \
1700 1.1 skrll sprintf (buff20, FMT12_OCTAL, (unsigned int)(v)), \
1701 1.1 skrll memcpy ((void *) (d), buff20, 12)
1702 1.1 skrll
1703 1.1 skrll #define PRINT4(d, v) \
1704 1.1 skrll sprintf (buff20, FMT4, (int)(v)), \
1705 1.1 skrll memcpy ((void *) (d), buff20, 4)
1706 1.1 skrll
1707 1.1 skrll #define READ20(d, v) \
1708 1.1 skrll buff20[20] = 0, \
1709 1.1 skrll memcpy (buff20, (d), 20), \
1710 1.1 skrll (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)
1711 1.1 skrll
1712 1.1 skrll static bfd_boolean
1713 1.1 skrll do_pad (abfd, number)
1714 1.1 skrll bfd *abfd;
1715 1.1 skrll unsigned int number;
1716 1.1 skrll {
1717 1.1 skrll bfd_byte b = 0;
1718 1.1 skrll
1719 1.1 skrll /* Limit pad to <= 4096. */
1720 1.1 skrll if (number > 4096)
1721 1.1 skrll return FALSE;
1722 1.1 skrll
1723 1.1 skrll while (number--)
1724 1.1 skrll if (bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
1725 1.1 skrll return FALSE;
1726 1.1 skrll
1727 1.1 skrll return TRUE;
1728 1.1 skrll }
1729 1.1 skrll
1730 1.1 skrll static bfd_boolean
1731 1.1 skrll do_copy (out_bfd, in_bfd)
1732 1.1 skrll bfd *out_bfd;
1733 1.1 skrll bfd *in_bfd;
1734 1.1 skrll {
1735 1.1 skrll bfd_size_type remaining;
1736 1.1 skrll bfd_byte buffer[DEFAULT_BUFFERSIZE];
1737 1.1 skrll
1738 1.1 skrll if (bfd_seek (in_bfd, (file_ptr) 0, SEEK_SET) != 0)
1739 1.1 skrll return FALSE;
1740 1.1 skrll
1741 1.1 skrll remaining = arelt_size (in_bfd);
1742 1.1 skrll
1743 1.1 skrll while (remaining >= DEFAULT_BUFFERSIZE)
1744 1.1 skrll {
1745 1.1 skrll if (bfd_bread (buffer, DEFAULT_BUFFERSIZE, in_bfd) != DEFAULT_BUFFERSIZE
1746 1.1 skrll || bfd_bwrite (buffer, DEFAULT_BUFFERSIZE, out_bfd) != DEFAULT_BUFFERSIZE)
1747 1.1 skrll return FALSE;
1748 1.1 skrll
1749 1.1 skrll remaining -= DEFAULT_BUFFERSIZE;
1750 1.1 skrll }
1751 1.1 skrll
1752 1.1 skrll if (remaining)
1753 1.1 skrll {
1754 1.1 skrll if (bfd_bread (buffer, remaining, in_bfd) != remaining
1755 1.1 skrll || bfd_bwrite (buffer, remaining, out_bfd) != remaining)
1756 1.1 skrll return FALSE;
1757 1.1 skrll }
1758 1.1 skrll
1759 1.1 skrll return TRUE;
1760 1.1 skrll }
1761 1.1 skrll
1762 1.1 skrll static bfd_boolean
1763 1.1 skrll do_shared_object_padding (out_bfd, in_bfd, offset, ar_header_size)
1764 1.1 skrll bfd *out_bfd;
1765 1.1 skrll bfd *in_bfd;
1766 1.1 skrll file_ptr *offset;
1767 1.1 skrll int ar_header_size;
1768 1.1 skrll {
1769 1.1 skrll if (bfd_check_format (in_bfd, bfd_object)
1770 1.1 skrll && bfd_get_flavour (in_bfd) == bfd_target_xcoff_flavour
1771 1.1 skrll && (in_bfd->flags & DYNAMIC) != 0)
1772 1.1 skrll {
1773 1.1 skrll bfd_size_type pad = 0;
1774 1.1 skrll int text_align_power;
1775 1.1 skrll
1776 1.1 skrll text_align_power = bfd_xcoff_text_align_power (in_bfd);
1777 1.1 skrll
1778 1.1 skrll pad = 1 << text_align_power;
1779 1.1 skrll pad -= (*offset + ar_header_size) & (pad - 1);
1780 1.1 skrll
1781 1.1 skrll if (! do_pad (out_bfd, pad))
1782 1.1 skrll return FALSE;
1783 1.1 skrll
1784 1.1 skrll *offset += pad;
1785 1.1 skrll }
1786 1.1 skrll
1787 1.1 skrll return TRUE;
1788 1.1 skrll }
1789 1.1 skrll
1790 1.1 skrll static bfd_boolean
1791 1.1 skrll xcoff_write_armap_big (abfd, elength, map, orl_count, stridx)
1792 1.1 skrll bfd *abfd;
1793 1.1 skrll unsigned int elength ATTRIBUTE_UNUSED;
1794 1.1 skrll struct orl *map;
1795 1.1 skrll unsigned int orl_count;
1796 1.1 skrll int stridx;
1797 1.1 skrll {
1798 1.1 skrll struct xcoff_ar_file_hdr_big *fhdr;
1799 1.1 skrll bfd_vma i, sym_32, sym_64, str_32, str_64;
1800 1.1 skrll const bfd_arch_info_type *arch_info = NULL;
1801 1.1 skrll bfd *current_bfd;
1802 1.1 skrll size_t string_length;
1803 1.1 skrll file_ptr nextoff, prevoff;
1804 1.1 skrll
1805 1.1 skrll /* First, we look through the symbols and work out which are
1806 1.1 skrll from 32-bit objects and which from 64-bit ones. */
1807 1.1 skrll sym_32 = sym_64 = str_32 = str_64 = 0;
1808 1.1 skrll
1809 1.1 skrll current_bfd = abfd->archive_head;
1810 1.1 skrll if (current_bfd != NULL)
1811 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
1812 1.1 skrll i = 0;
1813 1.1 skrll while (current_bfd != NULL && i < orl_count)
1814 1.1 skrll {
1815 1.1 skrll while (map[i].u.abfd == current_bfd)
1816 1.1 skrll {
1817 1.1 skrll string_length = strlen (*map[i].name) + 1;
1818 1.1 skrll
1819 1.1 skrll if (arch_info->bits_per_address == 64)
1820 1.1 skrll {
1821 1.1 skrll sym_64++;
1822 1.1 skrll str_64 += string_length;
1823 1.1 skrll }
1824 1.1 skrll else
1825 1.1 skrll {
1826 1.1 skrll sym_32++;
1827 1.1 skrll str_32 += string_length;
1828 1.1 skrll }
1829 1.1 skrll i++;
1830 1.1 skrll }
1831 1.1 skrll current_bfd = current_bfd->archive_next;
1832 1.1 skrll if (current_bfd != NULL)
1833 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
1834 1.1 skrll }
1835 1.1 skrll
1836 1.1 skrll /* A quick sanity check... */
1837 1.1 skrll BFD_ASSERT (sym_64 + sym_32 == orl_count);
1838 1.1 skrll /* Explicit cast to int for compiler. */
1839 1.1 skrll BFD_ASSERT ((int)(str_64 + str_32) == stridx);
1840 1.1 skrll
1841 1.1 skrll fhdr = xcoff_ardata_big (abfd);
1842 1.1 skrll
1843 1.1 skrll /* xcoff_write_archive_contents_big passes nextoff in symoff. */
1844 1.1 skrll READ20 (fhdr->memoff, prevoff);
1845 1.1 skrll READ20 (fhdr->symoff, nextoff);
1846 1.1 skrll
1847 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
1848 1.1 skrll
1849 1.1 skrll /* Write out the symbol table.
1850 1.1 skrll Layout :
1851 1.1 skrll
1852 1.1 skrll standard big archive header
1853 1.1 skrll 0x0000 ar_size [0x14]
1854 1.1 skrll 0x0014 ar_nxtmem [0x14]
1855 1.1 skrll 0x0028 ar_prvmem [0x14]
1856 1.1 skrll 0x003C ar_date [0x0C]
1857 1.1 skrll 0x0048 ar_uid [0x0C]
1858 1.1 skrll 0x0054 ar_gid [0x0C]
1859 1.1 skrll 0x0060 ar_mod [0x0C]
1860 1.1 skrll 0x006C ar_namelen[0x04]
1861 1.1 skrll 0x0070 ar_fmag [SXCOFFARFMAG]
1862 1.1 skrll
1863 1.1 skrll Symbol table
1864 1.1 skrll 0x0072 num_syms [0x08], binary
1865 1.1 skrll 0x0078 offsets [0x08 * num_syms], binary
1866 1.1 skrll 0x0086 + 0x08 * num_syms names [??]
1867 1.1 skrll ?? pad to even bytes.
1868 1.1 skrll */
1869 1.1 skrll
1870 1.1 skrll if (sym_32)
1871 1.1 skrll {
1872 1.1 skrll struct xcoff_ar_hdr_big *hdr;
1873 1.1 skrll char *symbol_table;
1874 1.1 skrll char *st;
1875 1.1 skrll file_ptr fileoff;
1876 1.1 skrll
1877 1.1 skrll bfd_vma symbol_table_size =
1878 1.1 skrll SIZEOF_AR_HDR_BIG
1879 1.1 skrll + SXCOFFARFMAG
1880 1.1 skrll + 8
1881 1.1 skrll + 8 * sym_32
1882 1.1 skrll + str_32 + (str_32 & 1);
1883 1.1 skrll
1884 1.1 skrll symbol_table = bfd_zmalloc (symbol_table_size);
1885 1.1 skrll if (symbol_table == NULL)
1886 1.1 skrll return FALSE;
1887 1.1 skrll
1888 1.1 skrll hdr = (struct xcoff_ar_hdr_big *) symbol_table;
1889 1.1 skrll
1890 1.1 skrll PRINT20 (hdr->size, 8 + 8 * sym_32 + str_32 + (str_32 & 1));
1891 1.1 skrll
1892 1.1 skrll if (sym_64)
1893 1.1 skrll PRINT20 (hdr->nextoff, nextoff + symbol_table_size);
1894 1.1 skrll else
1895 1.1 skrll PRINT20 (hdr->nextoff, 0);
1896 1.1 skrll
1897 1.1 skrll PRINT20 (hdr->prevoff, prevoff);
1898 1.1 skrll PRINT12 (hdr->date, 0);
1899 1.1 skrll PRINT12 (hdr->uid, 0);
1900 1.1 skrll PRINT12 (hdr->gid, 0);
1901 1.1 skrll PRINT12 (hdr->mode, 0);
1902 1.1 skrll PRINT4 (hdr->namlen, 0) ;
1903 1.1 skrll
1904 1.1 skrll st = symbol_table + SIZEOF_AR_HDR_BIG;
1905 1.1 skrll memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
1906 1.1 skrll st += SXCOFFARFMAG;
1907 1.1 skrll
1908 1.1 skrll bfd_h_put_64 (abfd, sym_32, st);
1909 1.1 skrll st += 8;
1910 1.1 skrll
1911 1.1 skrll /* loop over the 32 bit offsets */
1912 1.1 skrll current_bfd = abfd->archive_head;
1913 1.1 skrll if (current_bfd != NULL)
1914 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
1915 1.1 skrll fileoff = SIZEOF_AR_FILE_HDR_BIG;
1916 1.1 skrll i = 0;
1917 1.1 skrll while (current_bfd != NULL && i < orl_count)
1918 1.1 skrll {
1919 1.1 skrll while (map[i].u.abfd == current_bfd)
1920 1.1 skrll {
1921 1.1 skrll if (arch_info->bits_per_address == 32)
1922 1.1 skrll {
1923 1.1 skrll bfd_h_put_64 (abfd, fileoff, st);
1924 1.1 skrll st += 8;
1925 1.1 skrll }
1926 1.1 skrll i++;
1927 1.1 skrll }
1928 1.1 skrll string_length = strlen (normalize_filename (current_bfd));
1929 1.1 skrll string_length += string_length & 1;
1930 1.1 skrll fileoff += (SIZEOF_AR_HDR_BIG
1931 1.1 skrll + string_length
1932 1.1 skrll + SXCOFFARFMAG
1933 1.1 skrll + arelt_size (current_bfd));
1934 1.1 skrll fileoff += fileoff & 1;
1935 1.1 skrll current_bfd = current_bfd->archive_next;
1936 1.1 skrll if (current_bfd != NULL)
1937 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
1938 1.1 skrll }
1939 1.1 skrll
1940 1.1 skrll /* loop over the 32 bit symbol names */
1941 1.1 skrll current_bfd = abfd->archive_head;
1942 1.1 skrll if (current_bfd != NULL)
1943 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
1944 1.1 skrll i = 0;
1945 1.1 skrll while (current_bfd != NULL && i < orl_count)
1946 1.1 skrll {
1947 1.1 skrll while (map[i].u.abfd == current_bfd)
1948 1.1 skrll {
1949 1.1 skrll if (arch_info->bits_per_address == 32)
1950 1.1 skrll {
1951 1.1 skrll string_length = sprintf (st, "%s", *map[i].name);
1952 1.1 skrll st += string_length + 1;
1953 1.1 skrll }
1954 1.1 skrll i++;
1955 1.1 skrll }
1956 1.1 skrll current_bfd = current_bfd->archive_next;
1957 1.1 skrll if (current_bfd != NULL)
1958 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
1959 1.1 skrll }
1960 1.1 skrll
1961 1.1 skrll bfd_bwrite (symbol_table, symbol_table_size, abfd);
1962 1.1 skrll
1963 1.1 skrll free (symbol_table);
1964 1.1 skrll
1965 1.1 skrll prevoff = nextoff;
1966 1.1 skrll nextoff = nextoff + symbol_table_size;
1967 1.1 skrll }
1968 1.1 skrll else
1969 1.1 skrll PRINT20 (fhdr->symoff, 0);
1970 1.1 skrll
1971 1.1 skrll if (sym_64)
1972 1.1 skrll {
1973 1.1 skrll struct xcoff_ar_hdr_big *hdr;
1974 1.1 skrll char *symbol_table;
1975 1.1 skrll char *st;
1976 1.1 skrll file_ptr fileoff;
1977 1.1 skrll
1978 1.1 skrll bfd_vma symbol_table_size =
1979 1.1 skrll SIZEOF_AR_HDR_BIG
1980 1.1 skrll + SXCOFFARFMAG
1981 1.1 skrll + 8
1982 1.1 skrll + 8 * sym_64
1983 1.1 skrll + str_64 + (str_64 & 1);
1984 1.1 skrll
1985 1.1 skrll symbol_table = bfd_zmalloc (symbol_table_size);
1986 1.1 skrll if (symbol_table == NULL)
1987 1.1 skrll return FALSE;
1988 1.1 skrll
1989 1.1 skrll hdr = (struct xcoff_ar_hdr_big *) symbol_table;
1990 1.1 skrll
1991 1.1 skrll PRINT20 (hdr->size, 8 + 8 * sym_64 + str_64 + (str_64 & 1));
1992 1.1 skrll PRINT20 (hdr->nextoff, 0);
1993 1.1 skrll PRINT20 (hdr->prevoff, prevoff);
1994 1.1 skrll PRINT12 (hdr->date, 0);
1995 1.1 skrll PRINT12 (hdr->uid, 0);
1996 1.1 skrll PRINT12 (hdr->gid, 0);
1997 1.1 skrll PRINT12 (hdr->mode, 0);
1998 1.1 skrll PRINT4 (hdr->namlen, 0);
1999 1.1 skrll
2000 1.1 skrll st = symbol_table + SIZEOF_AR_HDR_BIG;
2001 1.1 skrll memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
2002 1.1 skrll st += SXCOFFARFMAG;
2003 1.1 skrll
2004 1.1 skrll bfd_h_put_64 (abfd, sym_64, st);
2005 1.1 skrll st += 8;
2006 1.1 skrll
2007 1.1 skrll /* loop over the 64 bit offsets */
2008 1.1 skrll current_bfd = abfd->archive_head;
2009 1.1 skrll if (current_bfd != NULL)
2010 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
2011 1.1 skrll fileoff = SIZEOF_AR_FILE_HDR_BIG;
2012 1.1 skrll i = 0;
2013 1.1 skrll while (current_bfd != NULL && i < orl_count)
2014 1.1 skrll {
2015 1.1 skrll while (map[i].u.abfd == current_bfd)
2016 1.1 skrll {
2017 1.1 skrll if (arch_info->bits_per_address == 64)
2018 1.1 skrll {
2019 1.1 skrll bfd_h_put_64 (abfd, fileoff, st);
2020 1.1 skrll st += 8;
2021 1.1 skrll }
2022 1.1 skrll i++;
2023 1.1 skrll }
2024 1.1 skrll string_length = strlen (normalize_filename (current_bfd));
2025 1.1 skrll string_length += string_length & 1;
2026 1.1 skrll fileoff += (SIZEOF_AR_HDR_BIG
2027 1.1 skrll + string_length
2028 1.1 skrll + SXCOFFARFMAG
2029 1.1 skrll + arelt_size (current_bfd));
2030 1.1 skrll fileoff += fileoff & 1;
2031 1.1 skrll current_bfd = current_bfd->archive_next;
2032 1.1 skrll if (current_bfd != NULL)
2033 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
2034 1.1 skrll }
2035 1.1 skrll
2036 1.1 skrll /* loop over the 64 bit symbol names */
2037 1.1 skrll current_bfd = abfd->archive_head;
2038 1.1 skrll if (current_bfd != NULL)
2039 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
2040 1.1 skrll i = 0;
2041 1.1 skrll while (current_bfd != NULL && i < orl_count)
2042 1.1 skrll {
2043 1.1 skrll while (map[i].u.abfd == current_bfd)
2044 1.1 skrll {
2045 1.1 skrll if (arch_info->bits_per_address == 64)
2046 1.1 skrll {
2047 1.1 skrll string_length = sprintf (st, "%s", *map[i].name);
2048 1.1 skrll st += string_length + 1;
2049 1.1 skrll }
2050 1.1 skrll i++;
2051 1.1 skrll }
2052 1.1 skrll current_bfd = current_bfd->archive_next;
2053 1.1 skrll if (current_bfd != NULL)
2054 1.1 skrll arch_info = bfd_get_arch_info (current_bfd);
2055 1.1 skrll }
2056 1.1 skrll
2057 1.1 skrll bfd_bwrite (symbol_table, symbol_table_size, abfd);
2058 1.1 skrll
2059 1.1 skrll free (symbol_table);
2060 1.1 skrll
2061 1.1 skrll PRINT20 (fhdr->symoff64, nextoff);
2062 1.1 skrll }
2063 1.1 skrll else
2064 1.1 skrll PRINT20 (fhdr->symoff64, 0);
2065 1.1 skrll
2066 1.1 skrll return TRUE;
2067 1.1 skrll }
2068 1.1 skrll
2069 1.1 skrll bfd_boolean
2070 1.1 skrll _bfd_xcoff_write_armap (abfd, elength, map, orl_count, stridx)
2071 1.1 skrll bfd *abfd;
2072 1.1 skrll unsigned int elength ATTRIBUTE_UNUSED;
2073 1.1 skrll struct orl *map;
2074 1.1 skrll unsigned int orl_count;
2075 1.1 skrll int stridx;
2076 1.1 skrll {
2077 1.1 skrll if (! xcoff_big_format_p (abfd))
2078 1.1 skrll return xcoff_write_armap_old (abfd, elength, map, orl_count, stridx);
2079 1.1 skrll else
2080 1.1 skrll return xcoff_write_armap_big (abfd, elength, map, orl_count, stridx);
2081 1.1 skrll }
2082 1.1 skrll
2083 1.1 skrll /* Write out an XCOFF archive. We always write an entire archive,
2084 1.1 skrll rather than fussing with the freelist and so forth. */
2085 1.1 skrll
2086 1.1 skrll static bfd_boolean
2087 1.1 skrll xcoff_write_archive_contents_old (abfd)
2088 1.1 skrll bfd *abfd;
2089 1.1 skrll {
2090 1.1 skrll struct xcoff_ar_file_hdr fhdr;
2091 1.1 skrll bfd_size_type count;
2092 1.1 skrll bfd_size_type total_namlen;
2093 1.1 skrll file_ptr *offsets;
2094 1.1 skrll bfd_boolean makemap;
2095 1.1 skrll bfd_boolean hasobjects;
2096 1.1 skrll file_ptr prevoff, nextoff;
2097 1.1 skrll bfd *sub;
2098 1.1 skrll size_t i;
2099 1.1 skrll struct xcoff_ar_hdr ahdr;
2100 1.1 skrll bfd_size_type size;
2101 1.1 skrll char *p;
2102 1.1 skrll char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];
2103 1.1 skrll
2104 1.1 skrll memset (&fhdr, 0, sizeof fhdr);
2105 1.1 skrll (void) strncpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG);
2106 1.1 skrll sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR);
2107 1.1 skrll sprintf (fhdr.freeoff, "%d", 0);
2108 1.1 skrll
2109 1.1 skrll count = 0;
2110 1.1 skrll total_namlen = 0;
2111 1.1 skrll for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
2112 1.1 skrll {
2113 1.1 skrll ++count;
2114 1.1 skrll total_namlen += strlen (normalize_filename (sub)) + 1;
2115 1.1 skrll }
2116 1.1 skrll offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
2117 1.1 skrll if (offsets == NULL)
2118 1.1 skrll return FALSE;
2119 1.1 skrll
2120 1.1 skrll if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
2121 1.1 skrll return FALSE;
2122 1.1 skrll
2123 1.1 skrll makemap = bfd_has_map (abfd);
2124 1.1 skrll hasobjects = FALSE;
2125 1.1 skrll prevoff = 0;
2126 1.1 skrll nextoff = SIZEOF_AR_FILE_HDR;
2127 1.1 skrll for (sub = abfd->archive_head, i = 0;
2128 1.1 skrll sub != NULL;
2129 1.1 skrll sub = sub->archive_next, i++)
2130 1.1 skrll {
2131 1.1 skrll const char *name;
2132 1.1 skrll bfd_size_type namlen;
2133 1.1 skrll struct xcoff_ar_hdr *ahdrp;
2134 1.1 skrll bfd_size_type remaining;
2135 1.1 skrll
2136 1.1 skrll if (makemap && ! hasobjects)
2137 1.1 skrll {
2138 1.1 skrll if (bfd_check_format (sub, bfd_object))
2139 1.1 skrll hasobjects = TRUE;
2140 1.1 skrll }
2141 1.1 skrll
2142 1.1 skrll name = normalize_filename (sub);
2143 1.1 skrll namlen = strlen (name);
2144 1.1 skrll
2145 1.1 skrll if (sub->arelt_data != NULL)
2146 1.1 skrll ahdrp = arch_xhdr (sub);
2147 1.1 skrll else
2148 1.1 skrll ahdrp = NULL;
2149 1.1 skrll
2150 1.1 skrll if (ahdrp == NULL)
2151 1.1 skrll {
2152 1.1 skrll struct stat s;
2153 1.1 skrll
2154 1.1 skrll memset (&ahdr, 0, sizeof ahdr);
2155 1.1 skrll ahdrp = &ahdr;
2156 1.1 skrll if (stat (bfd_get_filename (sub), &s) != 0)
2157 1.1 skrll {
2158 1.1 skrll bfd_set_error (bfd_error_system_call);
2159 1.1 skrll return FALSE;
2160 1.1 skrll }
2161 1.1 skrll
2162 1.1 skrll sprintf (ahdrp->size, "%ld", (long) s.st_size);
2163 1.1 skrll sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
2164 1.1 skrll sprintf (ahdrp->uid, "%ld", (long) s.st_uid);
2165 1.1 skrll sprintf (ahdrp->gid, "%ld", (long) s.st_gid);
2166 1.1 skrll sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode);
2167 1.1 skrll
2168 1.1 skrll if (sub->arelt_data == NULL)
2169 1.1 skrll {
2170 1.1 skrll size = sizeof (struct areltdata);
2171 1.1 skrll sub->arelt_data = bfd_alloc (sub, size);
2172 1.1 skrll if (sub->arelt_data == NULL)
2173 1.1 skrll return FALSE;
2174 1.1 skrll }
2175 1.1 skrll
2176 1.1 skrll arch_eltdata (sub)->parsed_size = s.st_size;
2177 1.1 skrll }
2178 1.1 skrll
2179 1.1 skrll sprintf (ahdrp->prevoff, "%ld", (long) prevoff);
2180 1.1 skrll sprintf (ahdrp->namlen, "%ld", (long) namlen);
2181 1.1 skrll
2182 1.1 skrll /* If the length of the name is odd, we write out the null byte
2183 1.1 skrll after the name as well. */
2184 1.1 skrll namlen = (namlen + 1) &~ (bfd_size_type) 1;
2185 1.1 skrll
2186 1.1 skrll remaining = arelt_size (sub);
2187 1.1 skrll size = (SIZEOF_AR_HDR
2188 1.1 skrll + namlen
2189 1.1 skrll + SXCOFFARFMAG
2190 1.1 skrll + remaining);
2191 1.1 skrll
2192 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
2193 1.1 skrll
2194 1.1 skrll offsets[i] = nextoff;
2195 1.1 skrll
2196 1.1 skrll prevoff = nextoff;
2197 1.1 skrll nextoff += size + (size & 1);
2198 1.1 skrll
2199 1.1 skrll sprintf (ahdrp->nextoff, "%ld", (long) nextoff);
2200 1.1 skrll
2201 1.1 skrll /* We need spaces, not null bytes, in the header. */
2202 1.1 skrll for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++)
2203 1.1 skrll if (*p == '\0')
2204 1.1 skrll *p = ' ';
2205 1.1 skrll
2206 1.1 skrll if ((bfd_bwrite ((PTR) ahdrp, (bfd_size_type) SIZEOF_AR_HDR, abfd)
2207 1.1 skrll != SIZEOF_AR_HDR)
2208 1.1 skrll || bfd_bwrite ((PTR) name, namlen, abfd) != namlen
2209 1.1 skrll || bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG,
2210 1.1 skrll abfd) != SXCOFFARFMAG)
2211 1.1 skrll return FALSE;
2212 1.1 skrll
2213 1.1 skrll if (bfd_seek (sub, (file_ptr) 0, SEEK_SET) != 0)
2214 1.1 skrll return FALSE;
2215 1.1 skrll
2216 1.1 skrll if (! do_copy (abfd, sub))
2217 1.1 skrll return FALSE;
2218 1.1 skrll
2219 1.1 skrll if (! do_pad (abfd, size & 1))
2220 1.1 skrll return FALSE;
2221 1.1 skrll }
2222 1.1 skrll
2223 1.1 skrll sprintf (fhdr.lastmemoff, "%ld", (long) prevoff);
2224 1.1 skrll
2225 1.1 skrll /* Write out the member table. */
2226 1.1 skrll
2227 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
2228 1.1 skrll sprintf (fhdr.memoff, "%ld", (long) nextoff);
2229 1.1 skrll
2230 1.1 skrll memset (&ahdr, 0, sizeof ahdr);
2231 1.1 skrll sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
2232 1.1 skrll + count * XCOFFARMAG_ELEMENT_SIZE
2233 1.1 skrll + total_namlen));
2234 1.1 skrll sprintf (ahdr.prevoff, "%ld", (long) prevoff);
2235 1.1 skrll sprintf (ahdr.date, "%d", 0);
2236 1.1 skrll sprintf (ahdr.uid, "%d", 0);
2237 1.1 skrll sprintf (ahdr.gid, "%d", 0);
2238 1.1 skrll sprintf (ahdr.mode, "%d", 0);
2239 1.1 skrll sprintf (ahdr.namlen, "%d", 0);
2240 1.1 skrll
2241 1.1 skrll size = (SIZEOF_AR_HDR
2242 1.1 skrll + XCOFFARMAG_ELEMENT_SIZE
2243 1.1 skrll + count * XCOFFARMAG_ELEMENT_SIZE
2244 1.1 skrll + total_namlen
2245 1.1 skrll + SXCOFFARFMAG);
2246 1.1 skrll
2247 1.1 skrll prevoff = nextoff;
2248 1.1 skrll nextoff += size + (size & 1);
2249 1.1 skrll
2250 1.1 skrll if (makemap && hasobjects)
2251 1.1 skrll sprintf (ahdr.nextoff, "%ld", (long) nextoff);
2252 1.1 skrll else
2253 1.1 skrll sprintf (ahdr.nextoff, "%d", 0);
2254 1.1 skrll
2255 1.1 skrll /* We need spaces, not null bytes, in the header. */
2256 1.1 skrll for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++)
2257 1.1 skrll if (*p == '\0')
2258 1.1 skrll *p = ' ';
2259 1.1 skrll
2260 1.1 skrll if ((bfd_bwrite ((PTR) &ahdr, (bfd_size_type) SIZEOF_AR_HDR, abfd)
2261 1.1 skrll != SIZEOF_AR_HDR)
2262 1.1 skrll || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG, abfd)
2263 1.1 skrll != SXCOFFARFMAG))
2264 1.1 skrll return FALSE;
2265 1.1 skrll
2266 1.1 skrll sprintf (decbuf, "%-12ld", (long) count);
2267 1.1 skrll if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE, abfd)
2268 1.1 skrll != XCOFFARMAG_ELEMENT_SIZE)
2269 1.1 skrll return FALSE;
2270 1.1 skrll for (i = 0; i < (size_t) count; i++)
2271 1.1 skrll {
2272 1.1 skrll sprintf (decbuf, "%-12ld", (long) offsets[i]);
2273 1.1 skrll if (bfd_bwrite ((PTR) decbuf, (bfd_size_type) XCOFFARMAG_ELEMENT_SIZE,
2274 1.1 skrll abfd) != XCOFFARMAG_ELEMENT_SIZE)
2275 1.1 skrll return FALSE;
2276 1.1 skrll }
2277 1.1 skrll for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
2278 1.1 skrll {
2279 1.1 skrll const char *name;
2280 1.1 skrll bfd_size_type namlen;
2281 1.1 skrll
2282 1.1 skrll name = normalize_filename (sub);
2283 1.1 skrll namlen = strlen (name);
2284 1.1 skrll if (bfd_bwrite ((PTR) name, namlen + 1, abfd) != namlen + 1)
2285 1.1 skrll return FALSE;
2286 1.1 skrll }
2287 1.1 skrll
2288 1.1 skrll if (! do_pad (abfd, size & 1))
2289 1.1 skrll return FALSE;
2290 1.1 skrll
2291 1.1 skrll /* Write out the armap, if appropriate. */
2292 1.1 skrll if (! makemap || ! hasobjects)
2293 1.1 skrll sprintf (fhdr.symoff, "%d", 0);
2294 1.1 skrll else
2295 1.1 skrll {
2296 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
2297 1.1 skrll sprintf (fhdr.symoff, "%ld", (long) nextoff);
2298 1.1 skrll bfd_ardata (abfd)->tdata = (PTR) &fhdr;
2299 1.1 skrll if (! _bfd_compute_and_write_armap (abfd, 0))
2300 1.1 skrll return FALSE;
2301 1.1 skrll }
2302 1.1 skrll
2303 1.1 skrll /* Write out the archive file header. */
2304 1.1 skrll
2305 1.1 skrll /* We need spaces, not null bytes, in the header. */
2306 1.1 skrll for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++)
2307 1.1 skrll if (*p == '\0')
2308 1.1 skrll *p = ' ';
2309 1.1 skrll
2310 1.1 skrll if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
2311 1.1 skrll || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR, abfd)
2312 1.1 skrll != SIZEOF_AR_FILE_HDR))
2313 1.1 skrll return FALSE;
2314 1.1 skrll
2315 1.1 skrll return TRUE;
2316 1.1 skrll }
2317 1.1 skrll
2318 1.1 skrll static bfd_boolean
2319 1.1 skrll xcoff_write_archive_contents_big (abfd)
2320 1.1 skrll bfd *abfd;
2321 1.1 skrll {
2322 1.1 skrll struct xcoff_ar_file_hdr_big fhdr;
2323 1.1 skrll bfd_size_type count;
2324 1.1 skrll bfd_size_type total_namlen;
2325 1.1 skrll file_ptr *offsets;
2326 1.1 skrll bfd_boolean makemap;
2327 1.1 skrll bfd_boolean hasobjects;
2328 1.1 skrll file_ptr prevoff, nextoff;
2329 1.1 skrll bfd *current_bfd;
2330 1.1 skrll size_t i;
2331 1.1 skrll struct xcoff_ar_hdr_big *hdr, ahdr;
2332 1.1 skrll bfd_size_type size;
2333 1.1 skrll char *member_table, *mt;
2334 1.1 skrll bfd_vma member_table_size;
2335 1.1 skrll
2336 1.1 skrll memset (&fhdr, 0, SIZEOF_AR_FILE_HDR_BIG);
2337 1.1 skrll memcpy (fhdr.magic, XCOFFARMAGBIG, SXCOFFARMAG);
2338 1.1 skrll
2339 1.1 skrll if (bfd_seek (abfd, (file_ptr) SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
2340 1.1 skrll return FALSE;
2341 1.1 skrll
2342 1.1 skrll /* Calculate count and total_namlen. */
2343 1.1 skrll makemap = bfd_has_map (abfd);
2344 1.1 skrll hasobjects = FALSE;
2345 1.1 skrll for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
2346 1.1 skrll current_bfd != NULL;
2347 1.1 skrll current_bfd = current_bfd->archive_next, count++)
2348 1.1 skrll {
2349 1.1 skrll total_namlen += strlen (normalize_filename (current_bfd)) + 1;
2350 1.1 skrll
2351 1.1 skrll if (makemap
2352 1.1 skrll && ! hasobjects
2353 1.1 skrll && bfd_check_format (current_bfd, bfd_object))
2354 1.1 skrll hasobjects = TRUE;
2355 1.1 skrll }
2356 1.1 skrll
2357 1.1 skrll offsets = NULL;
2358 1.1 skrll if (count)
2359 1.1 skrll {
2360 1.1 skrll offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
2361 1.1 skrll if (offsets == NULL)
2362 1.1 skrll return FALSE;
2363 1.1 skrll }
2364 1.1 skrll
2365 1.1 skrll prevoff = 0;
2366 1.1 skrll nextoff = SIZEOF_AR_FILE_HDR_BIG;
2367 1.1 skrll for (current_bfd = abfd->archive_head, i = 0;
2368 1.1 skrll current_bfd != NULL;
2369 1.1 skrll current_bfd = current_bfd->archive_next, i++)
2370 1.1 skrll {
2371 1.1 skrll const char *name;
2372 1.1 skrll bfd_size_type namlen;
2373 1.1 skrll struct xcoff_ar_hdr_big *ahdrp;
2374 1.1 skrll bfd_size_type remaining;
2375 1.1 skrll
2376 1.1 skrll name = normalize_filename (current_bfd);
2377 1.1 skrll namlen = strlen (name);
2378 1.1 skrll
2379 1.1 skrll if (current_bfd->arelt_data != NULL)
2380 1.1 skrll ahdrp = arch_xhdr_big (current_bfd);
2381 1.1 skrll else
2382 1.1 skrll ahdrp = NULL;
2383 1.1 skrll
2384 1.1 skrll if (ahdrp == NULL)
2385 1.1 skrll {
2386 1.1 skrll struct stat s;
2387 1.1 skrll
2388 1.1 skrll ahdrp = &ahdr;
2389 1.1 skrll /* XXX This should actually be a call to stat64 (at least on
2390 1.1 skrll 32-bit machines).
2391 1.1 skrll XXX This call will fail if the original object is not found. */
2392 1.1 skrll if (stat (bfd_get_filename (current_bfd), &s) != 0)
2393 1.1 skrll {
2394 1.1 skrll bfd_set_error (bfd_error_system_call);
2395 1.1 skrll return FALSE;
2396 1.1 skrll }
2397 1.1 skrll
2398 1.1 skrll PRINT20 (ahdrp->size, s.st_size);
2399 1.1 skrll PRINT12 (ahdrp->date, s.st_mtime);
2400 1.1 skrll PRINT12 (ahdrp->uid, s.st_uid);
2401 1.1 skrll PRINT12 (ahdrp->gid, s.st_gid);
2402 1.1 skrll PRINT12_OCTAL (ahdrp->mode, s.st_mode);
2403 1.1 skrll
2404 1.1 skrll if (current_bfd->arelt_data == NULL)
2405 1.1 skrll {
2406 1.1 skrll size = sizeof (struct areltdata);
2407 1.1 skrll current_bfd->arelt_data = bfd_alloc (current_bfd, size);
2408 1.1 skrll if (current_bfd->arelt_data == NULL)
2409 1.1 skrll return FALSE;
2410 1.1 skrll }
2411 1.1 skrll
2412 1.1 skrll arch_eltdata (current_bfd)->parsed_size = s.st_size;
2413 1.1 skrll }
2414 1.1 skrll
2415 1.1 skrll PRINT20 (ahdrp->prevoff, prevoff);
2416 1.1 skrll PRINT4 (ahdrp->namlen, namlen);
2417 1.1 skrll
2418 1.1 skrll /* If the length of the name is odd, we write out the null byte
2419 1.1 skrll after the name as well. */
2420 1.1 skrll namlen = (namlen + 1) &~ (bfd_size_type) 1;
2421 1.1 skrll
2422 1.1 skrll remaining = arelt_size (current_bfd);
2423 1.1 skrll size = (SIZEOF_AR_HDR_BIG
2424 1.1 skrll + namlen
2425 1.1 skrll + SXCOFFARFMAG
2426 1.1 skrll + remaining);
2427 1.1 skrll
2428 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
2429 1.1 skrll
2430 1.1 skrll /* Check for xcoff shared objects.
2431 1.1 skrll Their text section needs to be aligned wrt the archive file position.
2432 1.1 skrll This requires extra padding before the archive header. */
2433 1.1 skrll if (! do_shared_object_padding (abfd, current_bfd, & nextoff,
2434 1.1 skrll SIZEOF_AR_HDR_BIG + namlen
2435 1.1 skrll + SXCOFFARFMAG))
2436 1.1 skrll return FALSE;
2437 1.1 skrll
2438 1.1 skrll offsets[i] = nextoff;
2439 1.1 skrll
2440 1.1 skrll prevoff = nextoff;
2441 1.1 skrll nextoff += size + (size & 1);
2442 1.1 skrll
2443 1.1 skrll PRINT20 (ahdrp->nextoff, nextoff);
2444 1.1 skrll
2445 1.1 skrll if ((bfd_bwrite ((PTR) ahdrp, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
2446 1.1 skrll != SIZEOF_AR_HDR_BIG)
2447 1.1 skrll || bfd_bwrite ((PTR) name, (bfd_size_type) namlen, abfd) != namlen
2448 1.1 skrll || (bfd_bwrite ((PTR) XCOFFARFMAG, (bfd_size_type) SXCOFFARFMAG,
2449 1.1 skrll abfd) != SXCOFFARFMAG))
2450 1.1 skrll return FALSE;
2451 1.1 skrll
2452 1.1 skrll if (bfd_seek (current_bfd, (file_ptr) 0, SEEK_SET) != 0)
2453 1.1 skrll return FALSE;
2454 1.1 skrll
2455 1.1 skrll if (! do_copy (abfd, current_bfd))
2456 1.1 skrll return FALSE;
2457 1.1 skrll
2458 1.1 skrll if (! do_pad (abfd, size & 1))
2459 1.1 skrll return FALSE;
2460 1.1 skrll }
2461 1.1 skrll
2462 1.1 skrll if (count)
2463 1.1 skrll {
2464 1.1 skrll PRINT20 (fhdr.firstmemoff, offsets[0]);
2465 1.1 skrll PRINT20 (fhdr.lastmemoff, prevoff);
2466 1.1 skrll }
2467 1.1 skrll
2468 1.1 skrll /* Write out the member table.
2469 1.1 skrll Layout :
2470 1.1 skrll
2471 1.1 skrll standard big archive header
2472 1.1 skrll 0x0000 ar_size [0x14]
2473 1.1 skrll 0x0014 ar_nxtmem [0x14]
2474 1.1 skrll 0x0028 ar_prvmem [0x14]
2475 1.1 skrll 0x003C ar_date [0x0C]
2476 1.1 skrll 0x0048 ar_uid [0x0C]
2477 1.1 skrll 0x0054 ar_gid [0x0C]
2478 1.1 skrll 0x0060 ar_mod [0x0C]
2479 1.1 skrll 0x006C ar_namelen[0x04]
2480 1.1 skrll 0x0070 ar_fmag [0x02]
2481 1.1 skrll
2482 1.1 skrll Member table
2483 1.1 skrll 0x0072 count [0x14]
2484 1.1 skrll 0x0086 offsets [0x14 * counts]
2485 1.1 skrll 0x0086 + 0x14 * counts names [??]
2486 1.1 skrll ?? pad to even bytes.
2487 1.1 skrll */
2488 1.1 skrll
2489 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
2490 1.1 skrll
2491 1.1 skrll member_table_size = (SIZEOF_AR_HDR_BIG
2492 1.1 skrll + SXCOFFARFMAG
2493 1.1 skrll + XCOFFARMAGBIG_ELEMENT_SIZE
2494 1.1 skrll + count * XCOFFARMAGBIG_ELEMENT_SIZE
2495 1.1 skrll + total_namlen);
2496 1.1 skrll
2497 1.1 skrll member_table_size += member_table_size & 1;
2498 1.1 skrll member_table = bfd_zmalloc (member_table_size);
2499 1.1 skrll if (member_table == NULL)
2500 1.1 skrll return FALSE;
2501 1.1 skrll
2502 1.1 skrll hdr = (struct xcoff_ar_hdr_big *) member_table;
2503 1.1 skrll
2504 1.1 skrll PRINT20 (hdr->size, (XCOFFARMAGBIG_ELEMENT_SIZE
2505 1.1 skrll + count * XCOFFARMAGBIG_ELEMENT_SIZE
2506 1.1 skrll + total_namlen + (total_namlen & 1)));
2507 1.1 skrll if (makemap && hasobjects)
2508 1.1 skrll PRINT20 (hdr->nextoff, nextoff + member_table_size);
2509 1.1 skrll else
2510 1.1 skrll PRINT20 (hdr->nextoff, 0);
2511 1.1 skrll PRINT20 (hdr->prevoff, prevoff);
2512 1.1 skrll PRINT12 (hdr->date, 0);
2513 1.1 skrll PRINT12 (hdr->uid, 0);
2514 1.1 skrll PRINT12 (hdr->gid, 0);
2515 1.1 skrll PRINT12 (hdr->mode, 0);
2516 1.1 skrll PRINT4 (hdr->namlen, 0);
2517 1.1 skrll
2518 1.1 skrll mt = member_table + SIZEOF_AR_HDR_BIG;
2519 1.1 skrll memcpy (mt, XCOFFARFMAG, SXCOFFARFMAG);
2520 1.1 skrll mt += SXCOFFARFMAG;
2521 1.1 skrll
2522 1.1 skrll PRINT20 (mt, count);
2523 1.1 skrll mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2524 1.1 skrll for (i = 0; i < (size_t) count; i++)
2525 1.1 skrll {
2526 1.1 skrll PRINT20 (mt, offsets[i]);
2527 1.1 skrll mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2528 1.1 skrll }
2529 1.1 skrll
2530 1.1 skrll if (count)
2531 1.1 skrll {
2532 1.1 skrll free (offsets);
2533 1.1 skrll offsets = NULL;
2534 1.1 skrll }
2535 1.1 skrll
2536 1.1 skrll for (current_bfd = abfd->archive_head;
2537 1.1 skrll current_bfd != NULL;
2538 1.1 skrll current_bfd = current_bfd->archive_next)
2539 1.1 skrll {
2540 1.1 skrll const char *name;
2541 1.1 skrll size_t namlen;
2542 1.1 skrll
2543 1.1 skrll name = normalize_filename (current_bfd);
2544 1.1 skrll namlen = sprintf (mt, "%s", name);
2545 1.1 skrll mt += namlen + 1;
2546 1.1 skrll }
2547 1.1 skrll
2548 1.1 skrll if (bfd_bwrite (member_table, member_table_size, abfd) != member_table_size)
2549 1.1 skrll return FALSE;
2550 1.1 skrll
2551 1.1 skrll free (member_table);
2552 1.1 skrll
2553 1.1 skrll PRINT20 (fhdr.memoff, nextoff);
2554 1.1 skrll
2555 1.1 skrll prevoff = nextoff;
2556 1.1 skrll nextoff += member_table_size;
2557 1.1 skrll
2558 1.1 skrll /* Write out the armap, if appropriate. */
2559 1.1 skrll
2560 1.1 skrll if (! makemap || ! hasobjects)
2561 1.1 skrll PRINT20 (fhdr.symoff, 0);
2562 1.1 skrll else
2563 1.1 skrll {
2564 1.1 skrll BFD_ASSERT (nextoff == bfd_tell (abfd));
2565 1.1 skrll
2566 1.1 skrll /* Save nextoff in fhdr.symoff so the armap routine can use it. */
2567 1.1 skrll PRINT20 (fhdr.symoff, nextoff);
2568 1.1 skrll
2569 1.1 skrll bfd_ardata (abfd)->tdata = (PTR) &fhdr;
2570 1.1 skrll if (! _bfd_compute_and_write_armap (abfd, 0))
2571 1.1 skrll return FALSE;
2572 1.1 skrll }
2573 1.1 skrll
2574 1.1 skrll /* Write out the archive file header. */
2575 1.1 skrll
2576 1.1 skrll if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
2577 1.1 skrll || (bfd_bwrite ((PTR) &fhdr, (bfd_size_type) SIZEOF_AR_FILE_HDR_BIG,
2578 1.1 skrll abfd) != SIZEOF_AR_FILE_HDR_BIG))
2579 1.1 skrll return FALSE;
2580 1.1 skrll
2581 1.1 skrll return TRUE;
2582 1.1 skrll }
2583 1.1 skrll
2584 1.1 skrll bfd_boolean
2585 1.1 skrll _bfd_xcoff_write_archive_contents (abfd)
2586 1.1 skrll bfd *abfd;
2587 1.1 skrll {
2588 1.1 skrll if (! xcoff_big_format_p (abfd))
2589 1.1 skrll return xcoff_write_archive_contents_old (abfd);
2590 1.1 skrll else
2591 1.1 skrll return xcoff_write_archive_contents_big (abfd);
2592 1.1 skrll }
2593 1.1 skrll
2594 1.1 skrll /* We can't use the usual coff_sizeof_headers routine, because AIX
2596 1.1 skrll always uses an a.out header. */
2597 1.1 skrll
2598 1.1 skrll int
2599 1.1 skrll _bfd_xcoff_sizeof_headers (bfd *abfd,
2600 1.1 skrll struct bfd_link_info *info ATTRIBUTE_UNUSED)
2601 1.1 skrll {
2602 1.1 skrll int size;
2603 1.1 skrll
2604 1.1 skrll size = FILHSZ;
2605 1.1 skrll if (xcoff_data (abfd)->full_aouthdr)
2606 1.1 skrll size += AOUTSZ;
2607 1.1 skrll else
2608 1.1 skrll size += SMALL_AOUTSZ;
2609 1.1 skrll size += abfd->section_count * SCNHSZ;
2610 1.1 skrll return size;
2611 1.1 skrll }
2612 1.1 skrll
2613 1.1 skrll /* Routines to swap information in the XCOFF .loader section. If we
2615 1.1 skrll ever need to write an XCOFF loader, this stuff will need to be
2616 1.1 skrll moved to another file shared by the linker (which XCOFF calls the
2617 1.1 skrll ``binder'') and the loader. */
2618 1.1 skrll
2619 1.1 skrll /* Swap in the ldhdr structure. */
2620 1.1 skrll
2621 1.1 skrll static void
2622 1.1 skrll xcoff_swap_ldhdr_in (abfd, s, dst)
2623 1.1 skrll bfd *abfd;
2624 1.1 skrll const PTR s;
2625 1.1 skrll struct internal_ldhdr *dst;
2626 1.1 skrll {
2627 1.1 skrll const struct external_ldhdr *src = (const struct external_ldhdr *) s;
2628 1.1 skrll
2629 1.1 skrll dst->l_version = bfd_get_32 (abfd, src->l_version);
2630 1.1 skrll dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
2631 1.1 skrll dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
2632 1.1 skrll dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
2633 1.1 skrll dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
2634 1.1 skrll dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
2635 1.1 skrll dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
2636 1.1 skrll dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
2637 1.1 skrll }
2638 1.1 skrll
2639 1.1 skrll /* Swap out the ldhdr structure. */
2640 1.1 skrll
2641 1.1 skrll static void
2642 1.1 skrll xcoff_swap_ldhdr_out (abfd, src, d)
2643 1.1 skrll bfd *abfd;
2644 1.1 skrll const struct internal_ldhdr *src;
2645 1.1 skrll PTR d;
2646 1.1 skrll {
2647 1.1 skrll struct external_ldhdr *dst = (struct external_ldhdr *) d;
2648 1.1 skrll
2649 1.1 skrll bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
2650 1.1 skrll bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
2651 1.1 skrll bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
2652 1.1 skrll bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
2653 1.1 skrll bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
2654 1.1 skrll bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
2655 1.1 skrll bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
2656 1.1 skrll bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
2657 1.1 skrll }
2658 1.1 skrll
2659 1.1 skrll /* Swap in the ldsym structure. */
2660 1.1 skrll
2661 1.1 skrll static void
2662 1.1 skrll xcoff_swap_ldsym_in (abfd, s, dst)
2663 1.1 skrll bfd *abfd;
2664 1.1 skrll const PTR s;
2665 1.1 skrll struct internal_ldsym *dst;
2666 1.1 skrll {
2667 1.1 skrll const struct external_ldsym *src = (const struct external_ldsym *) s;
2668 1.1 skrll
2669 1.1 skrll if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) {
2670 1.1 skrll memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2671 1.1 skrll } else {
2672 1.1 skrll dst->_l._l_l._l_zeroes = 0;
2673 1.1 skrll dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
2674 1.1 skrll }
2675 1.1 skrll dst->l_value = bfd_get_32 (abfd, src->l_value);
2676 1.1 skrll dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
2677 1.1 skrll dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
2678 1.1 skrll dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
2679 1.1 skrll dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
2680 1.1 skrll dst->l_parm = bfd_get_32 (abfd, src->l_parm);
2681 1.1 skrll }
2682 1.1 skrll
2683 1.1 skrll /* Swap out the ldsym structure. */
2684 1.1 skrll
2685 1.1 skrll static void
2686 1.1 skrll xcoff_swap_ldsym_out (abfd, src, d)
2687 1.1 skrll bfd *abfd;
2688 1.1 skrll const struct internal_ldsym *src;
2689 1.1 skrll PTR d;
2690 1.1 skrll {
2691 1.1 skrll struct external_ldsym *dst = (struct external_ldsym *) d;
2692 1.1 skrll
2693 1.1 skrll if (src->_l._l_l._l_zeroes != 0)
2694 1.1 skrll memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2695 1.1 skrll else
2696 1.1 skrll {
2697 1.1 skrll bfd_put_32 (abfd, (bfd_vma) 0, dst->_l._l_l._l_zeroes);
2698 1.1 skrll bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset,
2699 1.1 skrll dst->_l._l_l._l_offset);
2700 1.1 skrll }
2701 1.1 skrll bfd_put_32 (abfd, src->l_value, dst->l_value);
2702 1.1 skrll bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
2703 1.1 skrll bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
2704 1.1 skrll bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
2705 1.1 skrll bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
2706 1.1 skrll bfd_put_32 (abfd, src->l_parm, dst->l_parm);
2707 1.1 skrll }
2708 1.1 skrll
2709 1.1 skrll static void
2710 1.1 skrll xcoff_swap_reloc_in (abfd, s, d)
2711 1.1 skrll bfd *abfd;
2712 1.1 skrll PTR s;
2713 1.1 skrll PTR d;
2714 1.1 skrll {
2715 1.1 skrll struct external_reloc *src = (struct external_reloc *) s;
2716 1.1 skrll struct internal_reloc *dst = (struct internal_reloc *) d;
2717 1.1 skrll
2718 1.1 skrll memset (dst, 0, sizeof (struct internal_reloc));
2719 1.1 skrll
2720 1.1 skrll dst->r_vaddr = bfd_get_32 (abfd, src->r_vaddr);
2721 1.1 skrll dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
2722 1.1 skrll dst->r_size = bfd_get_8 (abfd, src->r_size);
2723 1.1 skrll dst->r_type = bfd_get_8 (abfd, src->r_type);
2724 1.1 skrll }
2725 1.1 skrll
2726 1.1 skrll static unsigned int
2727 1.1 skrll xcoff_swap_reloc_out (abfd, s, d)
2728 1.1 skrll bfd *abfd;
2729 1.1 skrll PTR s;
2730 1.1 skrll PTR d;
2731 1.1 skrll {
2732 1.1 skrll struct internal_reloc *src = (struct internal_reloc *) s;
2733 1.1 skrll struct external_reloc *dst = (struct external_reloc *) d;
2734 1.1 skrll
2735 1.1 skrll bfd_put_32 (abfd, src->r_vaddr, dst->r_vaddr);
2736 1.1 skrll bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
2737 1.1 skrll bfd_put_8 (abfd, src->r_type, dst->r_type);
2738 1.1 skrll bfd_put_8 (abfd, src->r_size, dst->r_size);
2739 1.1 skrll
2740 1.1 skrll return bfd_coff_relsz (abfd);
2741 1.1 skrll }
2742 1.1 skrll
2743 1.1 skrll /* Swap in the ldrel structure. */
2744 1.1 skrll
2745 1.1 skrll static void
2746 1.1 skrll xcoff_swap_ldrel_in (abfd, s, dst)
2747 1.1 skrll bfd *abfd;
2748 1.1 skrll const PTR s;
2749 1.1 skrll struct internal_ldrel *dst;
2750 1.1 skrll {
2751 1.1 skrll const struct external_ldrel *src = (const struct external_ldrel *) s;
2752 1.1 skrll
2753 1.1 skrll dst->l_vaddr = bfd_get_32 (abfd, src->l_vaddr);
2754 1.1 skrll dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
2755 1.1 skrll dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
2756 1.1 skrll dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
2757 1.1 skrll }
2758 1.1 skrll
2759 1.1 skrll /* Swap out the ldrel structure. */
2760 1.1 skrll
2761 1.1 skrll static void
2762 1.1 skrll xcoff_swap_ldrel_out (abfd, src, d)
2763 1.1 skrll bfd *abfd;
2764 1.1 skrll const struct internal_ldrel *src;
2765 1.1 skrll PTR d;
2766 1.1 skrll {
2767 1.1 skrll struct external_ldrel *dst = (struct external_ldrel *) d;
2768 1.1 skrll
2769 1.1 skrll bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
2770 1.1 skrll bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
2771 1.1 skrll bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
2772 1.1 skrll bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
2773 1.1 skrll }
2774 1.1 skrll
2775 1.1 skrll
2777 1.1 skrll bfd_boolean
2778 1.1 skrll xcoff_reloc_type_noop (input_bfd, input_section, output_bfd, rel, sym, howto,
2779 1.1 skrll val, addend, relocation, contents)
2780 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
2781 1.1 skrll asection *input_section ATTRIBUTE_UNUSED;
2782 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2783 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED;
2784 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2785 1.1 skrll struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2786 1.1 skrll bfd_vma val ATTRIBUTE_UNUSED;
2787 1.1 skrll bfd_vma addend ATTRIBUTE_UNUSED;
2788 1.1 skrll bfd_vma *relocation ATTRIBUTE_UNUSED;
2789 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2790 1.1 skrll {
2791 1.1 skrll return TRUE;
2792 1.1 skrll }
2793 1.1 skrll
2794 1.1 skrll bfd_boolean
2795 1.1 skrll xcoff_reloc_type_fail (input_bfd, input_section, output_bfd, rel, sym, howto,
2796 1.1 skrll val, addend, relocation, contents)
2797 1.1 skrll bfd *input_bfd;
2798 1.1 skrll asection *input_section ATTRIBUTE_UNUSED;
2799 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2800 1.1 skrll struct internal_reloc *rel;
2801 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2802 1.1 skrll struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2803 1.1 skrll bfd_vma val ATTRIBUTE_UNUSED;
2804 1.1 skrll bfd_vma addend ATTRIBUTE_UNUSED;
2805 1.1 skrll bfd_vma *relocation ATTRIBUTE_UNUSED;
2806 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2807 1.1 skrll {
2808 1.1 skrll (*_bfd_error_handler)
2809 1.1 skrll (_("%s: unsupported relocation type 0x%02x"),
2810 1.1 skrll bfd_get_filename (input_bfd), (unsigned int) rel->r_type);
2811 1.1 skrll bfd_set_error (bfd_error_bad_value);
2812 1.1 skrll return FALSE;
2813 1.1 skrll }
2814 1.1 skrll
2815 1.1 skrll bfd_boolean
2816 1.1 skrll xcoff_reloc_type_pos (input_bfd, input_section, output_bfd, rel, sym, howto,
2817 1.1 skrll val, addend, relocation, contents)
2818 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
2819 1.1 skrll asection *input_section ATTRIBUTE_UNUSED;
2820 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2821 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED;
2822 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2823 1.1 skrll struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2824 1.1 skrll bfd_vma val;
2825 1.1 skrll bfd_vma addend;
2826 1.1 skrll bfd_vma *relocation;
2827 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2828 1.1 skrll {
2829 1.1 skrll *relocation = val + addend;
2830 1.1 skrll return TRUE;
2831 1.1 skrll }
2832 1.1 skrll
2833 1.1 skrll bfd_boolean
2834 1.1 skrll xcoff_reloc_type_neg (input_bfd, input_section, output_bfd, rel, sym, howto,
2835 1.1 skrll val, addend, relocation, contents)
2836 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
2837 1.1 skrll asection *input_section ATTRIBUTE_UNUSED;
2838 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2839 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED;
2840 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2841 1.1 skrll struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2842 1.1 skrll bfd_vma val;
2843 1.1 skrll bfd_vma addend;
2844 1.1 skrll bfd_vma *relocation;
2845 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2846 1.1 skrll {
2847 1.1 skrll *relocation = addend - val;
2848 1.1 skrll return TRUE;
2849 1.1 skrll }
2850 1.1 skrll
2851 1.1 skrll bfd_boolean
2852 1.1 skrll xcoff_reloc_type_rel (input_bfd, input_section, output_bfd, rel, sym, howto,
2853 1.1 skrll val, addend, relocation, contents)
2854 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
2855 1.1 skrll asection *input_section;
2856 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2857 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED;
2858 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2859 1.1 skrll struct reloc_howto_struct *howto;
2860 1.1 skrll bfd_vma val;
2861 1.1 skrll bfd_vma addend;
2862 1.1 skrll bfd_vma *relocation;
2863 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2864 1.1 skrll {
2865 1.1 skrll howto->pc_relative = TRUE;
2866 1.1 skrll
2867 1.1 skrll /* A PC relative reloc includes the section address. */
2868 1.1 skrll addend += input_section->vma;
2869 1.1 skrll
2870 1.1 skrll *relocation = val + addend;
2871 1.1 skrll *relocation -= (input_section->output_section->vma
2872 1.1 skrll + input_section->output_offset);
2873 1.1 skrll return TRUE;
2874 1.1 skrll }
2875 1.1 skrll
2876 1.1 skrll bfd_boolean
2877 1.1 skrll xcoff_reloc_type_toc (input_bfd, input_section, output_bfd, rel, sym, howto,
2878 1.1 skrll val, addend, relocation, contents)
2879 1.1 skrll bfd *input_bfd;
2880 1.1 skrll asection *input_section ATTRIBUTE_UNUSED;
2881 1.1 skrll bfd *output_bfd;
2882 1.1 skrll struct internal_reloc *rel;
2883 1.1 skrll struct internal_syment *sym;
2884 1.1 skrll struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
2885 1.1 skrll bfd_vma val;
2886 1.1 skrll bfd_vma addend ATTRIBUTE_UNUSED;
2887 1.1 skrll bfd_vma *relocation;
2888 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2889 1.1 skrll {
2890 1.1 skrll struct xcoff_link_hash_entry *h;
2891 1.1 skrll
2892 1.1 skrll if (0 > rel->r_symndx)
2893 1.1 skrll return FALSE;
2894 1.1 skrll
2895 1.1 skrll h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
2896 1.1 skrll
2897 1.1 skrll if (h != NULL && h->smclas != XMC_TD)
2898 1.1 skrll {
2899 1.1 skrll if (h->toc_section == NULL)
2900 1.1 skrll {
2901 1.1 skrll (*_bfd_error_handler)
2902 1.1 skrll (_("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry"),
2903 1.1 skrll bfd_get_filename (input_bfd), rel->r_vaddr,
2904 1.1 skrll h->root.root.string);
2905 1.1 skrll bfd_set_error (bfd_error_bad_value);
2906 1.1 skrll return FALSE;
2907 1.1 skrll }
2908 1.1 skrll
2909 1.1 skrll BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
2910 1.1 skrll val = (h->toc_section->output_section->vma
2911 1.1 skrll + h->toc_section->output_offset);
2912 1.1 skrll }
2913 1.1 skrll
2914 1.1 skrll *relocation = ((val - xcoff_data (output_bfd)->toc)
2915 1.1 skrll - (sym->n_value - xcoff_data (input_bfd)->toc));
2916 1.1 skrll return TRUE;
2917 1.1 skrll }
2918 1.1 skrll
2919 1.1 skrll bfd_boolean
2920 1.1 skrll xcoff_reloc_type_ba (input_bfd, input_section, output_bfd, rel, sym, howto,
2921 1.1 skrll val, addend, relocation, contents)
2922 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
2923 1.1 skrll asection *input_section ATTRIBUTE_UNUSED;
2924 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2925 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED;
2926 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2927 1.1 skrll struct reloc_howto_struct *howto;
2928 1.1 skrll bfd_vma val;
2929 1.1 skrll bfd_vma addend;
2930 1.1 skrll bfd_vma *relocation;
2931 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
2932 1.1 skrll {
2933 1.1 skrll howto->src_mask &= ~3;
2934 1.1 skrll howto->dst_mask = howto->src_mask;
2935 1.1 skrll
2936 1.1 skrll *relocation = val + addend;
2937 1.1 skrll
2938 1.1 skrll return TRUE;
2939 1.1 skrll }
2940 1.1 skrll
2941 1.1 skrll static bfd_boolean
2942 1.1 skrll xcoff_reloc_type_br (input_bfd, input_section, output_bfd, rel, sym, howto,
2943 1.1 skrll val, addend, relocation, contents)
2944 1.1 skrll bfd *input_bfd;
2945 1.1 skrll asection *input_section;
2946 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
2947 1.1 skrll struct internal_reloc *rel;
2948 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
2949 1.1 skrll struct reloc_howto_struct *howto;
2950 1.1 skrll bfd_vma val;
2951 1.1 skrll bfd_vma addend;
2952 1.1 skrll bfd_vma *relocation;
2953 1.1 skrll bfd_byte *contents;
2954 1.1 skrll {
2955 1.1 skrll struct xcoff_link_hash_entry *h;
2956 1.1 skrll
2957 1.1 skrll if (0 > rel->r_symndx)
2958 1.1 skrll return FALSE;
2959 1.1 skrll
2960 1.1 skrll h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
2961 1.1 skrll
2962 1.1 skrll /* If we see an R_BR or R_RBR reloc which is jumping to global
2963 1.1 skrll linkage code, and it is followed by an appropriate cror nop
2964 1.1 skrll instruction, we replace the cror with lwz r2,20(r1). This
2965 1.1 skrll restores the TOC after the glink code. Contrariwise, if the
2966 1.1 skrll call is followed by a lwz r2,20(r1), but the call is not
2967 1.1 skrll going to global linkage code, we can replace the load with a
2968 1.1 skrll cror. */
2969 1.1 skrll if (NULL != h
2970 1.1 skrll && bfd_link_hash_defined == h->root.type
2971 1.1 skrll && rel->r_vaddr - input_section->vma + 8 <= input_section->size)
2972 1.1 skrll {
2973 1.1 skrll bfd_byte *pnext;
2974 1.1 skrll unsigned long next;
2975 1.1 skrll
2976 1.1 skrll pnext = contents + (rel->r_vaddr - input_section->vma) + 4;
2977 1.1 skrll next = bfd_get_32 (input_bfd, pnext);
2978 1.1 skrll
2979 1.1 skrll /* The _ptrgl function is magic. It is used by the AIX
2980 1.1 skrll compiler to call a function through a pointer. */
2981 1.1 skrll if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
2982 1.1 skrll {
2983 1.1 skrll if (next == 0x4def7b82 /* cror 15,15,15 */
2984 1.1 skrll || next == 0x4ffffb82 /* cror 31,31,31 */
2985 1.1 skrll || next == 0x60000000) /* ori r0,r0,0 */
2986 1.1 skrll bfd_put_32 (input_bfd, 0x80410014, pnext); /* lwz r1,20(r1) */
2987 1.1 skrll
2988 1.1 skrll }
2989 1.1 skrll else
2990 1.1 skrll {
2991 1.1 skrll if (next == 0x80410014) /* lwz r1,20(r1) */
2992 1.1 skrll bfd_put_32 (input_bfd, 0x60000000, pnext); /* ori r0,r0,0 */
2993 1.1 skrll }
2994 1.1 skrll }
2995 1.1 skrll else if (NULL != h && bfd_link_hash_undefined == h->root.type)
2996 1.1 skrll {
2997 1.1 skrll /* Normally, this relocation is against a defined symbol. In the
2998 1.1 skrll case where this is a partial link and the output section offset
2999 1.1 skrll is greater than 2^25, the linker will return an invalid error
3000 1.1 skrll message that the relocation has been truncated. Yes it has been
3001 1.1 skrll truncated but no it not important. For this case, disable the
3002 1.1 skrll overflow checking. */
3003 1.1 skrll
3004 1.1 skrll howto->complain_on_overflow = complain_overflow_dont;
3005 1.1 skrll }
3006 1.1 skrll
3007 1.1 skrll howto->pc_relative = TRUE;
3008 1.1 skrll howto->src_mask &= ~3;
3009 1.1 skrll howto->dst_mask = howto->src_mask;
3010 1.1 skrll
3011 1.1 skrll /* A PC relative reloc includes the section address. */
3012 1.1 skrll addend += input_section->vma;
3013 1.1 skrll
3014 1.1 skrll *relocation = val + addend;
3015 1.1 skrll *relocation -= (input_section->output_section->vma
3016 1.1 skrll + input_section->output_offset);
3017 1.1 skrll return TRUE;
3018 1.1 skrll }
3019 1.1 skrll
3020 1.1 skrll bfd_boolean
3021 1.1 skrll xcoff_reloc_type_crel (input_bfd, input_section, output_bfd, rel, sym, howto,
3022 1.1 skrll val, addend, relocation, contents)
3023 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
3024 1.1 skrll asection *input_section;
3025 1.1 skrll bfd *output_bfd ATTRIBUTE_UNUSED;
3026 1.1 skrll struct internal_reloc *rel ATTRIBUTE_UNUSED;
3027 1.1 skrll struct internal_syment *sym ATTRIBUTE_UNUSED;
3028 1.1 skrll struct reloc_howto_struct *howto;
3029 1.1 skrll bfd_vma val ATTRIBUTE_UNUSED;
3030 1.1 skrll bfd_vma addend;
3031 1.1 skrll bfd_vma *relocation;
3032 1.1 skrll bfd_byte *contents ATTRIBUTE_UNUSED;
3033 1.1 skrll {
3034 1.1 skrll howto->pc_relative = TRUE;
3035 1.1 skrll howto->src_mask &= ~3;
3036 1.1 skrll howto->dst_mask = howto->src_mask;
3037 1.1 skrll
3038 1.1 skrll /* A PC relative reloc includes the section address. */
3039 1.1 skrll addend += input_section->vma;
3040 1.1 skrll
3041 1.1 skrll *relocation = val + addend;
3042 1.1 skrll *relocation -= (input_section->output_section->vma
3043 1.1 skrll + input_section->output_offset);
3044 1.1 skrll return TRUE;
3045 1.1 skrll }
3046 1.1 skrll
3047 1.1 skrll static bfd_boolean
3048 1.1 skrll xcoff_complain_overflow_dont_func (input_bfd, val, relocation, howto)
3049 1.1 skrll bfd *input_bfd ATTRIBUTE_UNUSED;
3050 1.1 skrll bfd_vma val ATTRIBUTE_UNUSED;
3051 1.1 skrll bfd_vma relocation ATTRIBUTE_UNUSED;
3052 1.1 skrll struct reloc_howto_struct *howto ATTRIBUTE_UNUSED;
3053 1.1 skrll {
3054 1.1 skrll return FALSE;
3055 1.1 skrll }
3056 1.1 skrll
3057 1.1 skrll static bfd_boolean
3058 1.1 skrll xcoff_complain_overflow_bitfield_func (input_bfd, val, relocation, howto)
3059 1.1 skrll bfd *input_bfd;
3060 1.1 skrll bfd_vma val;
3061 1.1 skrll bfd_vma relocation;
3062 1.1 skrll struct reloc_howto_struct *howto;
3063 1.1 skrll {
3064 1.1 skrll bfd_vma addrmask, fieldmask, signmask, ss;
3065 1.1 skrll bfd_vma a, b, sum;
3066 1.1 skrll
3067 1.1 skrll /* Get the values to be added together. For signed and unsigned
3068 1.1 skrll relocations, we assume that all values should be truncated to
3069 1.1 skrll the size of an address. For bitfields, all the bits matter.
3070 1.1 skrll See also bfd_check_overflow. */
3071 1.1 skrll fieldmask = N_ONES (howto->bitsize);
3072 1.1 skrll addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3073 1.1 skrll a = relocation;
3074 1.1 skrll b = val & howto->src_mask;
3075 1.1 skrll
3076 1.1 skrll /* Much like unsigned, except no trimming with addrmask. In
3077 1.1 skrll addition, the sum overflows if there is a carry out of
3078 1.1 skrll the bfd_vma, i.e., the sum is less than either input
3079 1.1 skrll operand. */
3080 1.1 skrll a >>= howto->rightshift;
3081 1.1 skrll b >>= howto->bitpos;
3082 1.1 skrll
3083 1.1 skrll /* Bitfields are sometimes used for signed numbers; for
3084 1.1 skrll example, a 13-bit field sometimes represents values in
3085 1.1 skrll 0..8191 and sometimes represents values in -4096..4095.
3086 1.1 skrll If the field is signed and a is -4095 (0x1001) and b is
3087 1.1 skrll -1 (0x1fff), the sum is -4096 (0x1000), but (0x1001 +
3088 1.1 skrll 0x1fff is 0x3000). It's not clear how to handle this
3089 1.1 skrll everywhere, since there is not way to know how many bits
3090 1.1 skrll are significant in the relocation, but the original code
3091 1.1 skrll assumed that it was fully sign extended, and we will keep
3092 1.1 skrll that assumption. */
3093 1.1 skrll signmask = (fieldmask >> 1) + 1;
3094 1.1 skrll
3095 1.1 skrll if ((a & ~ fieldmask) != 0)
3096 1.1 skrll {
3097 1.1 skrll /* Some bits out of the field are set. This might not
3098 1.1 skrll be a problem: if this is a signed bitfield, it is OK
3099 1.1 skrll iff all the high bits are set, including the sign
3100 1.1 skrll bit. We'll try setting all but the most significant
3101 1.1 skrll bit in the original relocation value: if this is all
3102 1.1 skrll ones, we are OK, assuming a signed bitfield. */
3103 1.1 skrll ss = (signmask << howto->rightshift) - 1;
3104 1.1 skrll if ((ss | relocation) != ~ (bfd_vma) 0)
3105 1.1 skrll return TRUE;
3106 1.1 skrll a &= fieldmask;
3107 1.1 skrll }
3108 1.1 skrll
3109 1.1 skrll /* We just assume (b & ~ fieldmask) == 0. */
3110 1.1 skrll
3111 1.1 skrll /* We explicitly permit wrap around if this relocation
3112 1.1 skrll covers the high bit of an address. The Linux kernel
3113 1.1 skrll relies on it, and it is the only way to write assembler
3114 1.1 skrll code which can run when loaded at a location 0x80000000
3115 1.1 skrll away from the location at which it is linked. */
3116 1.1 skrll if (howto->bitsize + howto->rightshift
3117 1.1 skrll == bfd_arch_bits_per_address (input_bfd))
3118 1.1 skrll return FALSE;
3119 1.1 skrll
3120 1.1 skrll sum = a + b;
3121 1.1 skrll if (sum < a || (sum & ~ fieldmask) != 0)
3122 1.1 skrll {
3123 1.1 skrll /* There was a carry out, or the field overflow. Test
3124 1.1 skrll for signed operands again. Here is the overflow test
3125 1.1 skrll is as for complain_overflow_signed. */
3126 1.1 skrll if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3127 1.1 skrll return TRUE;
3128 1.1 skrll }
3129 1.1 skrll
3130 1.1 skrll return FALSE;
3131 1.1 skrll }
3132 1.1 skrll
3133 1.1 skrll static bfd_boolean
3134 1.1 skrll xcoff_complain_overflow_signed_func (input_bfd, val, relocation, howto)
3135 1.1 skrll bfd *input_bfd;
3136 1.1 skrll bfd_vma val;
3137 1.1 skrll bfd_vma relocation;
3138 1.1 skrll struct reloc_howto_struct *howto;
3139 1.1 skrll {
3140 1.1 skrll bfd_vma addrmask, fieldmask, signmask, ss;
3141 1.1 skrll bfd_vma a, b, sum;
3142 1.1 skrll
3143 1.1 skrll /* Get the values to be added together. For signed and unsigned
3144 1.1 skrll relocations, we assume that all values should be truncated to
3145 1.1 skrll the size of an address. For bitfields, all the bits matter.
3146 1.1 skrll See also bfd_check_overflow. */
3147 1.1 skrll fieldmask = N_ONES (howto->bitsize);
3148 1.1 skrll addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3149 1.1 skrll a = relocation;
3150 1.1 skrll b = val & howto->src_mask;
3151 1.1 skrll
3152 1.1 skrll a = (a & addrmask) >> howto->rightshift;
3153 1.1 skrll
3154 1.1 skrll /* If any sign bits are set, all sign bits must be set.
3155 1.1 skrll That is, A must be a valid negative address after
3156 1.1 skrll shifting. */
3157 1.1 skrll signmask = ~ (fieldmask >> 1);
3158 1.1 skrll ss = a & signmask;
3159 1.1 skrll if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
3160 1.1 skrll return TRUE;
3161 1.1 skrll
3162 1.1 skrll /* We only need this next bit of code if the sign bit of B
3163 1.1 skrll is below the sign bit of A. This would only happen if
3164 1.1 skrll SRC_MASK had fewer bits than BITSIZE. Note that if
3165 1.1 skrll SRC_MASK has more bits than BITSIZE, we can get into
3166 1.1 skrll trouble; we would need to verify that B is in range, as
3167 1.1 skrll we do for A above. */
3168 1.1 skrll signmask = ((~ howto->src_mask) >> 1) & howto->src_mask;
3169 1.1 skrll if ((b & signmask) != 0)
3170 1.1 skrll {
3171 1.1 skrll /* Set all the bits above the sign bit. */
3172 1.1 skrll b -= signmask <<= 1;
3173 1.1 skrll }
3174 1.1 skrll
3175 1.1 skrll b = (b & addrmask) >> howto->bitpos;
3176 1.1 skrll
3177 1.1 skrll /* Now we can do the addition. */
3178 1.1 skrll sum = a + b;
3179 1.1 skrll
3180 1.1 skrll /* See if the result has the correct sign. Bits above the
3181 1.1 skrll sign bit are junk now; ignore them. If the sum is
3182 1.1 skrll positive, make sure we did not have all negative inputs;
3183 1.1 skrll if the sum is negative, make sure we did not have all
3184 1.1 skrll positive inputs. The test below looks only at the sign
3185 1.1 skrll bits, and it really just
3186 1.1 skrll SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
3187 1.1 skrll */
3188 1.1 skrll signmask = (fieldmask >> 1) + 1;
3189 1.1 skrll if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3190 1.1 skrll return TRUE;
3191 1.1 skrll
3192 1.1 skrll return FALSE;
3193 1.1 skrll }
3194 1.1 skrll
3195 1.1 skrll static bfd_boolean
3196 1.1 skrll xcoff_complain_overflow_unsigned_func (input_bfd, val, relocation, howto)
3197 1.1 skrll bfd *input_bfd;
3198 1.1 skrll bfd_vma val;
3199 1.1 skrll bfd_vma relocation;
3200 1.1 skrll struct reloc_howto_struct *howto;
3201 1.1 skrll {
3202 1.1 skrll bfd_vma addrmask, fieldmask;
3203 1.1 skrll bfd_vma a, b, sum;
3204 1.1 skrll
3205 1.1 skrll /* Get the values to be added together. For signed and unsigned
3206 1.1 skrll relocations, we assume that all values should be truncated to
3207 1.1 skrll the size of an address. For bitfields, all the bits matter.
3208 1.1 skrll See also bfd_check_overflow. */
3209 1.1 skrll fieldmask = N_ONES (howto->bitsize);
3210 1.1 skrll addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3211 1.1 skrll a = relocation;
3212 1.1 skrll b = val & howto->src_mask;
3213 1.1 skrll
3214 1.1 skrll /* Checking for an unsigned overflow is relatively easy:
3215 1.1 skrll trim the addresses and add, and trim the result as well.
3216 1.1 skrll Overflow is normally indicated when the result does not
3217 1.1 skrll fit in the field. However, we also need to consider the
3218 1.1 skrll case when, e.g., fieldmask is 0x7fffffff or smaller, an
3219 1.1 skrll input is 0x80000000, and bfd_vma is only 32 bits; then we
3220 1.1 skrll will get sum == 0, but there is an overflow, since the
3221 1.1 skrll inputs did not fit in the field. Instead of doing a
3222 1.1 skrll separate test, we can check for this by or-ing in the
3223 1.1 skrll operands when testing for the sum overflowing its final
3224 1.1 skrll field. */
3225 1.1 skrll a = (a & addrmask) >> howto->rightshift;
3226 1.1 skrll b = (b & addrmask) >> howto->bitpos;
3227 1.1 skrll sum = (a + b) & addrmask;
3228 1.1 skrll if ((a | b | sum) & ~ fieldmask)
3229 1.1 skrll return TRUE;
3230 1.1 skrll
3231 1.1 skrll return FALSE;
3232 1.1 skrll }
3233 1.1 skrll
3234 1.1 skrll /* This is the relocation function for the RS/6000/POWER/PowerPC.
3235 1.1 skrll This is currently the only processor which uses XCOFF; I hope that
3236 1.1 skrll will never change.
3237 1.1 skrll
3238 1.1 skrll I took the relocation type definitions from two documents:
3239 1.1 skrll the PowerPC AIX Version 4 Application Binary Interface, First
3240 1.1 skrll Edition (April 1992), and the PowerOpen ABI, Big-Endian
3241 1.1 skrll 32-Bit Hardware Implementation (June 30, 1994). Differences
3242 1.1 skrll between the documents are noted below.
3243 1.1 skrll
3244 1.1 skrll Unsupported r_type's
3245 1.1 skrll
3246 1.1 skrll R_RTB:
3247 1.1 skrll R_RRTBI:
3248 1.1 skrll R_RRTBA:
3249 1.1 skrll
3250 1.1 skrll These relocs are defined by the PowerPC ABI to be
3251 1.1 skrll relative branches which use half of the difference
3252 1.1 skrll between the symbol and the program counter. I can't
3253 1.1 skrll quite figure out when this is useful. These relocs are
3254 1.1 skrll not defined by the PowerOpen ABI.
3255 1.1 skrll
3256 1.1 skrll Supported r_type's
3257 1.1 skrll
3258 1.1 skrll R_POS:
3259 1.1 skrll Simple positive relocation.
3260 1.1 skrll
3261 1.1 skrll R_NEG:
3262 1.1 skrll Simple negative relocation.
3263 1.1 skrll
3264 1.1 skrll R_REL:
3265 1.1 skrll Simple PC relative relocation.
3266 1.1 skrll
3267 1.1 skrll R_TOC:
3268 1.1 skrll TOC relative relocation. The value in the instruction in
3269 1.1 skrll the input file is the offset from the input file TOC to
3270 1.1 skrll the desired location. We want the offset from the final
3271 1.1 skrll TOC to the desired location. We have:
3272 1.1 skrll isym = iTOC + in
3273 1.1 skrll iinsn = in + o
3274 1.1 skrll osym = oTOC + on
3275 1.1 skrll oinsn = on + o
3276 1.1 skrll so we must change insn by on - in.
3277 1.1 skrll
3278 1.1 skrll R_GL:
3279 1.1 skrll GL linkage relocation. The value of this relocation
3280 1.1 skrll is the address of the entry in the TOC section.
3281 1.1 skrll
3282 1.1 skrll R_TCL:
3283 1.1 skrll Local object TOC address. I can't figure out the
3284 1.1 skrll difference between this and case R_GL.
3285 1.1 skrll
3286 1.1 skrll R_TRL:
3287 1.1 skrll TOC relative relocation. A TOC relative load instruction
3288 1.1 skrll which may be changed to a load address instruction.
3289 1.1 skrll FIXME: We don't currently implement this optimization.
3290 1.1 skrll
3291 1.1 skrll R_TRLA:
3292 1.1 skrll TOC relative relocation. This is a TOC relative load
3293 1.1 skrll address instruction which may be changed to a load
3294 1.1 skrll instruction. FIXME: I don't know if this is the correct
3295 1.1 skrll implementation.
3296 1.1 skrll
3297 1.1 skrll R_BA:
3298 1.1 skrll Absolute branch. We don't want to mess with the lower
3299 1.1 skrll two bits of the instruction.
3300 1.1 skrll
3301 1.1 skrll R_CAI:
3302 1.1 skrll The PowerPC ABI defines this as an absolute call which
3303 1.1 skrll may be modified to become a relative call. The PowerOpen
3304 1.1 skrll ABI does not define this relocation type.
3305 1.1 skrll
3306 1.1 skrll R_RBA:
3307 1.1 skrll Absolute branch which may be modified to become a
3308 1.1 skrll relative branch.
3309 1.1 skrll
3310 1.1 skrll R_RBAC:
3311 1.1 skrll The PowerPC ABI defines this as an absolute branch to a
3312 1.1 skrll fixed address which may be modified to an absolute branch
3313 1.1 skrll to a symbol. The PowerOpen ABI does not define this
3314 1.1 skrll relocation type.
3315 1.1 skrll
3316 1.1 skrll R_RBRC:
3317 1.1 skrll The PowerPC ABI defines this as an absolute branch to a
3318 1.1 skrll fixed address which may be modified to a relative branch.
3319 1.1 skrll The PowerOpen ABI does not define this relocation type.
3320 1.1 skrll
3321 1.1 skrll R_BR:
3322 1.1 skrll Relative branch. We don't want to mess with the lower
3323 1.1 skrll two bits of the instruction.
3324 1.1 skrll
3325 1.1 skrll R_CREL:
3326 1.1 skrll The PowerPC ABI defines this as a relative call which may
3327 1.1 skrll be modified to become an absolute call. The PowerOpen
3328 1.1 skrll ABI does not define this relocation type.
3329 1.1 skrll
3330 1.1 skrll R_RBR:
3331 1.1 skrll A relative branch which may be modified to become an
3332 1.1 skrll absolute branch. FIXME: We don't implement this,
3333 1.1 skrll although we should for symbols of storage mapping class
3334 1.1 skrll XMC_XO.
3335 1.1 skrll
3336 1.1 skrll R_RL:
3337 1.1 skrll The PowerPC AIX ABI describes this as a load which may be
3338 1.1 skrll changed to a load address. The PowerOpen ABI says this
3339 1.1 skrll is the same as case R_POS.
3340 1.1 skrll
3341 1.1 skrll R_RLA:
3342 1.1 skrll The PowerPC AIX ABI describes this as a load address
3343 1.1 skrll which may be changed to a load. The PowerOpen ABI says
3344 1.1 skrll this is the same as R_POS.
3345 1.1 skrll */
3346 1.1 skrll
3347 1.1 skrll bfd_boolean
3348 1.1 skrll xcoff_ppc_relocate_section (output_bfd, info, input_bfd,
3349 1.1 skrll input_section, contents, relocs, syms,
3350 1.1 skrll sections)
3351 1.1 skrll bfd *output_bfd;
3352 1.1 skrll struct bfd_link_info *info;
3353 1.1 skrll bfd *input_bfd;
3354 1.1 skrll asection *input_section;
3355 1.1 skrll bfd_byte *contents;
3356 1.1 skrll struct internal_reloc *relocs;
3357 1.1 skrll struct internal_syment *syms;
3358 1.1 skrll asection **sections;
3359 1.1 skrll {
3360 1.1 skrll struct internal_reloc *rel;
3361 1.1 skrll struct internal_reloc *relend;
3362 1.1 skrll
3363 1.1 skrll rel = relocs;
3364 1.1 skrll relend = rel + input_section->reloc_count;
3365 1.1 skrll for (; rel < relend; rel++)
3366 1.1 skrll {
3367 1.1 skrll long symndx;
3368 1.1 skrll struct xcoff_link_hash_entry *h;
3369 1.1 skrll struct internal_syment *sym;
3370 1.1 skrll bfd_vma addend;
3371 1.1 skrll bfd_vma val;
3372 1.1 skrll struct reloc_howto_struct howto;
3373 1.1 skrll bfd_vma relocation;
3374 1.1 skrll bfd_vma value_to_relocate;
3375 1.1 skrll bfd_vma address;
3376 1.1 skrll bfd_byte *location;
3377 1.1 skrll
3378 1.1 skrll /* Relocation type R_REF is a special relocation type which is
3379 1.1 skrll merely used to prevent garbage collection from occurring for
3380 1.1 skrll the csect including the symbol which it references. */
3381 1.1 skrll if (rel->r_type == R_REF)
3382 1.1 skrll continue;
3383 1.1 skrll
3384 1.1 skrll /* howto */
3385 1.1 skrll howto.type = rel->r_type;
3386 1.1 skrll howto.rightshift = 0;
3387 1.1 skrll howto.bitsize = (rel->r_size & 0x1f) + 1;
3388 1.1 skrll howto.size = howto.bitsize > 16 ? 2 : 1;
3389 1.1 skrll howto.pc_relative = FALSE;
3390 1.1 skrll howto.bitpos = 0;
3391 1.1 skrll howto.complain_on_overflow = (rel->r_size & 0x80
3392 1.1 skrll ? complain_overflow_signed
3393 1.1 skrll : complain_overflow_bitfield);
3394 1.1 skrll howto.special_function = NULL;
3395 1.1 skrll howto.name = "internal";
3396 1.1 skrll howto.partial_inplace = TRUE;
3397 1.1 skrll howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
3398 1.1 skrll howto.pcrel_offset = FALSE;
3399 1.1 skrll
3400 1.1 skrll /* symbol */
3401 1.1 skrll val = 0;
3402 1.1 skrll addend = 0;
3403 1.1 skrll h = NULL;
3404 1.1 skrll sym = NULL;
3405 1.1 skrll symndx = rel->r_symndx;
3406 1.1 skrll
3407 1.1 skrll if (-1 != symndx)
3408 1.1 skrll {
3409 1.1 skrll asection *sec;
3410 1.1 skrll
3411 1.1 skrll h = obj_xcoff_sym_hashes (input_bfd)[symndx];
3412 1.1 skrll sym = syms + symndx;
3413 1.1 skrll addend = - sym->n_value;
3414 1.1 skrll
3415 1.1 skrll if (NULL == h)
3416 1.1 skrll {
3417 1.1 skrll sec = sections[symndx];
3418 1.1 skrll /* Hack to make sure we use the right TOC anchor value
3419 1.1 skrll if this reloc is against the TOC anchor. */
3420 1.1 skrll if (sec->name[3] == '0'
3421 1.1 skrll && strcmp (sec->name, ".tc0") == 0)
3422 1.1 skrll val = xcoff_data (output_bfd)->toc;
3423 1.1 skrll else
3424 1.1 skrll val = (sec->output_section->vma
3425 1.1 skrll + sec->output_offset
3426 1.1 skrll + sym->n_value
3427 1.1 skrll - sec->vma);
3428 1.1 skrll }
3429 1.1 skrll else
3430 1.1 skrll {
3431 1.1 skrll if (h->root.type == bfd_link_hash_defined
3432 1.1 skrll || h->root.type == bfd_link_hash_defweak)
3433 1.1 skrll {
3434 1.1 skrll sec = h->root.u.def.section;
3435 1.1 skrll val = (h->root.u.def.value
3436 1.1 skrll + sec->output_section->vma
3437 1.1 skrll + sec->output_offset);
3438 1.1 skrll }
3439 1.1 skrll else if (h->root.type == bfd_link_hash_common)
3440 1.1 skrll {
3441 1.1 skrll sec = h->root.u.c.p->section;
3442 1.1 skrll val = (sec->output_section->vma
3443 1.1 skrll + sec->output_offset);
3444 1.1 skrll
3445 1.1 skrll }
3446 1.1 skrll else if ((0 == (h->flags & (XCOFF_DEF_DYNAMIC | XCOFF_IMPORT)))
3447 1.1 skrll && ! info->relocatable)
3448 1.1 skrll {
3449 1.1 skrll if (! ((*info->callbacks->undefined_symbol)
3450 1.1 skrll (info, h->root.root.string, input_bfd, input_section,
3451 1.1 skrll rel->r_vaddr - input_section->vma, TRUE)))
3452 1.1 skrll return FALSE;
3453 1.1 skrll
3454 1.1 skrll /* Don't try to process the reloc. It can't help, and
3455 1.1 skrll it may generate another error. */
3456 1.1 skrll continue;
3457 1.1 skrll }
3458 1.1 skrll }
3459 1.1 skrll }
3460 1.1 skrll
3461 1.1 skrll if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
3462 1.1 skrll || !((*xcoff_calculate_relocation[rel->r_type])
3463 1.1 skrll (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
3464 1.1 skrll addend, &relocation, contents)))
3465 1.1 skrll return FALSE;
3466 1.1 skrll
3467 1.1 skrll /* address */
3468 1.1 skrll address = rel->r_vaddr - input_section->vma;
3469 1.1 skrll location = contents + address;
3470 1.1 skrll
3471 1.1 skrll if (address > input_section->size)
3472 1.1 skrll abort ();
3473 1.1 skrll
3474 1.1 skrll /* Get the value we are going to relocate. */
3475 1.1 skrll if (1 == howto.size)
3476 1.1 skrll value_to_relocate = bfd_get_16 (input_bfd, location);
3477 1.1 skrll else
3478 1.1 skrll value_to_relocate = bfd_get_32 (input_bfd, location);
3479 1.1 skrll
3480 1.1 skrll /* overflow.
3481 1.1 skrll
3482 1.1 skrll FIXME: We may drop bits during the addition
3483 1.1 skrll which we don't check for. We must either check at every single
3484 1.1 skrll operation, which would be tedious, or we must do the computations
3485 1.1 skrll in a type larger than bfd_vma, which would be inefficient. */
3486 1.1 skrll
3487 1.1 skrll if ((unsigned int) howto.complain_on_overflow
3488 1.1 skrll >= XCOFF_MAX_COMPLAIN_OVERFLOW)
3489 1.1 skrll abort ();
3490 1.1 skrll
3491 1.1 skrll if (((*xcoff_complain_overflow[howto.complain_on_overflow])
3492 1.1 skrll (input_bfd, value_to_relocate, relocation, &howto)))
3493 1.1 skrll {
3494 1.1 skrll const char *name;
3495 1.1 skrll char buf[SYMNMLEN + 1];
3496 1.1 skrll char reloc_type_name[10];
3497 1.1 skrll
3498 1.1 skrll if (symndx == -1)
3499 1.1 skrll {
3500 1.1 skrll name = "*ABS*";
3501 1.1 skrll }
3502 1.1 skrll else if (h != NULL)
3503 1.1 skrll {
3504 1.1 skrll name = NULL;
3505 1.1 skrll }
3506 1.1 skrll else
3507 1.1 skrll {
3508 1.1 skrll name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
3509 1.1 skrll if (name == NULL)
3510 1.1 skrll name = "UNKNOWN";
3511 1.1 skrll }
3512 1.1 skrll sprintf (reloc_type_name, "0x%02x", rel->r_type);
3513 1.1 skrll
3514 1.1 skrll if (! ((*info->callbacks->reloc_overflow)
3515 1.1 skrll (info, (h ? &h->root : NULL), name, reloc_type_name,
3516 1.1 skrll (bfd_vma) 0, input_bfd, input_section,
3517 1.1 skrll rel->r_vaddr - input_section->vma)))
3518 1.1 skrll return FALSE;
3519 1.1 skrll }
3520 1.1 skrll
3521 1.1 skrll /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE. */
3522 1.1 skrll value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
3523 1.1 skrll | (((value_to_relocate & howto.src_mask)
3524 1.1 skrll + relocation) & howto.dst_mask));
3525 1.1 skrll
3526 1.1 skrll /* Put the value back in the object file. */
3527 1.1 skrll if (1 == howto.size)
3528 1.1 skrll bfd_put_16 (input_bfd, value_to_relocate, location);
3529 1.1 skrll else
3530 1.1 skrll bfd_put_32 (input_bfd, value_to_relocate, location);
3531 1.1 skrll }
3532 1.1 skrll
3533 1.1 skrll return TRUE;
3534 1.1 skrll }
3535 1.1 skrll
3536 1.1 skrll static bfd_boolean
3537 1.1 skrll _bfd_xcoff_put_ldsymbol_name (abfd, ldinfo, ldsym, name)
3538 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
3539 1.1 skrll struct xcoff_loader_info *ldinfo;
3540 1.1 skrll struct internal_ldsym *ldsym;
3541 1.1 skrll const char *name;
3542 1.1 skrll {
3543 1.1 skrll size_t len;
3544 1.1 skrll len = strlen (name);
3545 1.1 skrll
3546 1.1 skrll if (len <= SYMNMLEN)
3547 1.1 skrll strncpy (ldsym->_l._l_name, name, SYMNMLEN);
3548 1.1 skrll else
3549 1.1 skrll {
3550 1.1 skrll if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
3551 1.1 skrll {
3552 1.1 skrll bfd_size_type newalc;
3553 1.1 skrll char *newstrings;
3554 1.1 skrll
3555 1.1 skrll newalc = ldinfo->string_alc * 2;
3556 1.1 skrll if (newalc == 0)
3557 1.1 skrll newalc = 32;
3558 1.1 skrll while (ldinfo->string_size + len + 3 > newalc)
3559 1.1 skrll newalc *= 2;
3560 1.1 skrll
3561 1.1 skrll newstrings = bfd_realloc (ldinfo->strings, newalc);
3562 1.1 skrll if (newstrings == NULL)
3563 1.1 skrll {
3564 1.1 skrll ldinfo->failed = TRUE;
3565 1.1 skrll return FALSE;
3566 1.1 skrll }
3567 1.1 skrll ldinfo->string_alc = newalc;
3568 1.1 skrll ldinfo->strings = newstrings;
3569 1.1 skrll }
3570 1.1 skrll
3571 1.1 skrll bfd_put_16 (ldinfo->output_bfd, (bfd_vma) (len + 1),
3572 1.1 skrll ldinfo->strings + ldinfo->string_size);
3573 1.1 skrll strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
3574 1.1 skrll ldsym->_l._l_l._l_zeroes = 0;
3575 1.1 skrll ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
3576 1.1 skrll ldinfo->string_size += len + 3;
3577 1.1 skrll }
3578 1.1 skrll
3579 1.1 skrll return TRUE;
3580 1.1 skrll }
3581 1.1 skrll
3582 1.1 skrll static bfd_boolean
3583 1.1 skrll _bfd_xcoff_put_symbol_name (bfd *abfd, struct bfd_strtab_hash *strtab,
3584 1.1 skrll struct internal_syment *sym,
3585 1.1 skrll const char *name)
3586 1.1 skrll {
3587 1.1 skrll if (strlen (name) <= SYMNMLEN)
3588 1.1 skrll {
3589 1.1 skrll strncpy (sym->_n._n_name, name, SYMNMLEN);
3590 1.1 skrll }
3591 1.1 skrll else
3592 1.1 skrll {
3593 1.1 skrll bfd_boolean hash;
3594 1.1 skrll bfd_size_type indx;
3595 1.1 skrll
3596 1.1 skrll hash = TRUE;
3597 1.1 skrll if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
3598 1.1 skrll hash = FALSE;
3599 1.1 skrll indx = _bfd_stringtab_add (strtab, name, hash, FALSE);
3600 1.1 skrll if (indx == (bfd_size_type) -1)
3601 1.1 skrll return FALSE;
3602 1.1 skrll sym->_n._n_n._n_zeroes = 0;
3603 1.1 skrll sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
3604 1.1 skrll }
3605 1.1 skrll return TRUE;
3606 1.1 skrll }
3607 1.1 skrll
3608 1.1 skrll static asection *
3609 1.1 skrll xcoff_create_csect_from_smclas (abfd, aux, symbol_name)
3610 1.1 skrll bfd *abfd;
3611 1.1 skrll union internal_auxent *aux;
3612 1.1 skrll const char *symbol_name;
3613 1.1 skrll {
3614 1.1 skrll asection *return_value = NULL;
3615 1.1 skrll
3616 1.1 skrll /* .sv64 = x_smclas == 17
3617 1.1 skrll This is an invalid csect for 32 bit apps. */
3618 1.1 skrll static const char *names[19] =
3619 1.1 skrll {
3620 1.1 skrll ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
3621 1.1 skrll ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0",
3622 1.1 skrll ".td", NULL, ".sv3264"
3623 1.1 skrll };
3624 1.1 skrll
3625 1.1 skrll if ((19 >= aux->x_csect.x_smclas)
3626 1.1 skrll && (NULL != names[aux->x_csect.x_smclas]))
3627 1.1 skrll {
3628 1.1 skrll return_value = bfd_make_section_anyway
3629 1.1 skrll (abfd, names[aux->x_csect.x_smclas]);
3630 1.1 skrll }
3631 1.1 skrll else
3632 1.1 skrll {
3633 1.1 skrll (*_bfd_error_handler)
3634 1.1 skrll (_("%B: symbol `%s' has unrecognized smclas %d"),
3635 1.1 skrll abfd, symbol_name, aux->x_csect.x_smclas);
3636 1.1 skrll bfd_set_error (bfd_error_bad_value);
3637 1.1 skrll }
3638 1.1 skrll
3639 1.1 skrll return return_value;
3640 1.1 skrll }
3641 1.1 skrll
3642 1.1 skrll static bfd_boolean
3643 1.1 skrll xcoff_is_lineno_count_overflow (abfd, value)
3644 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
3645 1.1 skrll bfd_vma value;
3646 1.1 skrll {
3647 1.1 skrll if (0xffff <= value)
3648 1.1 skrll return TRUE;
3649 1.1 skrll
3650 1.1 skrll return FALSE;
3651 1.1 skrll }
3652 1.1 skrll
3653 1.1 skrll static bfd_boolean
3654 1.1 skrll xcoff_is_reloc_count_overflow (abfd, value)
3655 1.1 skrll bfd *abfd ATTRIBUTE_UNUSED;
3656 1.1 skrll bfd_vma value;
3657 1.1 skrll {
3658 1.1 skrll if (0xffff <= value)
3659 1.1 skrll return TRUE;
3660 1.1 skrll
3661 1.1 skrll return FALSE;
3662 1.1 skrll }
3663 1.1 skrll
3664 1.1 skrll static bfd_vma
3665 1.1 skrll xcoff_loader_symbol_offset (abfd, ldhdr)
3666 1.1 skrll bfd *abfd;
3667 1.1 skrll struct internal_ldhdr *ldhdr ATTRIBUTE_UNUSED;
3668 1.1 skrll {
3669 1.1 skrll return bfd_xcoff_ldhdrsz (abfd);
3670 1.1 skrll }
3671 1.1 skrll
3672 1.1 skrll static bfd_vma
3673 1.1 skrll xcoff_loader_reloc_offset (abfd, ldhdr)
3674 1.1 skrll bfd *abfd;
3675 1.1 skrll struct internal_ldhdr *ldhdr;
3676 1.1 skrll {
3677 1.1 skrll return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
3678 1.1 skrll }
3679 1.1 skrll
3680 1.1 skrll static bfd_boolean
3681 1.1 skrll xcoff_generate_rtinit (abfd, init, fini, rtld)
3682 1.1 skrll bfd *abfd;
3683 1.1 skrll const char *init;
3684 1.1 skrll const char *fini;
3685 1.1 skrll bfd_boolean rtld;
3686 1.1 skrll {
3687 1.1 skrll bfd_byte filehdr_ext[FILHSZ];
3688 1.1 skrll bfd_byte scnhdr_ext[SCNHSZ];
3689 1.1 skrll bfd_byte syment_ext[SYMESZ * 10];
3690 1.1 skrll bfd_byte reloc_ext[RELSZ * 3];
3691 1.1 skrll bfd_byte *data_buffer;
3692 1.1 skrll bfd_size_type data_buffer_size;
3693 1.1 skrll bfd_byte *string_table = NULL, *st_tmp = NULL;
3694 1.1 skrll bfd_size_type string_table_size;
3695 1.1 skrll bfd_vma val;
3696 1.1 skrll size_t initsz, finisz;
3697 1.1 skrll struct internal_filehdr filehdr;
3698 1.1 skrll struct internal_scnhdr scnhdr;
3699 1.1 skrll struct internal_syment syment;
3700 1.1 skrll union internal_auxent auxent;
3701 1.1 skrll struct internal_reloc reloc;
3702 1.1 skrll
3703 1.1 skrll char *data_name = ".data";
3704 1.1 skrll char *rtinit_name = "__rtinit";
3705 1.1 skrll char *rtld_name = "__rtld";
3706 1.1 skrll
3707 1.1 skrll if (! bfd_xcoff_rtinit_size (abfd))
3708 1.1 skrll return FALSE;
3709 1.1 skrll
3710 1.1 skrll initsz = (init == NULL ? 0 : 1 + strlen (init));
3711 1.1 skrll finisz = (fini == NULL ? 0 : 1 + strlen (fini));
3712 1.1 skrll
3713 1.1 skrll /* file header */
3714 1.1 skrll memset (filehdr_ext, 0, FILHSZ);
3715 1.1 skrll memset (&filehdr, 0, sizeof (struct internal_filehdr));
3716 1.1 skrll filehdr.f_magic = bfd_xcoff_magic_number (abfd);
3717 1.1 skrll filehdr.f_nscns = 1;
3718 1.1 skrll filehdr.f_timdat = 0;
3719 1.1 skrll filehdr.f_nsyms = 0; /* at least 6, no more than 10 */
3720 1.1 skrll filehdr.f_symptr = 0; /* set below */
3721 1.1 skrll filehdr.f_opthdr = 0;
3722 1.1 skrll filehdr.f_flags = 0;
3723 1.1 skrll
3724 1.1 skrll /* section header */
3725 1.1 skrll memset (scnhdr_ext, 0, SCNHSZ);
3726 1.1 skrll memset (&scnhdr, 0, sizeof (struct internal_scnhdr));
3727 1.1 skrll memcpy (scnhdr.s_name, data_name, strlen (data_name));
3728 1.1 skrll scnhdr.s_paddr = 0;
3729 1.1 skrll scnhdr.s_vaddr = 0;
3730 1.1 skrll scnhdr.s_size = 0; /* set below */
3731 1.1 skrll scnhdr.s_scnptr = FILHSZ + SCNHSZ;
3732 1.1 skrll scnhdr.s_relptr = 0; /* set below */
3733 1.1 skrll scnhdr.s_lnnoptr = 0;
3734 1.1 skrll scnhdr.s_nreloc = 0; /* either 1 or 2 */
3735 1.1 skrll scnhdr.s_nlnno = 0;
3736 1.1 skrll scnhdr.s_flags = STYP_DATA;
3737 1.1 skrll
3738 1.1 skrll /* .data
3739 1.1 skrll 0x0000 0x00000000 : rtl
3740 1.1 skrll 0x0004 0x00000010 : offset to init, or 0
3741 1.1 skrll 0x0008 0x00000028 : offset to fini, or 0
3742 1.1 skrll 0x000C 0x0000000C : size of descriptor
3743 1.1 skrll 0x0010 0x00000000 : init, needs a reloc
3744 1.1 skrll 0x0014 0x00000040 : offset to init name
3745 1.1 skrll 0x0018 0x00000000 : flags, padded to a word
3746 1.1 skrll 0x001C 0x00000000 : empty init
3747 1.1 skrll 0x0020 0x00000000 :
3748 1.1 skrll 0x0024 0x00000000 :
3749 1.1 skrll 0x0028 0x00000000 : fini, needs a reloc
3750 1.1 skrll 0x002C 0x00000??? : offset to fini name
3751 1.1 skrll 0x0030 0x00000000 : flags, padded to a word
3752 1.1 skrll 0x0034 0x00000000 : empty fini
3753 1.1 skrll 0x0038 0x00000000 :
3754 1.1 skrll 0x003C 0x00000000 :
3755 1.1 skrll 0x0040 init name
3756 1.1 skrll 0x0040 + initsz fini name */
3757 1.1 skrll
3758 1.1 skrll data_buffer_size = 0x0040 + initsz + finisz;
3759 1.1 skrll data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
3760 1.1 skrll data_buffer = NULL;
3761 1.1 skrll data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
3762 1.1 skrll if (data_buffer == NULL)
3763 1.1 skrll return FALSE;
3764 1.1 skrll
3765 1.1 skrll if (initsz)
3766 1.1 skrll {
3767 1.1 skrll val = 0x10;
3768 1.1 skrll bfd_h_put_32 (abfd, val, &data_buffer[0x04]);
3769 1.1 skrll val = 0x40;
3770 1.1 skrll bfd_h_put_32 (abfd, val, &data_buffer[0x14]);
3771 1.1 skrll memcpy (&data_buffer[val], init, initsz);
3772 1.1 skrll }
3773 1.1 skrll
3774 1.1 skrll if (finisz)
3775 1.1 skrll {
3776 1.1 skrll val = 0x28;
3777 1.1 skrll bfd_h_put_32 (abfd, val, &data_buffer[0x08]);
3778 1.1 skrll val = 0x40 + initsz;
3779 1.1 skrll bfd_h_put_32 (abfd, val, &data_buffer[0x2C]);
3780 1.1 skrll memcpy (&data_buffer[val], fini, finisz);
3781 1.1 skrll }
3782 1.1 skrll
3783 1.1 skrll val = 0x0C;
3784 1.1 skrll bfd_h_put_32 (abfd, val, &data_buffer[0x0C]);
3785 1.1 skrll
3786 1.1 skrll scnhdr.s_size = data_buffer_size;
3787 1.1 skrll
3788 1.1 skrll /* string table */
3789 1.1 skrll string_table_size = 0;
3790 1.1 skrll if (initsz > 9)
3791 1.1 skrll string_table_size += initsz;
3792 1.1 skrll if (finisz > 9)
3793 1.1 skrll string_table_size += finisz;
3794 1.1 skrll if (string_table_size)
3795 1.1 skrll {
3796 1.1 skrll string_table_size += 4;
3797 1.1 skrll string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
3798 1.1 skrll if (string_table == NULL)
3799 1.1 skrll return FALSE;
3800 1.1 skrll
3801 1.1 skrll val = string_table_size;
3802 1.1 skrll bfd_h_put_32 (abfd, val, &string_table[0]);
3803 1.1 skrll st_tmp = string_table + 4;
3804 1.1 skrll }
3805 1.1 skrll
3806 1.1 skrll /* symbols
3807 1.1 skrll 0. .data csect
3808 1.1 skrll 2. __rtinit
3809 1.1 skrll 4. init function
3810 1.1 skrll 6. fini function
3811 1.1 skrll 8. __rtld */
3812 1.1 skrll memset (syment_ext, 0, 10 * SYMESZ);
3813 1.1 skrll memset (reloc_ext, 0, 3 * RELSZ);
3814 1.1 skrll
3815 1.1 skrll /* .data csect */
3816 1.1 skrll memset (&syment, 0, sizeof (struct internal_syment));
3817 1.1 skrll memset (&auxent, 0, sizeof (union internal_auxent));
3818 1.1 skrll memcpy (syment._n._n_name, data_name, strlen (data_name));
3819 1.1 skrll syment.n_scnum = 1;
3820 1.1 skrll syment.n_sclass = C_HIDEXT;
3821 1.1 skrll syment.n_numaux = 1;
3822 1.1 skrll auxent.x_csect.x_scnlen.l = data_buffer_size;
3823 1.1 skrll auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
3824 1.1 skrll auxent.x_csect.x_smclas = XMC_RW;
3825 1.1 skrll bfd_coff_swap_sym_out (abfd, &syment,
3826 1.1 skrll &syment_ext[filehdr.f_nsyms * SYMESZ]);
3827 1.1 skrll bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3828 1.1 skrll syment.n_numaux,
3829 1.1 skrll &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3830 1.1 skrll filehdr.f_nsyms += 2;
3831 1.1 skrll
3832 1.1 skrll /* __rtinit */
3833 1.1 skrll memset (&syment, 0, sizeof (struct internal_syment));
3834 1.1 skrll memset (&auxent, 0, sizeof (union internal_auxent));
3835 1.1 skrll memcpy (syment._n._n_name, rtinit_name, strlen (rtinit_name));
3836 1.1 skrll syment.n_scnum = 1;
3837 1.1 skrll syment.n_sclass = C_EXT;
3838 1.1 skrll syment.n_numaux = 1;
3839 1.1 skrll auxent.x_csect.x_smtyp = XTY_LD;
3840 1.1 skrll auxent.x_csect.x_smclas = XMC_RW;
3841 1.1 skrll bfd_coff_swap_sym_out (abfd, &syment,
3842 1.1 skrll &syment_ext[filehdr.f_nsyms * SYMESZ]);
3843 1.1 skrll bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3844 1.1 skrll syment.n_numaux,
3845 1.1 skrll &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3846 1.1 skrll filehdr.f_nsyms += 2;
3847 1.1 skrll
3848 1.1 skrll /* init */
3849 1.1 skrll if (initsz)
3850 1.1 skrll {
3851 1.1 skrll memset (&syment, 0, sizeof (struct internal_syment));
3852 1.1 skrll memset (&auxent, 0, sizeof (union internal_auxent));
3853 1.1 skrll
3854 1.1 skrll if (initsz > 9)
3855 1.1 skrll {
3856 1.1 skrll syment._n._n_n._n_offset = st_tmp - string_table;
3857 1.1 skrll memcpy (st_tmp, init, initsz);
3858 1.1 skrll st_tmp += initsz;
3859 1.1 skrll }
3860 1.1 skrll else
3861 1.1 skrll memcpy (syment._n._n_name, init, initsz - 1);
3862 1.1 skrll
3863 1.1 skrll syment.n_sclass = C_EXT;
3864 1.1 skrll syment.n_numaux = 1;
3865 1.1 skrll bfd_coff_swap_sym_out (abfd, &syment,
3866 1.1 skrll &syment_ext[filehdr.f_nsyms * SYMESZ]);
3867 1.1 skrll bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3868 1.1 skrll syment.n_numaux,
3869 1.1 skrll &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3870 1.1 skrll
3871 1.1 skrll /* reloc */
3872 1.1 skrll memset (&reloc, 0, sizeof (struct internal_reloc));
3873 1.1 skrll reloc.r_vaddr = 0x0010;
3874 1.1 skrll reloc.r_symndx = filehdr.f_nsyms;
3875 1.1 skrll reloc.r_type = R_POS;
3876 1.1 skrll reloc.r_size = 31;
3877 1.1 skrll bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
3878 1.1 skrll
3879 1.1 skrll filehdr.f_nsyms += 2;
3880 1.1 skrll scnhdr.s_nreloc += 1;
3881 1.1 skrll }
3882 1.1 skrll
3883 1.1 skrll /* fini */
3884 1.1 skrll if (finisz)
3885 1.1 skrll {
3886 1.1 skrll memset (&syment, 0, sizeof (struct internal_syment));
3887 1.1 skrll memset (&auxent, 0, sizeof (union internal_auxent));
3888 1.1 skrll
3889 1.1 skrll if (finisz > 9)
3890 1.1 skrll {
3891 1.1 skrll syment._n._n_n._n_offset = st_tmp - string_table;
3892 1.1 skrll memcpy (st_tmp, fini, finisz);
3893 1.1 skrll st_tmp += finisz;
3894 1.1 skrll }
3895 1.1 skrll else
3896 1.1 skrll memcpy (syment._n._n_name, fini, finisz - 1);
3897 1.1 skrll
3898 1.1 skrll syment.n_sclass = C_EXT;
3899 1.1 skrll syment.n_numaux = 1;
3900 1.1 skrll bfd_coff_swap_sym_out (abfd, &syment,
3901 1.1 skrll &syment_ext[filehdr.f_nsyms * SYMESZ]);
3902 1.1 skrll bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3903 1.1 skrll syment.n_numaux,
3904 1.1 skrll &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3905 1.1 skrll
3906 1.1 skrll /* reloc */
3907 1.1 skrll memset (&reloc, 0, sizeof (struct internal_reloc));
3908 1.1 skrll reloc.r_vaddr = 0x0028;
3909 1.1 skrll reloc.r_symndx = filehdr.f_nsyms;
3910 1.1 skrll reloc.r_type = R_POS;
3911 1.1 skrll reloc.r_size = 31;
3912 1.1 skrll bfd_coff_swap_reloc_out (abfd, &reloc,
3913 1.1 skrll &reloc_ext[scnhdr.s_nreloc * RELSZ]);
3914 1.1 skrll
3915 1.1 skrll filehdr.f_nsyms += 2;
3916 1.1 skrll scnhdr.s_nreloc += 1;
3917 1.1 skrll }
3918 1.1 skrll
3919 1.1 skrll if (rtld)
3920 1.1 skrll {
3921 1.1 skrll memset (&syment, 0, sizeof (struct internal_syment));
3922 1.1 skrll memset (&auxent, 0, sizeof (union internal_auxent));
3923 1.1 skrll memcpy (syment._n._n_name, rtld_name, strlen (rtld_name));
3924 1.1 skrll syment.n_sclass = C_EXT;
3925 1.1 skrll syment.n_numaux = 1;
3926 1.1 skrll bfd_coff_swap_sym_out (abfd, &syment,
3927 1.1 skrll &syment_ext[filehdr.f_nsyms * SYMESZ]);
3928 1.1 skrll bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
3929 1.1 skrll syment.n_numaux,
3930 1.1 skrll &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
3931 1.1 skrll
3932 1.1 skrll /* reloc */
3933 1.1 skrll memset (&reloc, 0, sizeof (struct internal_reloc));
3934 1.1 skrll reloc.r_vaddr = 0x0000;
3935 1.1 skrll reloc.r_symndx = filehdr.f_nsyms;
3936 1.1 skrll reloc.r_type = R_POS;
3937 1.1 skrll reloc.r_size = 31;
3938 1.1 skrll bfd_coff_swap_reloc_out (abfd, &reloc,
3939 1.1 skrll &reloc_ext[scnhdr.s_nreloc * RELSZ]);
3940 1.1 skrll
3941 1.1 skrll filehdr.f_nsyms += 2;
3942 1.1 skrll scnhdr.s_nreloc += 1;
3943 1.1 skrll }
3944 1.1 skrll
3945 1.1 skrll scnhdr.s_relptr = scnhdr.s_scnptr + data_buffer_size;
3946 1.1 skrll filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
3947 1.1 skrll
3948 1.1 skrll bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
3949 1.1 skrll bfd_bwrite (filehdr_ext, FILHSZ, abfd);
3950 1.1 skrll bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext);
3951 1.1 skrll bfd_bwrite (scnhdr_ext, SCNHSZ, abfd);
3952 1.1 skrll bfd_bwrite (data_buffer, data_buffer_size, abfd);
3953 1.1 skrll bfd_bwrite (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd);
3954 1.1 skrll bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
3955 1.1 skrll bfd_bwrite (string_table, string_table_size, abfd);
3956 1.1 skrll
3957 1.1 skrll free (data_buffer);
3958 1.1 skrll data_buffer = NULL;
3959 1.1 skrll
3960 1.1 skrll return TRUE;
3961 1.1 skrll }
3962 1.1 skrll
3963 1.1 skrll
3964 1.1 skrll static reloc_howto_type xcoff_dynamic_reloc =
3965 1.1 skrll HOWTO (0, /* type */
3966 1.1 skrll 0, /* rightshift */
3967 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
3968 1.1 skrll 32, /* bitsize */
3969 1.1 skrll FALSE, /* pc_relative */
3970 1.1 skrll 0, /* bitpos */
3971 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
3972 1.1 skrll 0, /* special_function */
3973 1.1 skrll "R_POS", /* name */
3974 1.1 skrll TRUE, /* partial_inplace */
3975 1.1 skrll 0xffffffff, /* src_mask */
3976 1.1 skrll 0xffffffff, /* dst_mask */
3977 1.1 skrll FALSE); /* pcrel_offset */
3978 1.1 skrll
3979 1.1 skrll /* glink
3980 1.1 skrll
3981 1.1 skrll The first word of global linkage code must be modified by filling in
3982 1.1 skrll the correct TOC offset. */
3983 1.1 skrll
3984 1.1 skrll static unsigned long xcoff_glink_code[9] =
3985 1.1 skrll {
3986 1.1 skrll 0x81820000, /* lwz r12,0(r2) */
3987 1.1 skrll 0x90410014, /* stw r2,20(r1) */
3988 1.1 skrll 0x800c0000, /* lwz r0,0(r12) */
3989 1.1 skrll 0x804c0004, /* lwz r2,4(r12) */
3990 1.1 skrll 0x7c0903a6, /* mtctr r0 */
3991 1.1 skrll 0x4e800420, /* bctr */
3992 1.1 skrll 0x00000000, /* start of traceback table */
3993 1.1 skrll 0x000c8000, /* traceback table */
3994 1.1 skrll 0x00000000, /* traceback table */
3995 1.1 skrll };
3996 1.1 skrll
3997 1.1 skrll
3998 1.1 skrll static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
3999 1.1 skrll {
4000 1.1 skrll { /* COFF backend, defined in libcoff.h. */
4001 1.1 skrll _bfd_xcoff_swap_aux_in,
4002 1.1 skrll _bfd_xcoff_swap_sym_in,
4003 1.1 skrll coff_swap_lineno_in,
4004 1.1 skrll _bfd_xcoff_swap_aux_out,
4005 1.1 skrll _bfd_xcoff_swap_sym_out,
4006 1.1 skrll coff_swap_lineno_out,
4007 1.1 skrll xcoff_swap_reloc_out,
4008 1.1 skrll coff_swap_filehdr_out,
4009 1.1 skrll coff_swap_aouthdr_out,
4010 1.1 skrll coff_swap_scnhdr_out,
4011 1.1 skrll FILHSZ,
4012 1.1 skrll AOUTSZ,
4013 1.1 skrll SCNHSZ,
4014 1.1 skrll SYMESZ,
4015 1.1 skrll AUXESZ,
4016 1.1 skrll RELSZ,
4017 1.1 skrll LINESZ,
4018 1.1 skrll FILNMLEN,
4019 1.1 skrll TRUE, /* _bfd_coff_long_filenames */
4020 1.1 skrll FALSE, /* _bfd_coff_long_section_names */
4021 1.1 skrll 3, /* _bfd_coff_default_section_alignment_power */
4022 1.1 skrll FALSE, /* _bfd_coff_force_symnames_in_strings */
4023 1.1 skrll 2, /* _bfd_coff_debug_string_prefix_length */
4024 1.1 skrll coff_swap_filehdr_in,
4025 1.1 skrll coff_swap_aouthdr_in,
4026 1.1 skrll coff_swap_scnhdr_in,
4027 1.1 skrll xcoff_swap_reloc_in,
4028 1.1 skrll coff_bad_format_hook,
4029 1.1 skrll coff_set_arch_mach_hook,
4030 1.1 skrll coff_mkobject_hook,
4031 1.1 skrll styp_to_sec_flags,
4032 1.1 skrll coff_set_alignment_hook,
4033 1.1 skrll coff_slurp_symbol_table,
4034 1.1 skrll symname_in_debug_hook,
4035 1.1 skrll coff_pointerize_aux_hook,
4036 1.1 skrll coff_print_aux,
4037 1.1 skrll dummy_reloc16_extra_cases,
4038 1.1 skrll dummy_reloc16_estimate,
4039 1.1 skrll NULL, /* bfd_coff_sym_is_global */
4040 1.1 skrll coff_compute_section_file_positions,
4041 1.1 skrll NULL, /* _bfd_coff_start_final_link */
4042 1.1 skrll xcoff_ppc_relocate_section,
4043 1.1 skrll coff_rtype_to_howto,
4044 1.1 skrll NULL, /* _bfd_coff_adjust_symndx */
4045 1.1 skrll _bfd_generic_link_add_one_symbol,
4046 1.1 skrll coff_link_output_has_begun,
4047 1.1 skrll coff_final_link_postscript,
4048 1.1 skrll NULL /* print_pdata. */
4049 1.1 skrll },
4050 1.1 skrll
4051 1.1 skrll 0x01DF, /* magic number */
4052 1.1 skrll bfd_arch_rs6000,
4053 1.1 skrll bfd_mach_rs6k,
4054 1.1 skrll
4055 1.1 skrll /* Function pointers to xcoff specific swap routines. */
4056 1.1 skrll xcoff_swap_ldhdr_in,
4057 1.1 skrll xcoff_swap_ldhdr_out,
4058 1.1 skrll xcoff_swap_ldsym_in,
4059 1.1 skrll xcoff_swap_ldsym_out,
4060 1.1 skrll xcoff_swap_ldrel_in,
4061 1.1 skrll xcoff_swap_ldrel_out,
4062 1.1 skrll
4063 1.1 skrll /* Sizes. */
4064 1.1 skrll LDHDRSZ,
4065 1.1 skrll LDSYMSZ,
4066 1.1 skrll LDRELSZ,
4067 1.1 skrll 12, /* _xcoff_function_descriptor_size */
4068 1.1 skrll SMALL_AOUTSZ,
4069 1.1 skrll
4070 1.1 skrll /* Versions. */
4071 1.1 skrll 1, /* _xcoff_ldhdr_version */
4072 1.1 skrll
4073 1.1 skrll _bfd_xcoff_put_symbol_name,
4074 1.1 skrll _bfd_xcoff_put_ldsymbol_name,
4075 1.1 skrll &xcoff_dynamic_reloc,
4076 1.1 skrll xcoff_create_csect_from_smclas,
4077 1.1 skrll
4078 1.1 skrll /* Lineno and reloc count overflow. */
4079 1.1 skrll xcoff_is_lineno_count_overflow,
4080 1.1 skrll xcoff_is_reloc_count_overflow,
4081 1.1 skrll
4082 1.1 skrll xcoff_loader_symbol_offset,
4083 1.1 skrll xcoff_loader_reloc_offset,
4084 1.1 skrll
4085 1.1 skrll /* glink. */
4086 1.1 skrll &xcoff_glink_code[0],
4087 1.1 skrll 36, /* _xcoff_glink_size */
4088 1.1 skrll
4089 1.1 skrll /* rtinit */
4090 1.1 skrll 64, /* _xcoff_rtinit_size */
4091 1.1 skrll xcoff_generate_rtinit,
4092 1.1 skrll };
4093 1.1 skrll
4094 1.1 skrll /* The transfer vector that leads the outside world to all of the above. */
4095 1.1 skrll const bfd_target rs6000coff_vec =
4096 1.1 skrll {
4097 1.1 skrll "aixcoff-rs6000",
4098 1.1 skrll bfd_target_xcoff_flavour,
4099 1.1 skrll BFD_ENDIAN_BIG, /* data byte order is big */
4100 1.1 skrll BFD_ENDIAN_BIG, /* header byte order is big */
4101 1.1 skrll
4102 1.1 skrll (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4103 1.1 skrll | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4104 1.1 skrll
4105 1.1 skrll SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4106 1.1 skrll 0, /* leading char */
4107 1.1 skrll '/', /* ar_pad_char */
4108 1.1 skrll 15, /* ar_max_namelen */
4109 1.1 skrll
4110 1.1 skrll /* data */
4111 1.1 skrll bfd_getb64,
4112 1.1 skrll bfd_getb_signed_64,
4113 1.1 skrll bfd_putb64,
4114 1.1 skrll bfd_getb32,
4115 1.1 skrll bfd_getb_signed_32,
4116 1.1 skrll bfd_putb32,
4117 1.1 skrll bfd_getb16,
4118 1.1 skrll bfd_getb_signed_16,
4119 1.1 skrll bfd_putb16,
4120 1.1 skrll
4121 1.1 skrll /* hdrs */
4122 1.1 skrll bfd_getb64,
4123 1.1 skrll bfd_getb_signed_64,
4124 1.1 skrll bfd_putb64,
4125 1.1 skrll bfd_getb32,
4126 1.1 skrll bfd_getb_signed_32,
4127 1.1 skrll bfd_putb32,
4128 1.1 skrll bfd_getb16,
4129 1.1 skrll bfd_getb_signed_16,
4130 1.1 skrll bfd_putb16,
4131 1.1 skrll
4132 1.1 skrll { /* bfd_check_format */
4133 1.1 skrll _bfd_dummy_target,
4134 1.1 skrll coff_object_p,
4135 1.1 skrll _bfd_xcoff_archive_p,
4136 1.1 skrll CORE_FILE_P
4137 1.1 skrll },
4138 1.1 skrll
4139 1.1 skrll { /* bfd_set_format */
4140 1.1 skrll bfd_false,
4141 1.1 skrll coff_mkobject,
4142 1.1 skrll _bfd_generic_mkarchive,
4143 1.1 skrll bfd_false
4144 1.1 skrll },
4145 1.1 skrll
4146 1.1 skrll {/* bfd_write_contents */
4147 1.1 skrll bfd_false,
4148 1.1 skrll coff_write_object_contents,
4149 1.1 skrll _bfd_xcoff_write_archive_contents,
4150 1.1 skrll bfd_false
4151 1.1 skrll },
4152 1.1 skrll
4153 1.1 skrll /* Generic */
4154 1.1 skrll bfd_true,
4155 1.1 skrll bfd_true,
4156 1.1 skrll coff_new_section_hook,
4157 1.1 skrll _bfd_generic_get_section_contents,
4158 1.1 skrll _bfd_generic_get_section_contents_in_window,
4159 1.1 skrll
4160 1.1 skrll /* Copy */
4161 1.1 skrll _bfd_xcoff_copy_private_bfd_data,
4162 1.1 skrll ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
4163 1.1 skrll _bfd_generic_init_private_section_data,
4164 1.1 skrll ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true),
4165 1.1 skrll ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true),
4166 1.1 skrll ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
4167 1.1 skrll ((bfd_boolean (*) (bfd *, flagword)) bfd_true),
4168 1.1 skrll ((bfd_boolean (*) (bfd *, void * )) bfd_true),
4169 1.1 skrll
4170 1.1 skrll /* Core */
4171 1.1 skrll coff_core_file_failing_command,
4172 1.1 skrll coff_core_file_failing_signal,
4173 1.1 skrll coff_core_file_matches_executable_p,
4174 1.1 skrll
4175 1.1 skrll /* Archive */
4176 1.1 skrll _bfd_xcoff_slurp_armap,
4177 1.1 skrll bfd_false,
4178 1.1 skrll ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_false),
4179 1.1 skrll bfd_dont_truncate_arname,
4180 1.1 skrll _bfd_xcoff_write_armap,
4181 1.1 skrll _bfd_xcoff_read_ar_hdr,
4182 1.1 skrll _bfd_xcoff_openr_next_archived_file,
4183 1.1 skrll _bfd_generic_get_elt_at_index,
4184 1.1 skrll _bfd_xcoff_stat_arch_elt,
4185 1.1 skrll bfd_true,
4186 1.1 skrll
4187 1.1 skrll /* Symbols */
4188 1.1 skrll coff_get_symtab_upper_bound,
4189 1.1 skrll coff_canonicalize_symtab,
4190 1.1 skrll coff_make_empty_symbol,
4191 1.1 skrll coff_print_symbol,
4192 1.1 skrll coff_get_symbol_info,
4193 1.1 skrll _bfd_xcoff_is_local_label_name,
4194 1.1 skrll coff_bfd_is_target_special_symbol,
4195 1.1 skrll coff_get_lineno,
4196 1.1 skrll coff_find_nearest_line,
4197 1.1 skrll _bfd_generic_find_line,
4198 1.1 skrll coff_find_inliner_info,
4199 1.1 skrll coff_bfd_make_debug_symbol,
4200 1.1 skrll _bfd_generic_read_minisymbols,
4201 1.1 skrll _bfd_generic_minisymbol_to_symbol,
4202 1.1 skrll
4203 1.1 skrll /* Reloc */
4204 1.1 skrll coff_get_reloc_upper_bound,
4205 1.1 skrll coff_canonicalize_reloc,
4206 1.1 skrll _bfd_xcoff_reloc_type_lookup,
4207 1.1 skrll _bfd_xcoff_reloc_name_lookup,
4208 1.1 skrll
4209 1.1 skrll /* Write */
4210 1.1 skrll coff_set_arch_mach,
4211 1.1 skrll coff_set_section_contents,
4212 1.1 skrll
4213 1.1 skrll /* Link */
4214 1.1 skrll _bfd_xcoff_sizeof_headers,
4215 1.1 skrll bfd_generic_get_relocated_section_contents,
4216 1.1 skrll bfd_generic_relax_section,
4217 1.1 skrll _bfd_xcoff_bfd_link_hash_table_create,
4218 1.1 skrll _bfd_generic_link_hash_table_free,
4219 1.1 skrll _bfd_xcoff_bfd_link_add_symbols,
4220 1.1 skrll _bfd_generic_link_just_syms,
4221 1.1 skrll _bfd_xcoff_bfd_final_link,
4222 1.1 skrll _bfd_generic_link_split_section,
4223 1.1 skrll bfd_generic_gc_sections,
4224 1.1 skrll bfd_generic_merge_sections,
4225 1.1 skrll bfd_generic_is_group_section,
4226 1.1 skrll bfd_generic_discard_group,
4227 1.1 skrll _bfd_generic_section_already_linked,
4228 1.1 skrll
4229 1.1 skrll /* Dynamic */
4230 1.1 skrll _bfd_xcoff_get_dynamic_symtab_upper_bound,
4231 1.1 skrll _bfd_xcoff_canonicalize_dynamic_symtab,
4232 1.1 skrll _bfd_nodynamic_get_synthetic_symtab,
4233 1.1 skrll _bfd_xcoff_get_dynamic_reloc_upper_bound,
4234 1.1 skrll _bfd_xcoff_canonicalize_dynamic_reloc,
4235 1.1 skrll
4236 1.1 skrll /* Opposite endian version, none exists */
4237 1.1 skrll NULL,
4238 1.1 skrll
4239 1.1 skrll (void *) &bfd_xcoff_backend_data,
4240 1.1 skrll };
4241 1.1 skrll
4242 1.1 skrll /* xcoff-powermac target
4243 1.1 skrll Old target.
4244 1.1 skrll Only difference between this target and the rs6000 target is the
4245 1.1 skrll the default architecture and machine type used in coffcode.h
4246 1.1 skrll
4247 1.1 skrll PowerPC Macs use the same magic numbers as RS/6000
4248 1.1 skrll (because that's how they were bootstrapped originally),
4249 1.1 skrll but they are always PowerPC architecture. */
4250 1.1 skrll static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
4251 1.1 skrll {
4252 1.1 skrll { /* COFF backend, defined in libcoff.h. */
4253 1.1 skrll _bfd_xcoff_swap_aux_in,
4254 1.1 skrll _bfd_xcoff_swap_sym_in,
4255 1.1 skrll coff_swap_lineno_in,
4256 1.1 skrll _bfd_xcoff_swap_aux_out,
4257 1.1 skrll _bfd_xcoff_swap_sym_out,
4258 1.1 skrll coff_swap_lineno_out,
4259 1.1 skrll xcoff_swap_reloc_out,
4260 1.1 skrll coff_swap_filehdr_out,
4261 1.1 skrll coff_swap_aouthdr_out,
4262 1.1 skrll coff_swap_scnhdr_out,
4263 1.1 skrll FILHSZ,
4264 1.1 skrll AOUTSZ,
4265 1.1 skrll SCNHSZ,
4266 1.1 skrll SYMESZ,
4267 1.1 skrll AUXESZ,
4268 1.1 skrll RELSZ,
4269 1.1 skrll LINESZ,
4270 1.1 skrll FILNMLEN,
4271 1.1 skrll TRUE, /* _bfd_coff_long_filenames */
4272 1.1 skrll FALSE, /* _bfd_coff_long_section_names */
4273 1.1 skrll 3, /* _bfd_coff_default_section_alignment_power */
4274 1.1 skrll FALSE, /* _bfd_coff_force_symnames_in_strings */
4275 1.1 skrll 2, /* _bfd_coff_debug_string_prefix_length */
4276 1.1 skrll coff_swap_filehdr_in,
4277 1.1 skrll coff_swap_aouthdr_in,
4278 1.1 skrll coff_swap_scnhdr_in,
4279 1.1 skrll xcoff_swap_reloc_in,
4280 1.1 skrll coff_bad_format_hook,
4281 1.1 skrll coff_set_arch_mach_hook,
4282 1.1 skrll coff_mkobject_hook,
4283 1.1 skrll styp_to_sec_flags,
4284 1.1 skrll coff_set_alignment_hook,
4285 1.1 skrll coff_slurp_symbol_table,
4286 1.1 skrll symname_in_debug_hook,
4287 1.1 skrll coff_pointerize_aux_hook,
4288 1.1 skrll coff_print_aux,
4289 1.1 skrll dummy_reloc16_extra_cases,
4290 1.1 skrll dummy_reloc16_estimate,
4291 1.1 skrll NULL, /* bfd_coff_sym_is_global */
4292 1.1 skrll coff_compute_section_file_positions,
4293 1.1 skrll NULL, /* _bfd_coff_start_final_link */
4294 1.1 skrll xcoff_ppc_relocate_section,
4295 1.1 skrll coff_rtype_to_howto,
4296 1.1 skrll NULL, /* _bfd_coff_adjust_symndx */
4297 1.1 skrll _bfd_generic_link_add_one_symbol,
4298 1.1 skrll coff_link_output_has_begun,
4299 1.1 skrll coff_final_link_postscript,
4300 1.1 skrll NULL /* print_pdata. */
4301 1.1 skrll },
4302 1.1 skrll
4303 1.1 skrll 0x01DF, /* magic number */
4304 1.1 skrll bfd_arch_powerpc,
4305 1.1 skrll bfd_mach_ppc,
4306 1.1 skrll
4307 1.1 skrll /* Function pointers to xcoff specific swap routines. */
4308 1.1 skrll xcoff_swap_ldhdr_in,
4309 1.1 skrll xcoff_swap_ldhdr_out,
4310 1.1 skrll xcoff_swap_ldsym_in,
4311 1.1 skrll xcoff_swap_ldsym_out,
4312 1.1 skrll xcoff_swap_ldrel_in,
4313 1.1 skrll xcoff_swap_ldrel_out,
4314 1.1 skrll
4315 1.1 skrll /* Sizes. */
4316 1.1 skrll LDHDRSZ,
4317 1.1 skrll LDSYMSZ,
4318 1.1 skrll LDRELSZ,
4319 1.1 skrll 12, /* _xcoff_function_descriptor_size */
4320 1.1 skrll SMALL_AOUTSZ,
4321 1.1 skrll
4322 1.1 skrll /* Versions. */
4323 1.1 skrll 1, /* _xcoff_ldhdr_version */
4324 1.1 skrll
4325 1.1 skrll _bfd_xcoff_put_symbol_name,
4326 1.1 skrll _bfd_xcoff_put_ldsymbol_name,
4327 1.1 skrll &xcoff_dynamic_reloc,
4328 1.1 skrll xcoff_create_csect_from_smclas,
4329 1.1 skrll
4330 1.1 skrll /* Lineno and reloc count overflow. */
4331 1.1 skrll xcoff_is_lineno_count_overflow,
4332 1.1 skrll xcoff_is_reloc_count_overflow,
4333 1.1 skrll
4334 1.1 skrll xcoff_loader_symbol_offset,
4335 1.1 skrll xcoff_loader_reloc_offset,
4336 1.1 skrll
4337 1.1 skrll /* glink. */
4338 1.1 skrll &xcoff_glink_code[0],
4339 1.1 skrll 36, /* _xcoff_glink_size */
4340 1.1 skrll
4341 1.1 skrll /* rtinit */
4342 1.1 skrll 0, /* _xcoff_rtinit_size */
4343 1.1 skrll xcoff_generate_rtinit,
4344 1.1 skrll };
4345 1.1 skrll
4346 1.1 skrll /* The transfer vector that leads the outside world to all of the above. */
4347 1.1 skrll const bfd_target pmac_xcoff_vec =
4348 1.1 skrll {
4349 1.1 skrll "xcoff-powermac",
4350 1.1 skrll bfd_target_xcoff_flavour,
4351 1.1 skrll BFD_ENDIAN_BIG, /* data byte order is big */
4352 1.1 skrll BFD_ENDIAN_BIG, /* header byte order is big */
4353 1.1 skrll
4354 1.1 skrll (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4355 1.1 skrll | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4356 1.1 skrll
4357 1.1 skrll SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4358 1.1 skrll 0, /* leading char */
4359 1.1 skrll '/', /* ar_pad_char */
4360 1.1 skrll 15, /* ar_max_namelen */
4361 1.1 skrll
4362 1.1 skrll /* data */
4363 1.1 skrll bfd_getb64,
4364 1.1 skrll bfd_getb_signed_64,
4365 1.1 skrll bfd_putb64,
4366 1.1 skrll bfd_getb32,
4367 1.1 skrll bfd_getb_signed_32,
4368 1.1 skrll bfd_putb32,
4369 1.1 skrll bfd_getb16,
4370 1.1 skrll bfd_getb_signed_16,
4371 1.1 skrll bfd_putb16,
4372 1.1 skrll
4373 1.1 skrll /* hdrs */
4374 1.1 skrll bfd_getb64,
4375 1.1 skrll bfd_getb_signed_64,
4376 1.1 skrll bfd_putb64,
4377 1.1 skrll bfd_getb32,
4378 1.1 skrll bfd_getb_signed_32,
4379 1.1 skrll bfd_putb32,
4380 1.1 skrll bfd_getb16,
4381 1.1 skrll bfd_getb_signed_16,
4382 1.1 skrll bfd_putb16,
4383 1.1 skrll
4384 1.1 skrll { /* bfd_check_format */
4385 1.1 skrll _bfd_dummy_target,
4386 1.1 skrll coff_object_p,
4387 1.1 skrll _bfd_xcoff_archive_p,
4388 1.1 skrll CORE_FILE_P
4389 1.1 skrll },
4390 1.1 skrll
4391 1.1 skrll { /* bfd_set_format */
4392 1.1 skrll bfd_false,
4393 1.1 skrll coff_mkobject,
4394 1.1 skrll _bfd_generic_mkarchive,
4395 1.1 skrll bfd_false
4396 1.1 skrll },
4397 1.1 skrll
4398 1.1 skrll {/* bfd_write_contents */
4399 1.1 skrll bfd_false,
4400 1.1 skrll coff_write_object_contents,
4401 1.1 skrll _bfd_xcoff_write_archive_contents,
4402 1.1 skrll bfd_false
4403 1.1 skrll },
4404 1.1 skrll
4405 1.1 skrll /* Generic */
4406 1.1 skrll bfd_true,
4407 1.1 skrll bfd_true,
4408 1.1 skrll coff_new_section_hook,
4409 1.1 skrll _bfd_generic_get_section_contents,
4410 1.1 skrll _bfd_generic_get_section_contents_in_window,
4411 1.1 skrll
4412 1.1 skrll /* Copy */
4413 1.1 skrll _bfd_xcoff_copy_private_bfd_data,
4414 1.1 skrll ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
4415 1.1 skrll _bfd_generic_init_private_section_data,
4416 1.1 skrll ((bfd_boolean (*) (bfd *, asection *, bfd *, asection *)) bfd_true),
4417 1.1 skrll ((bfd_boolean (*) (bfd *, asymbol *, bfd *, asymbol *)) bfd_true),
4418 1.1 skrll ((bfd_boolean (*) (bfd *, bfd *)) bfd_true),
4419 1.1 skrll ((bfd_boolean (*) (bfd *, flagword)) bfd_true),
4420 1.1 skrll ((bfd_boolean (*) (bfd *, void * )) bfd_true),
4421 1.1 skrll
4422 1.1 skrll /* Core */
4423 1.1 skrll coff_core_file_failing_command,
4424 1.1 skrll coff_core_file_failing_signal,
4425 1.1 skrll coff_core_file_matches_executable_p,
4426 1.1 skrll
4427 1.1 skrll /* Archive */
4428 1.1 skrll _bfd_xcoff_slurp_armap,
4429 1.1 skrll bfd_false,
4430 1.1 skrll ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_false),
4431 1.1 skrll bfd_dont_truncate_arname,
4432 1.1 skrll _bfd_xcoff_write_armap,
4433 1.1 skrll _bfd_xcoff_read_ar_hdr,
4434 1.1 skrll _bfd_xcoff_openr_next_archived_file,
4435 1.1 skrll _bfd_generic_get_elt_at_index,
4436 1.1 skrll _bfd_xcoff_stat_arch_elt,
4437 1.1 skrll bfd_true,
4438 1.1 skrll
4439 1.1 skrll /* Symbols */
4440 1.1 skrll coff_get_symtab_upper_bound,
4441 1.1 skrll coff_canonicalize_symtab,
4442 1.1 skrll coff_make_empty_symbol,
4443 1.1 skrll coff_print_symbol,
4444 1.1 skrll coff_get_symbol_info,
4445 1.1 skrll _bfd_xcoff_is_local_label_name,
4446 1.1 skrll coff_bfd_is_target_special_symbol,
4447 1.1 skrll coff_get_lineno,
4448 1.1 skrll coff_find_nearest_line,
4449 1.1 skrll _bfd_generic_find_line,
4450 1.1 skrll coff_find_inliner_info,
4451 1.1 skrll coff_bfd_make_debug_symbol,
4452 1.1 skrll _bfd_generic_read_minisymbols,
4453 1.1 skrll _bfd_generic_minisymbol_to_symbol,
4454 1.1 skrll
4455 1.1 skrll /* Reloc */
4456 1.1 skrll coff_get_reloc_upper_bound,
4457 1.1 skrll coff_canonicalize_reloc,
4458 1.1 skrll _bfd_xcoff_reloc_type_lookup,
4459 1.1 skrll _bfd_xcoff_reloc_name_lookup,
4460 1.1 skrll
4461 1.1 skrll /* Write */
4462 1.1 skrll coff_set_arch_mach,
4463 1.1 skrll coff_set_section_contents,
4464 1.1 skrll
4465 1.1 skrll /* Link */
4466 1.1 skrll _bfd_xcoff_sizeof_headers,
4467 1.1 skrll bfd_generic_get_relocated_section_contents,
4468 1.1 skrll bfd_generic_relax_section,
4469 1.1 skrll _bfd_xcoff_bfd_link_hash_table_create,
4470 1.1 skrll _bfd_generic_link_hash_table_free,
4471 1.1 skrll _bfd_xcoff_bfd_link_add_symbols,
4472 1.1 skrll _bfd_generic_link_just_syms,
4473 1.1 skrll _bfd_xcoff_bfd_final_link,
4474 1.1 skrll _bfd_generic_link_split_section,
4475 1.1 skrll bfd_generic_gc_sections,
4476 1.1 skrll bfd_generic_merge_sections,
4477 1.1 skrll bfd_generic_is_group_section,
4478 1.1 skrll bfd_generic_discard_group,
4479 1.1 skrll _bfd_generic_section_already_linked,
4480 1.1 skrll
4481 1.1 skrll /* Dynamic */
4482 1.1 skrll _bfd_xcoff_get_dynamic_symtab_upper_bound,
4483 1.1 skrll _bfd_xcoff_canonicalize_dynamic_symtab,
4484 1.1 skrll _bfd_nodynamic_get_synthetic_symtab,
4485 1.1 skrll _bfd_xcoff_get_dynamic_reloc_upper_bound,
4486 1.1 skrll _bfd_xcoff_canonicalize_dynamic_reloc,
4487
4488 /* Opposite endian version, none exists */
4489 NULL,
4490
4491 (void *) &bfd_pmac_xcoff_backend_data,
4492 };
4493