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