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