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