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