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