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