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