Fix typo
[deliverable/binutils-gdb.git] / bfd / ecoff.c
CommitLineData
252b5132 1/* Generic ECOFF (Extended-COFF) routines.
7898deda 2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
252b5132
RH
3 Free Software Foundation, Inc.
4 Original version by Per Bothner.
5 Full support added by Ian Lance Taylor, ian@cygnus.com.
6
7This file is part of BFD, the Binary File Descriptor library.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22
23#include "bfd.h"
24#include "sysdep.h"
25#include "bfdlink.h"
26#include "libbfd.h"
27#include "aout/ar.h"
28#include "aout/ranlib.h"
29#include "aout/stab_gnu.h"
30
31/* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
32 some other stuff which we don't want and which conflicts with stuff
33 we do want. */
34#include "libaout.h"
35#include "aout/aout64.h"
36#undef N_ABS
37#undef exec_hdr
38#undef obj_sym_filepos
39
40#include "coff/internal.h"
41#include "coff/sym.h"
42#include "coff/symconst.h"
43#include "coff/ecoff.h"
44#include "libcoff.h"
45#include "libecoff.h"
46\f
47/* Prototypes for static functions. */
48
49static int ecoff_get_magic PARAMS ((bfd *abfd));
50static long ecoff_sec_to_styp_flags PARAMS ((const char *name,
51 flagword flags));
52static boolean ecoff_slurp_symbolic_header PARAMS ((bfd *abfd));
53static boolean ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym,
54 asymbol *asym, int ext, int weak));
55static void ecoff_emit_aggregate PARAMS ((bfd *abfd, FDR *fdr,
56 char *string,
57 RNDXR *rndx, long isym,
58 const char *which));
59static char *ecoff_type_to_string PARAMS ((bfd *abfd, FDR *fdr,
60 unsigned int indx));
61static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section,
62 asymbol **symbols));
63static int ecoff_sort_hdrs PARAMS ((const PTR, const PTR));
64static boolean ecoff_compute_section_file_positions PARAMS ((bfd *abfd));
65static bfd_size_type ecoff_compute_reloc_file_positions PARAMS ((bfd *abfd));
66static boolean ecoff_get_extr PARAMS ((asymbol *, EXTR *));
67static void ecoff_set_index PARAMS ((asymbol *, bfd_size_type));
68static unsigned int ecoff_armap_hash PARAMS ((CONST char *s,
69 unsigned int *rehash,
70 unsigned int size,
71 unsigned int hlog));
72\f
73/* This stuff is somewhat copied from coffcode.h. */
74
5f771d47
ILT
75static asection bfd_debug_section =
76{
d1778b88
AM
77 /* name, id, index, next, flags, user_set_vma, reloc_done, */
78 "*DEBUG*", 0, 0, NULL, 0, 0, 0,
79 /* linker_mark, linker_has_input, gc_mark, segment_mark, */
80 0, 0, 0, 0,
81 /* vma, lma, _cooked_size, _raw_size, */
82 0, 0, 0, 0,
83 /* output_offset, output_section, alignment_power, */
84 0, NULL, 0,
51d7ee16 85 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
062e2358 86 NULL, NULL, 0, 0, 0,
51d7ee16
NC
87 /* line_filepos, userdata, contents, lineno, lineno_count, */
88 0, NULL, NULL, NULL, 0,
062e2358
AM
89 /* entsize, comdat, kept_section, moving_line_filepos, */
90 0, NULL, NULL, 0,
91 /* target_index, used_by_bfd, constructor_chain, owner, */
92 0, NULL, NULL, NULL,
51d7ee16
NC
93 /* symbol, */
94 (struct symbol_cache_entry *) NULL,
95 /* symbol_ptr_ptr, */
96 (struct symbol_cache_entry **) NULL,
97 /* link_order_head, link_order_tail */
98 NULL, NULL
5f771d47 99};
252b5132
RH
100
101/* Create an ECOFF object. */
102
103boolean
104_bfd_ecoff_mkobject (abfd)
105 bfd *abfd;
106{
107 abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *)
108 bfd_zalloc (abfd, sizeof (ecoff_data_type)));
109 if (abfd->tdata.ecoff_obj_data == NULL)
110 return false;
111
112 return true;
113}
114
115/* This is a hook called by coff_real_object_p to create any backend
116 specific information. */
117
118PTR
119_bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr)
120 bfd *abfd;
121 PTR filehdr;
122 PTR aouthdr;
123{
124 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
125 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
126 ecoff_data_type *ecoff;
127
128 if (_bfd_ecoff_mkobject (abfd) == false)
129 return NULL;
130
131 ecoff = ecoff_data (abfd);
132 ecoff->gp_size = 8;
133 ecoff->sym_filepos = internal_f->f_symptr;
134
135 if (internal_a != (struct internal_aouthdr *) NULL)
136 {
137 int i;
138
139 ecoff->text_start = internal_a->text_start;
140 ecoff->text_end = internal_a->text_start + internal_a->tsize;
141 ecoff->gp = internal_a->gp_value;
142 ecoff->gprmask = internal_a->gprmask;
143 for (i = 0; i < 4; i++)
144 ecoff->cprmask[i] = internal_a->cprmask[i];
145 ecoff->fprmask = internal_a->fprmask;
146 if (internal_a->magic == ECOFF_AOUT_ZMAGIC)
147 abfd->flags |= D_PAGED;
148 else
149 abfd->flags &=~ D_PAGED;
150 }
151
152 /* It turns out that no special action is required by the MIPS or
153 Alpha ECOFF backends. They have different information in the
154 a.out header, but we just copy it all (e.g., gprmask, cprmask and
155 fprmask) and let the swapping routines ensure that only relevant
156 information is written out. */
157
158 return (PTR) ecoff;
159}
160
161/* Initialize a new section. */
162
163boolean
164_bfd_ecoff_new_section_hook (abfd, section)
5f771d47 165 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
166 asection *section;
167{
168 section->alignment_power = 4;
169
170 if (strcmp (section->name, _TEXT) == 0
171 || strcmp (section->name, _INIT) == 0
172 || strcmp (section->name, _FINI) == 0)
173 section->flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
174 else if (strcmp (section->name, _DATA) == 0
175 || strcmp (section->name, _SDATA) == 0)
176 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
177 else if (strcmp (section->name, _RDATA) == 0
178 || strcmp (section->name, _LIT8) == 0
179 || strcmp (section->name, _LIT4) == 0
180 || strcmp (section->name, _RCONST) == 0
181 || strcmp (section->name, _PDATA) == 0)
182 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
183 else if (strcmp (section->name, _BSS) == 0
184 || strcmp (section->name, _SBSS) == 0)
185 section->flags |= SEC_ALLOC;
186 else if (strcmp (section->name, _LIB) == 0)
187 {
188 /* An Irix 4 shared libary. */
189 section->flags |= SEC_COFF_SHARED_LIBRARY;
190 }
191
192 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
193 uncertain about .init on some systems and I don't know how shared
194 libraries work. */
195
196 return true;
197}
198
199/* Determine the machine architecture and type. This is called from
200 the generic COFF routines. It is the inverse of ecoff_get_magic,
201 below. This could be an ECOFF backend routine, with one version
202 for each target, but there aren't all that many ECOFF targets. */
203
204boolean
205_bfd_ecoff_set_arch_mach_hook (abfd, filehdr)
206 bfd *abfd;
207 PTR filehdr;
208{
209 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
210 enum bfd_architecture arch;
211 unsigned long mach;
212
213 switch (internal_f->f_magic)
214 {
215 case MIPS_MAGIC_1:
216 case MIPS_MAGIC_LITTLE:
217 case MIPS_MAGIC_BIG:
218 arch = bfd_arch_mips;
219 mach = 3000;
220 break;
221
222 case MIPS_MAGIC_LITTLE2:
223 case MIPS_MAGIC_BIG2:
224 /* MIPS ISA level 2: the r6000 */
225 arch = bfd_arch_mips;
226 mach = 6000;
227 break;
228
229 case MIPS_MAGIC_LITTLE3:
230 case MIPS_MAGIC_BIG3:
231 /* MIPS ISA level 3: the r4000 */
232 arch = bfd_arch_mips;
233 mach = 4000;
234 break;
235
236 case ALPHA_MAGIC:
237 arch = bfd_arch_alpha;
238 mach = 0;
239 break;
240
241 default:
242 arch = bfd_arch_obscure;
243 mach = 0;
244 break;
245 }
246
247 return bfd_default_set_arch_mach (abfd, arch, mach);
248}
249
250/* Get the magic number to use based on the architecture and machine.
251 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
252
253static int
254ecoff_get_magic (abfd)
255 bfd *abfd;
256{
257 int big, little;
258
259 switch (bfd_get_arch (abfd))
260 {
261 case bfd_arch_mips:
262 switch (bfd_get_mach (abfd))
263 {
264 default:
265 case 0:
266 case 3000:
267 big = MIPS_MAGIC_BIG;
268 little = MIPS_MAGIC_LITTLE;
269 break;
270
271 case 6000:
272 big = MIPS_MAGIC_BIG2;
273 little = MIPS_MAGIC_LITTLE2;
274 break;
275
276 case 4000:
277 big = MIPS_MAGIC_BIG3;
278 little = MIPS_MAGIC_LITTLE3;
279 break;
280 }
281
282 return bfd_big_endian (abfd) ? big : little;
283
284 case bfd_arch_alpha:
285 return ALPHA_MAGIC;
286
287 default:
288 abort ();
289 return 0;
290 }
291}
292
293/* Get the section s_flags to use for a section. */
294
295static long
296ecoff_sec_to_styp_flags (name, flags)
297 const char *name;
298 flagword flags;
299{
300 long styp;
301
302 styp = 0;
303
304 if (strcmp (name, _TEXT) == 0)
305 styp = STYP_TEXT;
306 else if (strcmp (name, _DATA) == 0)
307 styp = STYP_DATA;
308 else if (strcmp (name, _SDATA) == 0)
309 styp = STYP_SDATA;
310 else if (strcmp (name, _RDATA) == 0)
311 styp = STYP_RDATA;
312 else if (strcmp (name, _LITA) == 0)
313 styp = STYP_LITA;
314 else if (strcmp (name, _LIT8) == 0)
315 styp = STYP_LIT8;
316 else if (strcmp (name, _LIT4) == 0)
317 styp = STYP_LIT4;
318 else if (strcmp (name, _BSS) == 0)
319 styp = STYP_BSS;
320 else if (strcmp (name, _SBSS) == 0)
321 styp = STYP_SBSS;
322 else if (strcmp (name, _INIT) == 0)
323 styp = STYP_ECOFF_INIT;
324 else if (strcmp (name, _FINI) == 0)
325 styp = STYP_ECOFF_FINI;
326 else if (strcmp (name, _PDATA) == 0)
327 styp = STYP_PDATA;
328 else if (strcmp (name, _XDATA) == 0)
329 styp = STYP_XDATA;
330 else if (strcmp (name, _LIB) == 0)
331 styp = STYP_ECOFF_LIB;
332 else if (strcmp (name, _GOT) == 0)
333 styp = STYP_GOT;
334 else if (strcmp (name, _HASH) == 0)
335 styp = STYP_HASH;
336 else if (strcmp (name, _DYNAMIC) == 0)
337 styp = STYP_DYNAMIC;
338 else if (strcmp (name, _LIBLIST) == 0)
339 styp = STYP_LIBLIST;
340 else if (strcmp (name, _RELDYN) == 0)
341 styp = STYP_RELDYN;
342 else if (strcmp (name, _CONFLIC) == 0)
343 styp = STYP_CONFLIC;
344 else if (strcmp (name, _DYNSTR) == 0)
345 styp = STYP_DYNSTR;
346 else if (strcmp (name, _DYNSYM) == 0)
347 styp = STYP_DYNSYM;
348 else if (strcmp (name, _COMMENT) == 0)
349 {
350 styp = STYP_COMMENT;
351 flags &=~ SEC_NEVER_LOAD;
352 }
353 else if (strcmp (name, _RCONST) == 0)
354 styp = STYP_RCONST;
1abaf976 355 else if (flags & SEC_CODE)
252b5132 356 styp = STYP_TEXT;
1abaf976 357 else if (flags & SEC_DATA)
252b5132
RH
358 styp = STYP_DATA;
359 else if (flags & SEC_READONLY)
360 styp = STYP_RDATA;
361 else if (flags & SEC_LOAD)
362 styp = STYP_REG;
363 else
364 styp = STYP_BSS;
365
366 if (flags & SEC_NEVER_LOAD)
367 styp |= STYP_NOLOAD;
368
369 return styp;
370}
371
372/* Get the BFD flags to use for a section. */
373
7c8ca0e4
NC
374boolean
375_bfd_ecoff_styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
5f771d47 376 bfd *abfd ATTRIBUTE_UNUSED;
252b5132 377 PTR hdr;
5f771d47 378 const char *name ATTRIBUTE_UNUSED;
7b50b349 379 asection *section ATTRIBUTE_UNUSED;
7c8ca0e4 380 flagword * flags_ptr;
252b5132
RH
381{
382 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
383 long styp_flags = internal_s->s_flags;
7c8ca0e4 384 flagword sec_flags = 0;
252b5132
RH
385
386 if (styp_flags & STYP_NOLOAD)
387 sec_flags |= SEC_NEVER_LOAD;
388
389 /* For 386 COFF, at least, an unloadable text or data section is
390 actually a shared library section. */
391 if ((styp_flags & STYP_TEXT)
392 || (styp_flags & STYP_ECOFF_INIT)
393 || (styp_flags & STYP_ECOFF_FINI)
394 || (styp_flags & STYP_DYNAMIC)
395 || (styp_flags & STYP_LIBLIST)
396 || (styp_flags & STYP_RELDYN)
397 || styp_flags == STYP_CONFLIC
398 || (styp_flags & STYP_DYNSTR)
399 || (styp_flags & STYP_DYNSYM)
400 || (styp_flags & STYP_HASH))
401 {
402 if (sec_flags & SEC_NEVER_LOAD)
403 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
404 else
405 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
406 }
407 else if ((styp_flags & STYP_DATA)
408 || (styp_flags & STYP_RDATA)
409 || (styp_flags & STYP_SDATA)
410 || styp_flags == STYP_PDATA
411 || styp_flags == STYP_XDATA
412 || (styp_flags & STYP_GOT)
413 || styp_flags == STYP_RCONST)
414 {
415 if (sec_flags & SEC_NEVER_LOAD)
416 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
417 else
418 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
419 if ((styp_flags & STYP_RDATA)
420 || styp_flags == STYP_PDATA
421 || styp_flags == STYP_RCONST)
422 sec_flags |= SEC_READONLY;
423 }
424 else if ((styp_flags & STYP_BSS)
425 || (styp_flags & STYP_SBSS))
7c8ca0e4 426 sec_flags |= SEC_ALLOC;
252b5132 427 else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT)
7c8ca0e4 428 sec_flags |= SEC_NEVER_LOAD;
252b5132
RH
429 else if ((styp_flags & STYP_LITA)
430 || (styp_flags & STYP_LIT8)
431 || (styp_flags & STYP_LIT4))
7c8ca0e4 432 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
252b5132 433 else if (styp_flags & STYP_ECOFF_LIB)
7c8ca0e4 434 sec_flags |= SEC_COFF_SHARED_LIBRARY;
252b5132 435 else
7c8ca0e4 436 sec_flags |= SEC_ALLOC | SEC_LOAD;
252b5132 437
7c8ca0e4
NC
438 * flags_ptr = sec_flags;
439 return true;
252b5132
RH
440}
441\f
442/* Read in the symbolic header for an ECOFF object file. */
443
444static boolean
445ecoff_slurp_symbolic_header (abfd)
446 bfd *abfd;
447{
448 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
449 bfd_size_type external_hdr_size;
450 PTR raw = NULL;
451 HDRR *internal_symhdr;
452
453 /* See if we've already read it in. */
1abaf976 454 if (ecoff_data (abfd)->debug_info.symbolic_header.magic ==
252b5132
RH
455 backend->debug_swap.sym_magic)
456 return true;
457
458 /* See whether there is a symbolic header. */
459 if (ecoff_data (abfd)->sym_filepos == 0)
460 {
461 bfd_get_symcount (abfd) = 0;
462 return true;
463 }
464
465 /* At this point bfd_get_symcount (abfd) holds the number of symbols
466 as read from the file header, but on ECOFF this is always the
467 size of the symbolic information header. It would be cleaner to
468 handle this when we first read the file in coffgen.c. */
469 external_hdr_size = backend->debug_swap.external_hdr_size;
470 if (bfd_get_symcount (abfd) != external_hdr_size)
471 {
472 bfd_set_error (bfd_error_bad_value);
473 return false;
474 }
475
476 /* Read the symbolic information header. */
477 raw = (PTR) bfd_malloc ((size_t) external_hdr_size);
478 if (raw == NULL)
479 goto error_return;
480
481 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) == -1
482 || (bfd_read (raw, external_hdr_size, 1, abfd)
483 != external_hdr_size))
484 goto error_return;
485 internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
486 (*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr);
487
488 if (internal_symhdr->magic != backend->debug_swap.sym_magic)
489 {
490 bfd_set_error (bfd_error_bad_value);
491 goto error_return;
492 }
493
494 /* Now we can get the correct number of symbols. */
495 bfd_get_symcount (abfd) = (internal_symhdr->isymMax
496 + internal_symhdr->iextMax);
497
498 if (raw != NULL)
499 free (raw);
500 return true;
501 error_return:
502 if (raw != NULL)
503 free (raw);
504 return false;
505}
506
507/* Read in and swap the important symbolic information for an ECOFF
508 object file. This is called by gdb via the read_debug_info entry
509 point in the backend structure. */
510
252b5132
RH
511boolean
512_bfd_ecoff_slurp_symbolic_info (abfd, ignore, debug)
513 bfd *abfd;
5f771d47 514 asection *ignore ATTRIBUTE_UNUSED;
252b5132
RH
515 struct ecoff_debug_info *debug;
516{
517 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
518 HDRR *internal_symhdr;
519 bfd_size_type raw_base;
520 bfd_size_type raw_size;
521 PTR raw;
522 bfd_size_type external_fdr_size;
523 char *fraw_src;
524 char *fraw_end;
525 struct fdr *fdr_ptr;
526 bfd_size_type raw_end;
527 bfd_size_type cb_end;
528
529 BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info);
530
531 /* Check whether we've already gotten it, and whether there's any to
532 get. */
533 if (ecoff_data (abfd)->raw_syments != (PTR) NULL)
534 return true;
535 if (ecoff_data (abfd)->sym_filepos == 0)
536 {
537 bfd_get_symcount (abfd) = 0;
538 return true;
539 }
540
541 if (! ecoff_slurp_symbolic_header (abfd))
542 return false;
543
544 internal_symhdr = &debug->symbolic_header;
545
546 /* Read all the symbolic information at once. */
547 raw_base = (ecoff_data (abfd)->sym_filepos
548 + backend->debug_swap.external_hdr_size);
549
550 /* Alpha ecoff makes the determination of raw_size difficult. It has
551 an undocumented debug data section between the symhdr and the first
552 documented section. And the ordering of the sections varies between
553 statically and dynamically linked executables.
554 If bfd supports SEEK_END someday, this code could be simplified. */
555
556 raw_end = 0;
557
558#define UPDATE_RAW_END(start, count, size) \
559 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
560 if (cb_end > raw_end) \
561 raw_end = cb_end
562
563 UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char));
564 UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size);
565 UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size);
566 UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size);
567 UPDATE_RAW_END (cbOptOffset, ioptMax, backend->debug_swap.external_opt_size);
568 UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext));
569 UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char));
570 UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char));
571 UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size);
572 UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size);
573 UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size);
574
575#undef UPDATE_RAW_END
576
577 raw_size = raw_end - raw_base;
578 if (raw_size == 0)
579 {
580 ecoff_data (abfd)->sym_filepos = 0;
581 return true;
582 }
583 raw = (PTR) bfd_alloc (abfd, raw_size);
584 if (raw == NULL)
585 return false;
586 if (bfd_seek (abfd,
587 (ecoff_data (abfd)->sym_filepos
588 + backend->debug_swap.external_hdr_size),
589 SEEK_SET) != 0
590 || bfd_read (raw, raw_size, 1, abfd) != raw_size)
591 {
592 bfd_release (abfd, raw);
593 return false;
594 }
595
596 ecoff_data (abfd)->raw_syments = raw;
597
598 /* Get pointers for the numeric offsets in the HDRR structure. */
599#define FIX(off1, off2, type) \
600 if (internal_symhdr->off1 == 0) \
601 debug->off2 = (type) NULL; \
602 else \
603 debug->off2 = (type) ((char *) raw \
604 + (internal_symhdr->off1 \
605 - raw_base))
606 FIX (cbLineOffset, line, unsigned char *);
607 FIX (cbDnOffset, external_dnr, PTR);
608 FIX (cbPdOffset, external_pdr, PTR);
609 FIX (cbSymOffset, external_sym, PTR);
610 FIX (cbOptOffset, external_opt, PTR);
611 FIX (cbAuxOffset, external_aux, union aux_ext *);
612 FIX (cbSsOffset, ss, char *);
613 FIX (cbSsExtOffset, ssext, char *);
614 FIX (cbFdOffset, external_fdr, PTR);
615 FIX (cbRfdOffset, external_rfd, PTR);
616 FIX (cbExtOffset, external_ext, PTR);
617#undef FIX
618
619 /* I don't want to always swap all the data, because it will just
620 waste time and most programs will never look at it. The only
621 time the linker needs most of the debugging information swapped
622 is when linking big-endian and little-endian MIPS object files
623 together, which is not a common occurrence.
624
625 We need to look at the fdr to deal with a lot of information in
626 the symbols, so we swap them here. */
627 debug->fdr = (struct fdr *) bfd_alloc (abfd,
628 (internal_symhdr->ifdMax *
629 sizeof (struct fdr)));
630 if (debug->fdr == NULL)
631 return false;
632 external_fdr_size = backend->debug_swap.external_fdr_size;
633 fdr_ptr = debug->fdr;
634 fraw_src = (char *) debug->external_fdr;
635 fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size;
636 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
637 (*backend->debug_swap.swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
638
639 return true;
640}
641\f
642/* ECOFF symbol table routines. The ECOFF symbol table is described
643 in gcc/mips-tfile.c. */
644
645/* ECOFF uses two common sections. One is the usual one, and the
646 other is for small objects. All the small objects are kept
647 together, and then referenced via the gp pointer, which yields
648 faster assembler code. This is what we use for the small common
649 section. */
650static asection ecoff_scom_section;
651static asymbol ecoff_scom_symbol;
652static asymbol *ecoff_scom_symbol_ptr;
653
654/* Create an empty symbol. */
655
656asymbol *
657_bfd_ecoff_make_empty_symbol (abfd)
658 bfd *abfd;
659{
660 ecoff_symbol_type *new;
661
662 new = (ecoff_symbol_type *) bfd_alloc (abfd, sizeof (ecoff_symbol_type));
663 if (new == (ecoff_symbol_type *) NULL)
664 return (asymbol *) NULL;
665 memset ((PTR) new, 0, sizeof *new);
666 new->symbol.section = (asection *) NULL;
667 new->fdr = (FDR *) NULL;
668 new->local = false;
669 new->native = NULL;
670 new->symbol.the_bfd = abfd;
671 return &new->symbol;
672}
673
674/* Set the BFD flags and section for an ECOFF symbol. */
675
676static boolean
677ecoff_set_symbol_info (abfd, ecoff_sym, asym, ext, weak)
678 bfd *abfd;
679 SYMR *ecoff_sym;
680 asymbol *asym;
681 int ext;
682 int weak;
683{
684 asym->the_bfd = abfd;
685 asym->value = ecoff_sym->value;
686 asym->section = &bfd_debug_section;
687 asym->udata.i = 0;
688
689 /* Most symbol types are just for debugging. */
690 switch (ecoff_sym->st)
691 {
692 case stGlobal:
693 case stStatic:
694 case stLabel:
695 case stProc:
696 case stStaticProc:
697 break;
698 case stNil:
699 if (ECOFF_IS_STAB (ecoff_sym))
700 {
701 asym->flags = BSF_DEBUGGING;
702 return true;
703 }
704 break;
705 default:
706 asym->flags = BSF_DEBUGGING;
707 return true;
708 }
709
710 if (weak)
711 asym->flags = BSF_EXPORT | BSF_WEAK;
712 else if (ext)
713 asym->flags = BSF_EXPORT | BSF_GLOBAL;
714 else
715 {
716 asym->flags = BSF_LOCAL;
717 /* Normally, a local stProc symbol will have a corresponding
718 external symbol. We mark the local symbol as a debugging
719 symbol, in order to prevent nm from printing both out.
720 Similarly, we mark stLabel and stabs symbols as debugging
721 symbols. In both cases, we do want to set the value
722 correctly based on the symbol class. */
723 if (ecoff_sym->st == stProc
724 || ecoff_sym->st == stLabel
725 || ECOFF_IS_STAB (ecoff_sym))
726 asym->flags |= BSF_DEBUGGING;
727 }
728 switch (ecoff_sym->sc)
729 {
730 case scNil:
731 /* Used for compiler generated labels. Leave them in the
732 debugging section, and mark them as local. If BSF_DEBUGGING
733 is set, then nm does not display them for some reason. If no
734 flags are set then the linker whines about them. */
735 asym->flags = BSF_LOCAL;
736 break;
737 case scText:
738 asym->section = bfd_make_section_old_way (abfd, ".text");
739 asym->value -= asym->section->vma;
740 break;
741 case scData:
742 asym->section = bfd_make_section_old_way (abfd, ".data");
743 asym->value -= asym->section->vma;
744 break;
745 case scBss:
746 asym->section = bfd_make_section_old_way (abfd, ".bss");
747 asym->value -= asym->section->vma;
748 break;
749 case scRegister:
750 asym->flags = BSF_DEBUGGING;
751 break;
752 case scAbs:
753 asym->section = bfd_abs_section_ptr;
754 break;
755 case scUndefined:
756 asym->section = bfd_und_section_ptr;
757 asym->flags = 0;
758 asym->value = 0;
759 break;
760 case scCdbLocal:
761 case scBits:
762 case scCdbSystem:
763 case scRegImage:
764 case scInfo:
765 case scUserStruct:
766 asym->flags = BSF_DEBUGGING;
767 break;
768 case scSData:
769 asym->section = bfd_make_section_old_way (abfd, ".sdata");
770 asym->value -= asym->section->vma;
771 break;
772 case scSBss:
773 asym->section = bfd_make_section_old_way (abfd, ".sbss");
774 asym->value -= asym->section->vma;
775 break;
776 case scRData:
777 asym->section = bfd_make_section_old_way (abfd, ".rdata");
778 asym->value -= asym->section->vma;
779 break;
780 case scVar:
781 asym->flags = BSF_DEBUGGING;
782 break;
783 case scCommon:
784 if (asym->value > ecoff_data (abfd)->gp_size)
785 {
786 asym->section = bfd_com_section_ptr;
787 asym->flags = 0;
788 break;
789 }
790 /* Fall through. */
791 case scSCommon:
792 if (ecoff_scom_section.name == NULL)
793 {
794 /* Initialize the small common section. */
795 ecoff_scom_section.name = SCOMMON;
796 ecoff_scom_section.flags = SEC_IS_COMMON;
797 ecoff_scom_section.output_section = &ecoff_scom_section;
798 ecoff_scom_section.symbol = &ecoff_scom_symbol;
799 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
800 ecoff_scom_symbol.name = SCOMMON;
801 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
802 ecoff_scom_symbol.section = &ecoff_scom_section;
803 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
804 }
805 asym->section = &ecoff_scom_section;
806 asym->flags = 0;
807 break;
808 case scVarRegister:
809 case scVariant:
810 asym->flags = BSF_DEBUGGING;
811 break;
812 case scSUndefined:
813 asym->section = bfd_und_section_ptr;
814 asym->flags = 0;
815 asym->value = 0;
816 break;
817 case scInit:
818 asym->section = bfd_make_section_old_way (abfd, ".init");
819 asym->value -= asym->section->vma;
820 break;
821 case scBasedVar:
822 case scXData:
823 case scPData:
824 asym->flags = BSF_DEBUGGING;
825 break;
826 case scFini:
827 asym->section = bfd_make_section_old_way (abfd, ".fini");
828 asym->value -= asym->section->vma;
829 break;
830 case scRConst:
831 asym->section = bfd_make_section_old_way (abfd, ".rconst");
832 asym->value -= asym->section->vma;
833 break;
834 default:
835 break;
836 }
837
838 /* Look for special constructors symbols and make relocation entries
839 in a special construction section. These are produced by the
840 -fgnu-linker argument to g++. */
841 if (ECOFF_IS_STAB (ecoff_sym))
842 {
843 switch (ECOFF_UNMARK_STAB (ecoff_sym->index))
844 {
845 default:
846 break;
847
848 case N_SETA:
849 case N_SETT:
850 case N_SETD:
851 case N_SETB:
852 {
853 /* This code is no longer needed. It used to be used to
854 make the linker handle set symbols, but they are now
855 handled in the add_symbols routine instead. */
856#if 0
857 const char *name;
858 asection *section;
859 arelent_chain *reloc_chain;
860 unsigned int bitsize;
861
862 /* Get a section with the same name as the symbol (usually
863 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
864 name ___CTOR_LIST (three underscores). We need
865 __CTOR_LIST (two underscores), since ECOFF doesn't use
866 a leading underscore. This should be handled by gcc,
867 but instead we do it here. Actually, this should all
868 be done differently anyhow. */
869 name = bfd_asymbol_name (asym);
870 if (name[0] == '_' && name[1] == '_' && name[2] == '_')
871 {
872 ++name;
873 asym->name = name;
874 }
875 section = bfd_get_section_by_name (abfd, name);
876 if (section == (asection *) NULL)
877 {
878 char *copy;
879
880 copy = (char *) bfd_alloc (abfd, strlen (name) + 1);
881 if (!copy)
882 return false;
883 strcpy (copy, name);
884 section = bfd_make_section (abfd, copy);
885 }
886
887 /* Build a reloc pointing to this constructor. */
888 reloc_chain =
889 (arelent_chain *) bfd_alloc (abfd, sizeof (arelent_chain));
890 if (!reloc_chain)
891 return false;
892 reloc_chain->relent.sym_ptr_ptr =
893 bfd_get_section (asym)->symbol_ptr_ptr;
894 reloc_chain->relent.address = section->_raw_size;
895 reloc_chain->relent.addend = asym->value;
896 reloc_chain->relent.howto =
897 ecoff_backend (abfd)->constructor_reloc;
898
899 /* Set up the constructor section to hold the reloc. */
900 section->flags = SEC_CONSTRUCTOR;
901 ++section->reloc_count;
902
903 /* Constructor sections must be rounded to a boundary
904 based on the bitsize. These are not real sections--
905 they are handled specially by the linker--so the ECOFF
906 16 byte alignment restriction does not apply. */
907 bitsize = ecoff_backend (abfd)->constructor_bitsize;
908 section->alignment_power = 1;
909 while ((1 << section->alignment_power) < bitsize / 8)
910 ++section->alignment_power;
911
912 reloc_chain->next = section->constructor_chain;
913 section->constructor_chain = reloc_chain;
914 section->_raw_size += bitsize / 8;
915
916#endif /* 0 */
917
918 /* Mark the symbol as a constructor. */
919 asym->flags |= BSF_CONSTRUCTOR;
920 }
921 break;
922 }
923 }
924 return true;
925}
926
927/* Read an ECOFF symbol table. */
928
929boolean
930_bfd_ecoff_slurp_symbol_table (abfd)
931 bfd *abfd;
932{
933 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
934 const bfd_size_type external_ext_size
935 = backend->debug_swap.external_ext_size;
936 const bfd_size_type external_sym_size
937 = backend->debug_swap.external_sym_size;
938 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
939 = backend->debug_swap.swap_ext_in;
940 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
941 = backend->debug_swap.swap_sym_in;
942 bfd_size_type internal_size;
943 ecoff_symbol_type *internal;
944 ecoff_symbol_type *internal_ptr;
945 char *eraw_src;
946 char *eraw_end;
947 FDR *fdr_ptr;
948 FDR *fdr_end;
949
950 /* If we've already read in the symbol table, do nothing. */
951 if (ecoff_data (abfd)->canonical_symbols != NULL)
952 return true;
953
954 /* Get the symbolic information. */
955 if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL,
956 &ecoff_data (abfd)->debug_info))
957 return false;
958 if (bfd_get_symcount (abfd) == 0)
959 return true;
960
961 internal_size = bfd_get_symcount (abfd) * sizeof (ecoff_symbol_type);
962 internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size);
963 if (internal == NULL)
964 return false;
965
966 internal_ptr = internal;
967 eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext;
968 eraw_end = (eraw_src
969 + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax
970 * external_ext_size));
971 for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++)
972 {
973 EXTR internal_esym;
974
975 (*swap_ext_in) (abfd, (PTR) eraw_src, &internal_esym);
976 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext
977 + internal_esym.asym.iss);
978 if (!ecoff_set_symbol_info (abfd, &internal_esym.asym,
979 &internal_ptr->symbol, 1,
980 internal_esym.weakext))
981 return false;
982 /* The alpha uses a negative ifd field for section symbols. */
983 if (internal_esym.ifd >= 0)
984 internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr
985 + internal_esym.ifd);
986 else
987 internal_ptr->fdr = NULL;
988 internal_ptr->local = false;
989 internal_ptr->native = (PTR) eraw_src;
990 }
991
992 /* The local symbols must be accessed via the fdr's, because the
993 string and aux indices are relative to the fdr information. */
994 fdr_ptr = ecoff_data (abfd)->debug_info.fdr;
995 fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax;
996 for (; fdr_ptr < fdr_end; fdr_ptr++)
997 {
998 char *lraw_src;
999 char *lraw_end;
1000
1001 lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym
1002 + fdr_ptr->isymBase * external_sym_size);
1003 lraw_end = lraw_src + fdr_ptr->csym * external_sym_size;
1004 for (;
1005 lraw_src < lraw_end;
1006 lraw_src += external_sym_size, internal_ptr++)
1007 {
1008 SYMR internal_sym;
1009
1010 (*swap_sym_in) (abfd, (PTR) lraw_src, &internal_sym);
1011 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss
1012 + fdr_ptr->issBase
1013 + internal_sym.iss);
1014 if (!ecoff_set_symbol_info (abfd, &internal_sym,
1015 &internal_ptr->symbol, 0, 0))
1016 return false;
1017 internal_ptr->fdr = fdr_ptr;
1018 internal_ptr->local = true;
1019 internal_ptr->native = (PTR) lraw_src;
1020 }
1021 }
1022
1023 ecoff_data (abfd)->canonical_symbols = internal;
1024
1025 return true;
1026}
1027
1028/* Return the amount of space needed for the canonical symbols. */
1029
1030long
1031_bfd_ecoff_get_symtab_upper_bound (abfd)
1032 bfd *abfd;
1033{
1034 if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL,
1035 &ecoff_data (abfd)->debug_info))
1036 return -1;
1037
1038 if (bfd_get_symcount (abfd) == 0)
1039 return 0;
1040
1041 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
1042}
1043
1044/* Get the canonical symbols. */
1045
1046long
1047_bfd_ecoff_get_symtab (abfd, alocation)
1048 bfd *abfd;
1049 asymbol **alocation;
1050{
1051 unsigned int counter = 0;
1052 ecoff_symbol_type *symbase;
1053 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
1054
1055 if (_bfd_ecoff_slurp_symbol_table (abfd) == false)
1056 return -1;
1057 if (bfd_get_symcount (abfd) == 0)
1058 return 0;
1059
1060 symbase = ecoff_data (abfd)->canonical_symbols;
1061 while (counter < bfd_get_symcount (abfd))
1062 {
1063 *(location++) = symbase++;
1064 counter++;
1065 }
1066 *location++ = (ecoff_symbol_type *) NULL;
1067 return bfd_get_symcount (abfd);
1068}
1069
1070/* Turn ECOFF type information into a printable string.
1071 ecoff_emit_aggregate and ecoff_type_to_string are from
1072 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1073
1074/* Write aggregate information to a string. */
1075
1076static void
1077ecoff_emit_aggregate (abfd, fdr, string, rndx, isym, which)
1078 bfd *abfd;
1079 FDR *fdr;
1080 char *string;
1081 RNDXR *rndx;
1082 long isym;
1083 const char *which;
1084{
1085 const struct ecoff_debug_swap * const debug_swap =
1086 &ecoff_backend (abfd)->debug_swap;
1087 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1088 unsigned int ifd = rndx->rfd;
1089 unsigned int indx = rndx->index;
1090 const char *name;
1abaf976 1091
252b5132
RH
1092 if (ifd == 0xfff)
1093 ifd = isym;
1094
1095 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1096 struct return type of a procedure compiled without -g. */
1097 if (ifd == 0xffffffff
1098 || (rndx->rfd == 0xfff && indx == 0))
1099 name = "<undefined>";
1100 else if (indx == indexNil)
1101 name = "<no name>";
1102 else
1103 {
1104 SYMR sym;
1105
1106 if (debug_info->external_rfd == NULL)
1107 fdr = debug_info->fdr + ifd;
1108 else
1109 {
1110 RFDT rfd;
1111
1112 (*debug_swap->swap_rfd_in) (abfd,
1113 ((char *) debug_info->external_rfd
1114 + ((fdr->rfdBase + ifd)
1115 * debug_swap->external_rfd_size)),
1116 &rfd);
1117 fdr = debug_info->fdr + rfd;
1118 }
1119
1120 indx += fdr->isymBase;
1121
1122 (*debug_swap->swap_sym_in) (abfd,
1123 ((char *) debug_info->external_sym
1124 + indx * debug_swap->external_sym_size),
1125 &sym);
1126
1127 name = debug_info->ss + fdr->issBase + sym.iss;
1128 }
1129
1130 sprintf (string,
1131 "%s %s { ifd = %u, index = %lu }",
1132 which, name, ifd,
1133 ((long) indx
1134 + debug_info->symbolic_header.iextMax));
1135}
1136
1137/* Convert the type information to string format. */
1138
1139static char *
1140ecoff_type_to_string (abfd, fdr, indx)
1141 bfd *abfd;
1142 FDR *fdr;
1143 unsigned int indx;
1144{
1145 union aux_ext *aux_ptr;
1146 int bigendian;
1147 AUXU u;
1148 struct qual {
1149 unsigned int type;
1150 int low_bound;
1151 int high_bound;
1152 int stride;
1153 } qualifiers[7];
1154 unsigned int basic_type;
1155 int i;
1156 char buffer1[1024];
1157 static char buffer2[1024];
1158 char *p1 = buffer1;
1159 char *p2 = buffer2;
1160 RNDXR rndx;
1161
1162 aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase;
1163 bigendian = fdr->fBigendian;
1164
1165 for (i = 0; i < 7; i++)
1166 {
1167 qualifiers[i].low_bound = 0;
1168 qualifiers[i].high_bound = 0;
1169 qualifiers[i].stride = 0;
1170 }
1171
1172 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1)
1173 return "-1 (no type)";
1174 _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1175
1176 basic_type = u.ti.bt;
1177 qualifiers[0].type = u.ti.tq0;
1178 qualifiers[1].type = u.ti.tq1;
1179 qualifiers[2].type = u.ti.tq2;
1180 qualifiers[3].type = u.ti.tq3;
1181 qualifiers[4].type = u.ti.tq4;
1182 qualifiers[5].type = u.ti.tq5;
1183 qualifiers[6].type = tqNil;
1184
1185 /*
1186 * Go get the basic type.
1187 */
1188 switch (basic_type)
1189 {
1190 case btNil: /* undefined */
1191 strcpy (p1, "nil");
1192 break;
1193
1194 case btAdr: /* address - integer same size as pointer */
1195 strcpy (p1, "address");
1196 break;
1197
1198 case btChar: /* character */
1199 strcpy (p1, "char");
1200 break;
1201
1202 case btUChar: /* unsigned character */
1203 strcpy (p1, "unsigned char");
1204 break;
1205
1206 case btShort: /* short */
1207 strcpy (p1, "short");
1208 break;
1209
1210 case btUShort: /* unsigned short */
1211 strcpy (p1, "unsigned short");
1212 break;
1213
1214 case btInt: /* int */
1215 strcpy (p1, "int");
1216 break;
1217
1218 case btUInt: /* unsigned int */
1219 strcpy (p1, "unsigned int");
1220 break;
1221
1222 case btLong: /* long */
1223 strcpy (p1, "long");
1224 break;
1225
1226 case btULong: /* unsigned long */
1227 strcpy (p1, "unsigned long");
1228 break;
1229
1230 case btFloat: /* float (real) */
1231 strcpy (p1, "float");
1232 break;
1233
1234 case btDouble: /* Double (real) */
1235 strcpy (p1, "double");
1236 break;
1237
1238 /* Structures add 1-2 aux words:
1239 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1240 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1241
1242 case btStruct: /* Structure (Record) */
1243 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1244 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1245 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1246 "struct");
1247 indx++; /* skip aux words */
1248 break;
1249
1250 /* Unions add 1-2 aux words:
1251 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1252 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1253
1254 case btUnion: /* Union */
1255 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1256 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1257 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1258 "union");
1259 indx++; /* skip aux words */
1260 break;
1261
1262 /* Enumerations add 1-2 aux words:
1263 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1264 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1265
1266 case btEnum: /* Enumeration */
1267 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1268 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1269 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1270 "enum");
1271 indx++; /* skip aux words */
1272 break;
1273
1274 case btTypedef: /* defined via a typedef, isymRef points */
1275 strcpy (p1, "typedef");
1276 break;
1277
1278 case btRange: /* subrange of int */
1279 strcpy (p1, "subrange");
1280 break;
1281
1282 case btSet: /* pascal sets */
1283 strcpy (p1, "set");
1284 break;
1285
1286 case btComplex: /* fortran complex */
1287 strcpy (p1, "complex");
1288 break;
1289
1290 case btDComplex: /* fortran double complex */
1291 strcpy (p1, "double complex");
1292 break;
1293
1294 case btIndirect: /* forward or unnamed typedef */
1295 strcpy (p1, "forward/unamed typedef");
1296 break;
1297
1298 case btFixedDec: /* Fixed Decimal */
1299 strcpy (p1, "fixed decimal");
1300 break;
1301
1302 case btFloatDec: /* Float Decimal */
1303 strcpy (p1, "float decimal");
1304 break;
1305
1306 case btString: /* Varying Length Character String */
1307 strcpy (p1, "string");
1308 break;
1309
1310 case btBit: /* Aligned Bit String */
1311 strcpy (p1, "bit");
1312 break;
1313
1314 case btPicture: /* Picture */
1315 strcpy (p1, "picture");
1316 break;
1317
1318 case btVoid: /* Void */
1319 strcpy (p1, "void");
1320 break;
1321
1322 default:
1323 sprintf (p1, _("Unknown basic type %d"), (int) basic_type);
1324 break;
1325 }
1326
1327 p1 += strlen (buffer1);
1328
1329 /*
1330 * If this is a bitfield, get the bitsize.
1331 */
1332 if (u.ti.fBitfield)
1333 {
1334 int bitsize;
1335
1336 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1337 sprintf (p1, " : %d", bitsize);
1338 p1 += strlen (buffer1);
1339 }
1340
252b5132
RH
1341 /*
1342 * Deal with any qualifiers.
1343 */
1344 if (qualifiers[0].type != tqNil)
1345 {
1346 /*
1347 * Snarf up any array bounds in the correct order. Arrays
1348 * store 5 successive words in the aux. table:
1349 * word 0 RNDXR to type of the bounds (ie, int)
1350 * word 1 Current file descriptor index
1351 * word 2 low bound
1352 * word 3 high bound (or -1 if [])
1353 * word 4 stride size in bits
1354 */
1355 for (i = 0; i < 7; i++)
1356 {
1357 if (qualifiers[i].type == tqArray)
1358 {
1359 qualifiers[i].low_bound =
1360 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1361 qualifiers[i].high_bound =
1362 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1363 qualifiers[i].stride =
1364 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1365 indx += 5;
1366 }
1367 }
1368
1369 /*
1370 * Now print out the qualifiers.
1371 */
1372 for (i = 0; i < 6; i++)
1373 {
1374 switch (qualifiers[i].type)
1375 {
1376 case tqNil:
1377 case tqMax:
1378 break;
1379
1380 case tqPtr:
1381 strcpy (p2, "ptr to ");
1382 p2 += sizeof ("ptr to ")-1;
1383 break;
1384
1385 case tqVol:
1386 strcpy (p2, "volatile ");
1387 p2 += sizeof ("volatile ")-1;
1388 break;
1389
1390 case tqFar:
1391 strcpy (p2, "far ");
1392 p2 += sizeof ("far ")-1;
1393 break;
1394
1395 case tqProc:
1396 strcpy (p2, "func. ret. ");
1397 p2 += sizeof ("func. ret. ");
1398 break;
1399
1400 case tqArray:
1401 {
1402 int first_array = i;
1403 int j;
1404
1405 /* Print array bounds reversed (ie, in the order the C
1abaf976 1406 programmer writes them). C is such a fun language.... */
252b5132
RH
1407
1408 while (i < 5 && qualifiers[i+1].type == tqArray)
1409 i++;
1410
1411 for (j = i; j >= first_array; j--)
1412 {
1413 strcpy (p2, "array [");
1414 p2 += sizeof ("array [")-1;
1415 if (qualifiers[j].low_bound != 0)
1416 sprintf (p2,
1417 "%ld:%ld {%ld bits}",
1418 (long) qualifiers[j].low_bound,
1419 (long) qualifiers[j].high_bound,
1420 (long) qualifiers[j].stride);
1421
1422 else if (qualifiers[j].high_bound != -1)
1423 sprintf (p2,
1424 "%ld {%ld bits}",
1425 (long) (qualifiers[j].high_bound + 1),
1426 (long) (qualifiers[j].stride));
1427
1428 else
1429 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1430
1431 p2 += strlen (p2);
1432 strcpy (p2, "] of ");
1433 p2 += sizeof ("] of ")-1;
1434 }
1435 }
1436 break;
1437 }
1438 }
1439 }
1440
1441 strcpy (p2, buffer1);
1442 return buffer2;
1443}
1444
1445/* Return information about ECOFF symbol SYMBOL in RET. */
1446
252b5132
RH
1447void
1448_bfd_ecoff_get_symbol_info (abfd, symbol, ret)
5f771d47 1449 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
1450 asymbol *symbol;
1451 symbol_info *ret;
1452{
1453 bfd_symbol_info (symbol, ret);
1454}
1455
1456/* Return whether this is a local label. */
1457
252b5132
RH
1458boolean
1459_bfd_ecoff_bfd_is_local_label_name (abfd, name)
5f771d47 1460 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
1461 const char *name;
1462{
1463 return name[0] == '$';
1464}
1465
1466/* Print information about an ECOFF symbol. */
1467
1468void
1469_bfd_ecoff_print_symbol (abfd, filep, symbol, how)
1470 bfd *abfd;
1471 PTR filep;
1472 asymbol *symbol;
1473 bfd_print_symbol_type how;
1474{
1475 const struct ecoff_debug_swap * const debug_swap
1476 = &ecoff_backend (abfd)->debug_swap;
1477 FILE *file = (FILE *)filep;
1478
1479 switch (how)
1480 {
1481 case bfd_print_symbol_name:
1482 fprintf (file, "%s", symbol->name);
1483 break;
1484 case bfd_print_symbol_more:
1485 if (ecoffsymbol (symbol)->local)
1486 {
1487 SYMR ecoff_sym;
1abaf976 1488
252b5132
RH
1489 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1490 &ecoff_sym);
1491 fprintf (file, "ecoff local ");
1492 fprintf_vma (file, (bfd_vma) ecoff_sym.value);
1493 fprintf (file, " %x %x", (unsigned) ecoff_sym.st,
1494 (unsigned) ecoff_sym.sc);
1495 }
1496 else
1497 {
1498 EXTR ecoff_ext;
1499
1500 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1501 &ecoff_ext);
1502 fprintf (file, "ecoff extern ");
1503 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1504 fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st,
1505 (unsigned) ecoff_ext.asym.sc);
1506 }
1507 break;
1508 case bfd_print_symbol_all:
1509 /* Print out the symbols in a reasonable way */
1510 {
1511 char type;
1512 int pos;
1513 EXTR ecoff_ext;
1514 char jmptbl;
1515 char cobol_main;
1516 char weakext;
1517
1518 if (ecoffsymbol (symbol)->local)
1519 {
1520 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1521 &ecoff_ext.asym);
1522 type = 'l';
1523 pos = ((((char *) ecoffsymbol (symbol)->native
1524 - (char *) ecoff_data (abfd)->debug_info.external_sym)
1525 / debug_swap->external_sym_size)
1526 + ecoff_data (abfd)->debug_info.symbolic_header.iextMax);
1527 jmptbl = ' ';
1528 cobol_main = ' ';
1529 weakext = ' ';
1530 }
1531 else
1532 {
1533 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1534 &ecoff_ext);
1535 type = 'e';
1536 pos = (((char *) ecoffsymbol (symbol)->native
1537 - (char *) ecoff_data (abfd)->debug_info.external_ext)
1538 / debug_swap->external_ext_size);
1539 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1540 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1541 weakext = ecoff_ext.weakext ? 'w' : ' ';
1542 }
1543
1544 fprintf (file, "[%3d] %c ",
1545 pos, type);
1546 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1547 fprintf (file, " st %x sc %x indx %x %c%c%c %s",
1548 (unsigned) ecoff_ext.asym.st,
1549 (unsigned) ecoff_ext.asym.sc,
1550 (unsigned) ecoff_ext.asym.index,
1551 jmptbl, cobol_main, weakext,
1552 symbol->name);
1553
1554 if (ecoffsymbol (symbol)->fdr != NULL
1555 && ecoff_ext.asym.index != indexNil)
1556 {
1557 FDR *fdr;
1558 unsigned int indx;
1559 int bigendian;
1560 bfd_size_type sym_base;
1561 union aux_ext *aux_base;
1562
1563 fdr = ecoffsymbol (symbol)->fdr;
1564 indx = ecoff_ext.asym.index;
1565
1566 /* sym_base is used to map the fdr relative indices which
1567 appear in the file to the position number which we are
1568 using. */
1569 sym_base = fdr->isymBase;
1570 if (ecoffsymbol (symbol)->local)
1571 sym_base +=
1572 ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
1573
1574 /* aux_base is the start of the aux entries for this file;
1575 asym.index is an offset from this. */
1576 aux_base = (ecoff_data (abfd)->debug_info.external_aux
1577 + fdr->iauxBase);
1578
1579 /* The aux entries are stored in host byte order; the
1580 order is indicated by a bit in the fdr. */
1581 bigendian = fdr->fBigendian;
1582
1583 /* This switch is basically from gcc/mips-tdump.c */
1584 switch (ecoff_ext.asym.st)
1585 {
1586 case stNil:
1587 case stLabel:
1588 break;
1589
1590 case stFile:
1591 case stBlock:
1592 fprintf (file, _("\n End+1 symbol: %ld"),
1593 (long) (indx + sym_base));
1594 break;
1595
1596 case stEnd:
1597 if (ecoff_ext.asym.sc == scText
1598 || ecoff_ext.asym.sc == scInfo)
1599 fprintf (file, _("\n First symbol: %ld"),
1600 (long) (indx + sym_base));
1601 else
1abaf976 1602 fprintf (file, _("\n First symbol: %ld"),
252b5132
RH
1603 ((long)
1604 (AUX_GET_ISYM (bigendian,
1605 &aux_base[ecoff_ext.asym.index])
1606 + sym_base)));
1607 break;
1608
1609 case stProc:
1610 case stStaticProc:
1611 if (ECOFF_IS_STAB (&ecoff_ext.asym))
1612 ;
1613 else if (ecoffsymbol (symbol)->local)
1614 fprintf (file, _("\n End+1 symbol: %-7ld Type: %s"),
1615 ((long)
1616 (AUX_GET_ISYM (bigendian,
1617 &aux_base[ecoff_ext.asym.index])
1618 + sym_base)),
1619 ecoff_type_to_string (abfd, fdr, indx + 1));
1620 else
1621 fprintf (file, _("\n Local symbol: %ld"),
1622 ((long) indx
1623 + (long) sym_base
1624 + (ecoff_data (abfd)
1625 ->debug_info.symbolic_header.iextMax)));
1626 break;
1627
1628 case stStruct:
1629 fprintf (file, _("\n struct; End+1 symbol: %ld"),
1630 (long) (indx + sym_base));
1631 break;
1632
1633 case stUnion:
1634 fprintf (file, _("\n union; End+1 symbol: %ld"),
1635 (long) (indx + sym_base));
1636 break;
1637
1638 case stEnum:
1639 fprintf (file, _("\n enum; End+1 symbol: %ld"),
1640 (long) (indx + sym_base));
1641 break;
1642
1643 default:
1644 if (! ECOFF_IS_STAB (&ecoff_ext.asym))
1645 fprintf (file, _("\n Type: %s"),
1646 ecoff_type_to_string (abfd, fdr, indx));
1647 break;
1648 }
1649 }
1650 }
1651 break;
1652 }
1653}
1654\f
1655/* Read in the relocs for a section. */
1656
1657static boolean
1658ecoff_slurp_reloc_table (abfd, section, symbols)
1659 bfd *abfd;
1660 asection *section;
1661 asymbol **symbols;
1662{
1663 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
1664 arelent *internal_relocs;
1665 bfd_size_type external_reloc_size;
1666 bfd_size_type external_relocs_size;
1667 char *external_relocs;
1668 arelent *rptr;
1669 unsigned int i;
1670
1671 if (section->relocation != (arelent *) NULL
1672 || section->reloc_count == 0
1673 || (section->flags & SEC_CONSTRUCTOR) != 0)
1674 return true;
1675
1676 if (_bfd_ecoff_slurp_symbol_table (abfd) == false)
1677 return false;
1abaf976 1678
252b5132
RH
1679 internal_relocs = (arelent *) bfd_alloc (abfd,
1680 (sizeof (arelent)
1681 * section->reloc_count));
1682 external_reloc_size = backend->external_reloc_size;
1683 external_relocs_size = external_reloc_size * section->reloc_count;
1684 external_relocs = (char *) bfd_alloc (abfd, external_relocs_size);
1685 if (internal_relocs == (arelent *) NULL
1686 || external_relocs == (char *) NULL)
1687 return false;
1688 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
1689 return false;
1690 if (bfd_read (external_relocs, 1, external_relocs_size, abfd)
1691 != external_relocs_size)
1692 return false;
1693
1694 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
1695 {
1696 struct internal_reloc intern;
1697
1698 (*backend->swap_reloc_in) (abfd,
1699 external_relocs + i * external_reloc_size,
1700 &intern);
1701
1702 if (intern.r_extern)
1703 {
1704 /* r_symndx is an index into the external symbols. */
1705 BFD_ASSERT (intern.r_symndx >= 0
1706 && (intern.r_symndx
1707 < (ecoff_data (abfd)
1708 ->debug_info.symbolic_header.iextMax)));
1709 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
1710 rptr->addend = 0;
1711 }
1712 else if (intern.r_symndx == RELOC_SECTION_NONE
1713 || intern.r_symndx == RELOC_SECTION_ABS)
1714 {
1715 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1716 rptr->addend = 0;
1717 }
1718 else
1719 {
1720 CONST char *sec_name;
1721 asection *sec;
1722
1723 /* r_symndx is a section key. */
1724 switch (intern.r_symndx)
1725 {
1726 case RELOC_SECTION_TEXT: sec_name = ".text"; break;
1727 case RELOC_SECTION_RDATA: sec_name = ".rdata"; break;
1728 case RELOC_SECTION_DATA: sec_name = ".data"; break;
1729 case RELOC_SECTION_SDATA: sec_name = ".sdata"; break;
1730 case RELOC_SECTION_SBSS: sec_name = ".sbss"; break;
1731 case RELOC_SECTION_BSS: sec_name = ".bss"; break;
1732 case RELOC_SECTION_INIT: sec_name = ".init"; break;
1733 case RELOC_SECTION_LIT8: sec_name = ".lit8"; break;
1734 case RELOC_SECTION_LIT4: sec_name = ".lit4"; break;
1735 case RELOC_SECTION_XDATA: sec_name = ".xdata"; break;
1736 case RELOC_SECTION_PDATA: sec_name = ".pdata"; break;
1737 case RELOC_SECTION_FINI: sec_name = ".fini"; break;
1738 case RELOC_SECTION_LITA: sec_name = ".lita"; break;
1739 case RELOC_SECTION_RCONST: sec_name = ".rconst"; break;
1740 default: abort ();
1741 }
1742
1743 sec = bfd_get_section_by_name (abfd, sec_name);
1744 if (sec == (asection *) NULL)
1745 abort ();
1746 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
1747
1748 rptr->addend = - bfd_get_section_vma (abfd, sec);
1749 }
1750
1751 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
1752
1753 /* Let the backend select the howto field and do any other
1754 required processing. */
1755 (*backend->adjust_reloc_in) (abfd, &intern, rptr);
1756 }
1757
1758 bfd_release (abfd, external_relocs);
1759
1760 section->relocation = internal_relocs;
1761
1762 return true;
1763}
1764
1765/* Get a canonical list of relocs. */
1766
1767long
1768_bfd_ecoff_canonicalize_reloc (abfd, section, relptr, symbols)
1769 bfd *abfd;
1770 asection *section;
1771 arelent **relptr;
1772 asymbol **symbols;
1773{
1774 unsigned int count;
1775
1abaf976 1776 if (section->flags & SEC_CONSTRUCTOR)
252b5132
RH
1777 {
1778 arelent_chain *chain;
1779
1780 /* This section has relocs made up by us, not the file, so take
1781 them out of their chain and place them into the data area
1782 provided. */
1783 for (count = 0, chain = section->constructor_chain;
1784 count < section->reloc_count;
1785 count++, chain = chain->next)
1786 *relptr++ = &chain->relent;
1787 }
1788 else
1abaf976 1789 {
252b5132
RH
1790 arelent *tblptr;
1791
1792 if (ecoff_slurp_reloc_table (abfd, section, symbols) == false)
1793 return -1;
1794
1795 tblptr = section->relocation;
1796
1797 for (count = 0; count < section->reloc_count; count++)
1798 *relptr++ = tblptr++;
1799 }
1800
1801 *relptr = (arelent *) NULL;
1802
1803 return section->reloc_count;
1804}
1805\f
1806/* Provided a BFD, a section and an offset into the section, calculate
1807 and return the name of the source file and the line nearest to the
1808 wanted location. */
1809
252b5132
RH
1810boolean
1811_bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset,
1812 filename_ptr, functionname_ptr, retline_ptr)
1813 bfd *abfd;
1814 asection *section;
5f771d47 1815 asymbol **ignore_symbols ATTRIBUTE_UNUSED;
252b5132
RH
1816 bfd_vma offset;
1817 CONST char **filename_ptr;
1818 CONST char **functionname_ptr;
1819 unsigned int *retline_ptr;
1820{
1821 const struct ecoff_debug_swap * const debug_swap
1822 = &ecoff_backend (abfd)->debug_swap;
1823 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1824 struct ecoff_find_line *line_info;
1825
1826 /* Make sure we have the FDR's. */
1827 if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL, debug_info)
1828 || bfd_get_symcount (abfd) == 0)
1829 return false;
1830
1831 if (ecoff_data (abfd)->find_line_info == NULL)
1832 {
1833 ecoff_data (abfd)->find_line_info =
1834 ((struct ecoff_find_line *)
1835 bfd_zalloc (abfd, sizeof (struct ecoff_find_line)));
1836 if (ecoff_data (abfd)->find_line_info == NULL)
1837 return false;
1838 }
1839 line_info = ecoff_data (abfd)->find_line_info;
1840
1841 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info,
1842 debug_swap, line_info, filename_ptr,
1843 functionname_ptr, retline_ptr);
1844}
1845\f
1846/* Copy private BFD data. This is called by objcopy and strip. We
1847 use it to copy the ECOFF debugging information from one BFD to the
1848 other. It would be theoretically possible to represent the ECOFF
1849 debugging information in the symbol table. However, it would be a
1850 lot of work, and there would be little gain (gas, gdb, and ld
1851 already access the ECOFF debugging information via the
1852 ecoff_debug_info structure, and that structure would have to be
1853 retained in order to support ECOFF debugging in MIPS ELF).
1854
1855 The debugging information for the ECOFF external symbols comes from
1856 the symbol table, so this function only handles the other debugging
1857 information. */
1858
1859boolean
1860_bfd_ecoff_bfd_copy_private_bfd_data (ibfd, obfd)
1861 bfd *ibfd;
1862 bfd *obfd;
1863{
1864 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
1865 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
1866 register int i;
1867 asymbol **sym_ptr_ptr;
1868 size_t c;
1869 boolean local;
1870
1871 /* We only want to copy information over if both BFD's use ECOFF
1872 format. */
1873 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour
1874 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
1875 return true;
1876
1877 /* Copy the GP value and the register masks. */
1878 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
1879 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
1880 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
1881 for (i = 0; i < 3; i++)
1882 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
1883
1884 /* Copy the version stamp. */
1885 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
1886
1887 /* If there are no symbols, don't copy any debugging information. */
1888 c = bfd_get_symcount (obfd);
1889 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1890 if (c == 0 || sym_ptr_ptr == (asymbol **) NULL)
1891 return true;
1892
1893 /* See if there are any local symbols. */
1894 local = false;
1895 for (; c > 0; c--, sym_ptr_ptr++)
1896 {
1897 if (ecoffsymbol (*sym_ptr_ptr)->local)
1898 {
1899 local = true;
1900 break;
1901 }
1902 }
1903
1904 if (local)
1905 {
1906 /* There are some local symbols. We just bring over all the
1907 debugging information. FIXME: This is not quite the right
1908 thing to do. If the user has asked us to discard all
1909 debugging information, then we are probably going to wind up
1910 keeping it because there will probably be some local symbol
1911 which objcopy did not discard. We should actually break
1912 apart the debugging information and only keep that which
1913 applies to the symbols we want to keep. */
1914 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
1915 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
1916 oinfo->line = iinfo->line;
1917
1918 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
1919 oinfo->external_dnr = iinfo->external_dnr;
1920
1921 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
1922 oinfo->external_pdr = iinfo->external_pdr;
1923
1924 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
1925 oinfo->external_sym = iinfo->external_sym;
1926
1927 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
1928 oinfo->external_opt = iinfo->external_opt;
1929
1930 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
1931 oinfo->external_aux = iinfo->external_aux;
1932
1933 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
1934 oinfo->ss = iinfo->ss;
1935
1936 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
1937 oinfo->external_fdr = iinfo->external_fdr;
1938
1939 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
1940 oinfo->external_rfd = iinfo->external_rfd;
1941 }
1942 else
1943 {
1944 /* We are discarding all the local symbol information. Look
1945 through the external symbols and remove all references to FDR
1946 or aux information. */
1947 c = bfd_get_symcount (obfd);
1948 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1949 for (; c > 0; c--, sym_ptr_ptr++)
1950 {
1951 EXTR esym;
1952
1953 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
1954 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
1955 esym.ifd = ifdNil;
1956 esym.asym.index = indexNil;
1957 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
1958 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
1959 }
1960 }
1961
1962 return true;
1963}
1964\f
1965/* Set the architecture. The supported architecture is stored in the
1966 backend pointer. We always set the architecture anyhow, since many
1967 callers ignore the return value. */
1968
1969boolean
1970_bfd_ecoff_set_arch_mach (abfd, arch, machine)
1971 bfd *abfd;
1972 enum bfd_architecture arch;
1973 unsigned long machine;
1974{
1975 bfd_default_set_arch_mach (abfd, arch, machine);
1976 return arch == ecoff_backend (abfd)->arch;
1977}
1978
1979/* Get the size of the section headers. */
1980
252b5132
RH
1981int
1982_bfd_ecoff_sizeof_headers (abfd, reloc)
1983 bfd *abfd;
5f771d47 1984 boolean reloc ATTRIBUTE_UNUSED;
252b5132
RH
1985{
1986 asection *current;
1987 int c;
1988 int ret;
1989
1990 c = 0;
1991 for (current = abfd->sections;
1abaf976
KH
1992 current != (asection *)NULL;
1993 current = current->next)
252b5132
RH
1994 ++c;
1995
1996 ret = (bfd_coff_filhsz (abfd)
1997 + bfd_coff_aoutsz (abfd)
1998 + c * bfd_coff_scnhsz (abfd));
1999 return BFD_ALIGN (ret, 16);
2000}
2001
2002/* Get the contents of a section. */
2003
2004boolean
2005_bfd_ecoff_get_section_contents (abfd, section, location, offset, count)
2006 bfd *abfd;
2007 asection *section;
2008 PTR location;
2009 file_ptr offset;
2010 bfd_size_type count;
2011{
2012 return _bfd_generic_get_section_contents (abfd, section, location,
2013 offset, count);
2014}
2015
2016/* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2017 called via qsort. */
2018
2019static int
2020ecoff_sort_hdrs (arg1, arg2)
2021 const PTR arg1;
2022 const PTR arg2;
2023{
2024 const asection *hdr1 = *(const asection **) arg1;
2025 const asection *hdr2 = *(const asection **) arg2;
2026
2027 if ((hdr1->flags & SEC_ALLOC) != 0)
2028 {
2029 if ((hdr2->flags & SEC_ALLOC) == 0)
2030 return -1;
2031 }
2032 else
2033 {
2034 if ((hdr2->flags & SEC_ALLOC) != 0)
2035 return 1;
2036 }
2037 if (hdr1->vma < hdr2->vma)
2038 return -1;
2039 else if (hdr1->vma > hdr2->vma)
2040 return 1;
2041 else
2042 return 0;
2043}
2044
2045/* Calculate the file position for each section, and set
2046 reloc_filepos. */
2047
2048static boolean
2049ecoff_compute_section_file_positions (abfd)
2050 bfd *abfd;
2051{
2052 file_ptr sofar, file_sofar;
2053 asection **sorted_hdrs;
2054 asection *current;
2055 unsigned int i;
2056 file_ptr old_sofar;
2057 boolean rdata_in_text;
2058 boolean first_data, first_nonalloc;
2059 const bfd_vma round = ecoff_backend (abfd)->round;
2060
2061 sofar = _bfd_ecoff_sizeof_headers (abfd, false);
2062 file_sofar = sofar;
2063
2064 /* Sort the sections by VMA. */
2065 sorted_hdrs = (asection **) bfd_malloc (abfd->section_count
2066 * sizeof (asection *));
2067 if (sorted_hdrs == NULL)
2068 return false;
2069 for (current = abfd->sections, i = 0;
2070 current != NULL;
2071 current = current->next, i++)
2072 sorted_hdrs[i] = current;
2073 BFD_ASSERT (i == abfd->section_count);
2074
2075 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *),
2076 ecoff_sort_hdrs);
2077
2078 /* Some versions of the OSF linker put the .rdata section in the
2079 text segment, and some do not. */
2080 rdata_in_text = ecoff_backend (abfd)->rdata_in_text;
2081 if (rdata_in_text)
2082 {
2083 for (i = 0; i < abfd->section_count; i++)
2084 {
2085 current = sorted_hdrs[i];
2086 if (strcmp (current->name, _RDATA) == 0)
2087 break;
2088 if ((current->flags & SEC_CODE) == 0
2089 && strcmp (current->name, _PDATA) != 0
2090 && strcmp (current->name, _RCONST) != 0)
2091 {
2092 rdata_in_text = false;
2093 break;
2094 }
2095 }
2096 }
2097 ecoff_data (abfd)->rdata_in_text = rdata_in_text;
2098
2099 first_data = true;
2100 first_nonalloc = true;
2101 for (i = 0; i < abfd->section_count; i++)
2102 {
2103 unsigned int alignment_power;
2104
2105 current = sorted_hdrs[i];
2106
2107 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2108 supposed to indicate the number of .pdata entries that are
2109 really in the section. Each entry is 8 bytes. We store this
2110 away in line_filepos before increasing the section size. */
2111 if (strcmp (current->name, _PDATA) == 0)
2112 current->line_filepos = current->_raw_size / 8;
2113
2114 alignment_power = current->alignment_power;
2115
2116 /* On Ultrix, the data sections in an executable file must be
2117 aligned to a page boundary within the file. This does not
2118 affect the section size, though. FIXME: Does this work for
2119 other platforms? It requires some modification for the
2120 Alpha, because .rdata on the Alpha goes with the text, not
2121 the data. */
2122 if ((abfd->flags & EXEC_P) != 0
2123 && (abfd->flags & D_PAGED) != 0
2124 && ! first_data
2125 && (current->flags & SEC_CODE) == 0
2126 && (! rdata_in_text
2127 || strcmp (current->name, _RDATA) != 0)
2128 && strcmp (current->name, _PDATA) != 0
2129 && strcmp (current->name, _RCONST) != 0)
2130 {
2131 sofar = (sofar + round - 1) &~ (round - 1);
2132 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2133 first_data = false;
2134 }
2135 else if (strcmp (current->name, _LIB) == 0)
2136 {
2137 /* On Irix 4, the location of contents of the .lib section
2138 from a shared library section is also rounded up to a
2139 page boundary. */
2140
2141 sofar = (sofar + round - 1) &~ (round - 1);
2142 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2143 }
2144 else if (first_nonalloc
2145 && (current->flags & SEC_ALLOC) == 0
2146 && (abfd->flags & D_PAGED) != 0)
2147 {
2148 /* Skip up to the next page for an unallocated section, such
2149 as the .comment section on the Alpha. This leaves room
2150 for the .bss section. */
2151 first_nonalloc = false;
2152 sofar = (sofar + round - 1) &~ (round - 1);
2153 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2154 }
2155
2156 /* Align the sections in the file to the same boundary on
2157 which they are aligned in virtual memory. */
2158 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2159 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2160 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2161
2162 if ((abfd->flags & D_PAGED) != 0
2163 && (current->flags & SEC_ALLOC) != 0)
2164 {
2165 sofar += (current->vma - sofar) % round;
2166 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2167 file_sofar += (current->vma - file_sofar) % round;
2168 }
2169
2170 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
2171 current->filepos = file_sofar;
2172
2173 sofar += current->_raw_size;
2174 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2175 file_sofar += current->_raw_size;
2176
2177 /* make sure that this section is of the right size too */
2178 old_sofar = sofar;
2179 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2180 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2181 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2182 current->_raw_size += sofar - old_sofar;
2183 }
2184
2185 free (sorted_hdrs);
2186 sorted_hdrs = NULL;
2187
2188 ecoff_data (abfd)->reloc_filepos = file_sofar;
2189
2190 return true;
2191}
2192
2193/* Determine the location of the relocs for all the sections in the
2194 output file, as well as the location of the symbolic debugging
2195 information. */
2196
2197static bfd_size_type
2198ecoff_compute_reloc_file_positions (abfd)
2199 bfd *abfd;
2200{
2201 const bfd_size_type external_reloc_size =
2202 ecoff_backend (abfd)->external_reloc_size;
2203 file_ptr reloc_base;
2204 bfd_size_type reloc_size;
2205 asection *current;
2206 file_ptr sym_base;
2207
2208 if (! abfd->output_has_begun)
2209 {
2210 if (! ecoff_compute_section_file_positions (abfd))
2211 abort ();
2212 abfd->output_has_begun = true;
2213 }
1abaf976 2214
252b5132
RH
2215 reloc_base = ecoff_data (abfd)->reloc_filepos;
2216
2217 reloc_size = 0;
2218 for (current = abfd->sections;
1abaf976
KH
2219 current != (asection *)NULL;
2220 current = current->next)
252b5132
RH
2221 {
2222 if (current->reloc_count == 0)
2223 current->rel_filepos = 0;
2224 else
2225 {
2226 bfd_size_type relsize;
2227
2228 current->rel_filepos = reloc_base;
2229 relsize = current->reloc_count * external_reloc_size;
2230 reloc_size += relsize;
2231 reloc_base += relsize;
2232 }
2233 }
2234
2235 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2236
2237 /* At least on Ultrix, the symbol table of an executable file must
2238 be aligned to a page boundary. FIXME: Is this true on other
2239 platforms? */
2240 if ((abfd->flags & EXEC_P) != 0
2241 && (abfd->flags & D_PAGED) != 0)
2242 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2243 &~ (ecoff_backend (abfd)->round - 1));
2244
2245 ecoff_data (abfd)->sym_filepos = sym_base;
2246
2247 return reloc_size;
2248}
2249
2250/* Set the contents of a section. */
2251
2252boolean
2253_bfd_ecoff_set_section_contents (abfd, section, location, offset, count)
2254 bfd *abfd;
2255 asection *section;
2256 PTR location;
2257 file_ptr offset;
2258 bfd_size_type count;
2259{
2260 /* This must be done first, because bfd_set_section_contents is
2261 going to set output_has_begun to true. */
2262 if (abfd->output_has_begun == false)
2263 {
2264 if (! ecoff_compute_section_file_positions (abfd))
2265 return false;
2266 }
2267
2268 /* Handle the .lib section specially so that Irix 4 shared libraries
2269 work out. See coff_set_section_contents in coffcode.h. */
2270 if (strcmp (section->name, _LIB) == 0)
2271 {
2272 bfd_byte *rec, *recend;
2273
2274 rec = (bfd_byte *) location;
2275 recend = rec + count;
2276 while (rec < recend)
2277 {
2278 ++section->lma;
2279 rec += bfd_get_32 (abfd, rec) * 4;
2280 }
2281
2282 BFD_ASSERT (rec == recend);
2283 }
2284
2285 if (count == 0)
2286 return true;
2287
2288 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0
2289 || bfd_write (location, 1, count, abfd) != count)
2290 return false;
2291
2292 return true;
2293}
2294
2295/* Get the GP value for an ECOFF file. This is a hook used by
2296 nlmconv. */
2297
2298bfd_vma
2299bfd_ecoff_get_gp_value (abfd)
2300 bfd *abfd;
2301{
2302 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2303 || bfd_get_format (abfd) != bfd_object)
2304 {
2305 bfd_set_error (bfd_error_invalid_operation);
2306 return 0;
2307 }
1abaf976 2308
252b5132
RH
2309 return ecoff_data (abfd)->gp;
2310}
2311
2312/* Set the GP value for an ECOFF file. This is a hook used by the
2313 assembler. */
2314
2315boolean
2316bfd_ecoff_set_gp_value (abfd, gp_value)
2317 bfd *abfd;
2318 bfd_vma gp_value;
2319{
2320 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2321 || bfd_get_format (abfd) != bfd_object)
2322 {
2323 bfd_set_error (bfd_error_invalid_operation);
2324 return false;
2325 }
2326
2327 ecoff_data (abfd)->gp = gp_value;
2328
2329 return true;
2330}
2331
2332/* Set the register masks for an ECOFF file. This is a hook used by
2333 the assembler. */
2334
2335boolean
2336bfd_ecoff_set_regmasks (abfd, gprmask, fprmask, cprmask)
2337 bfd *abfd;
2338 unsigned long gprmask;
2339 unsigned long fprmask;
2340 unsigned long *cprmask;
2341{
2342 ecoff_data_type *tdata;
2343
2344 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2345 || bfd_get_format (abfd) != bfd_object)
2346 {
2347 bfd_set_error (bfd_error_invalid_operation);
2348 return false;
2349 }
2350
2351 tdata = ecoff_data (abfd);
2352 tdata->gprmask = gprmask;
2353 tdata->fprmask = fprmask;
2354 if (cprmask != (unsigned long *) NULL)
2355 {
2356 register int i;
2357
2358 for (i = 0; i < 3; i++)
2359 tdata->cprmask[i] = cprmask[i];
2360 }
2361
2362 return true;
2363}
2364
2365/* Get ECOFF EXTR information for an external symbol. This function
2366 is passed to bfd_ecoff_debug_externals. */
2367
2368static boolean
2369ecoff_get_extr (sym, esym)
2370 asymbol *sym;
2371 EXTR *esym;
2372{
2373 ecoff_symbol_type *ecoff_sym_ptr;
2374 bfd *input_bfd;
2375
2376 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2377 || ecoffsymbol (sym)->native == NULL)
2378 {
2379 /* Don't include debugging, local, or section symbols. */
2380 if ((sym->flags & BSF_DEBUGGING) != 0
2381 || (sym->flags & BSF_LOCAL) != 0
2382 || (sym->flags & BSF_SECTION_SYM) != 0)
2383 return false;
2384
2385 esym->jmptbl = 0;
2386 esym->cobol_main = 0;
2387 esym->weakext = (sym->flags & BSF_WEAK) != 0;
2388 esym->reserved = 0;
2389 esym->ifd = ifdNil;
2390 /* FIXME: we can do better than this for st and sc. */
2391 esym->asym.st = stGlobal;
2392 esym->asym.sc = scAbs;
2393 esym->asym.reserved = 0;
2394 esym->asym.index = indexNil;
2395 return true;
2396 }
2397
2398 ecoff_sym_ptr = ecoffsymbol (sym);
2399
2400 if (ecoff_sym_ptr->local)
2401 return false;
2402
2403 input_bfd = bfd_asymbol_bfd (sym);
2404 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2405 (input_bfd, ecoff_sym_ptr->native, esym);
2406
2407 /* If the symbol was defined by the linker, then esym will be
2408 undefined but sym will not be. Get a better class for such a
2409 symbol. */
2410 if ((esym->asym.sc == scUndefined
2411 || esym->asym.sc == scSUndefined)
2412 && ! bfd_is_und_section (bfd_get_section (sym)))
2413 esym->asym.sc = scAbs;
2414
2415 /* Adjust the FDR index for the symbol by that used for the input
2416 BFD. */
2417 if (esym->ifd != -1)
2418 {
2419 struct ecoff_debug_info *input_debug;
2420
2421 input_debug = &ecoff_data (input_bfd)->debug_info;
2422 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
2423 if (input_debug->ifdmap != (RFDT *) NULL)
2424 esym->ifd = input_debug->ifdmap[esym->ifd];
2425 }
2426
2427 return true;
2428}
2429
2430/* Set the external symbol index. This routine is passed to
2431 bfd_ecoff_debug_externals. */
2432
2433static void
2434ecoff_set_index (sym, indx)
2435 asymbol *sym;
2436 bfd_size_type indx;
2437{
2438 ecoff_set_sym_index (sym, indx);
2439}
2440
2441/* Write out an ECOFF file. */
2442
2443boolean
2444_bfd_ecoff_write_object_contents (abfd)
2445 bfd *abfd;
2446{
2447 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2448 const bfd_vma round = backend->round;
2449 const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2450 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2451 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2452 const bfd_size_type external_hdr_size
2453 = backend->debug_swap.external_hdr_size;
2454 const bfd_size_type external_reloc_size = backend->external_reloc_size;
2455 void (* const adjust_reloc_out) PARAMS ((bfd *,
2456 const arelent *,
2457 struct internal_reloc *))
2458 = backend->adjust_reloc_out;
2459 void (* const swap_reloc_out) PARAMS ((bfd *,
2460 const struct internal_reloc *,
2461 PTR))
2462 = backend->swap_reloc_out;
2463 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2464 HDRR * const symhdr = &debug->symbolic_header;
2465 asection *current;
2466 unsigned int count;
2467 bfd_size_type reloc_size;
2468 bfd_size_type text_size;
2469 bfd_vma text_start;
2470 boolean set_text_start;
2471 bfd_size_type data_size;
2472 bfd_vma data_start;
2473 boolean set_data_start;
2474 bfd_size_type bss_size;
2475 PTR buff = NULL;
2476 PTR reloc_buff = NULL;
2477 struct internal_filehdr internal_f;
2478 struct internal_aouthdr internal_a;
2479 int i;
2480
2481 /* Determine where the sections and relocs will go in the output
2482 file. */
2483 reloc_size = ecoff_compute_reloc_file_positions (abfd);
2484
2485 count = 1;
2486 for (current = abfd->sections;
1abaf976
KH
2487 current != (asection *)NULL;
2488 current = current->next)
252b5132
RH
2489 {
2490 current->target_index = count;
2491 ++count;
2492 }
2493
2494 if ((abfd->flags & D_PAGED) != 0)
2495 text_size = _bfd_ecoff_sizeof_headers (abfd, false);
2496 else
2497 text_size = 0;
2498 text_start = 0;
2499 set_text_start = false;
2500 data_size = 0;
2501 data_start = 0;
2502 set_data_start = false;
2503 bss_size = 0;
2504
2505 /* Write section headers to the file. */
2506
2507 /* Allocate buff big enough to hold a section header,
2508 file header, or a.out header. */
2509 {
2510 bfd_size_type siz;
2511 siz = scnhsz;
2512 if (siz < filhsz)
2513 siz = filhsz;
2514 if (siz < aoutsz)
2515 siz = aoutsz;
2516 buff = (PTR) bfd_malloc ((size_t) siz);
2517 if (buff == NULL)
2518 goto error_return;
2519 }
2520
2521 internal_f.f_nscns = 0;
2522 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2523 goto error_return;
2524 for (current = abfd->sections;
2525 current != (asection *) NULL;
2526 current = current->next)
2527 {
2528 struct internal_scnhdr section;
2529 bfd_vma vma;
2530
2531 ++internal_f.f_nscns;
2532
2533 strncpy (section.s_name, current->name, sizeof section.s_name);
2534
2535 /* This seems to be correct for Irix 4 shared libraries. */
2536 vma = bfd_get_section_vma (abfd, current);
2537 if (strcmp (current->name, _LIB) == 0)
2538 section.s_vaddr = 0;
2539 else
2540 section.s_vaddr = vma;
2541
2542 section.s_paddr = current->lma;
2543 section.s_size = bfd_get_section_size_before_reloc (current);
2544
2545 /* If this section is unloadable then the scnptr will be 0. */
2546 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2547 section.s_scnptr = 0;
2548 else
2549 section.s_scnptr = current->filepos;
2550 section.s_relptr = current->rel_filepos;
2551
2552 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2553 object file produced by the assembler is supposed to point to
2554 information about how much room is required by objects of
2555 various different sizes. I think this only matters if we
2556 want the linker to compute the best size to use, or
2557 something. I don't know what happens if the information is
2558 not present. */
2559 if (strcmp (current->name, _PDATA) != 0)
2560 section.s_lnnoptr = 0;
2561 else
2562 {
2563 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2564 hold the number of entries in the section (each entry is
2565 8 bytes). We stored this in the line_filepos field in
2566 ecoff_compute_section_file_positions. */
2567 section.s_lnnoptr = current->line_filepos;
2568 }
2569
2570 section.s_nreloc = current->reloc_count;
2571 section.s_nlnno = 0;
2572 section.s_flags = ecoff_sec_to_styp_flags (current->name,
2573 current->flags);
2574
2575 if (bfd_coff_swap_scnhdr_out (abfd, (PTR) &section, buff) == 0
2576 || bfd_write (buff, 1, scnhsz, abfd) != scnhsz)
2577 goto error_return;
2578
2579 if ((section.s_flags & STYP_TEXT) != 0
2580 || ((section.s_flags & STYP_RDATA) != 0
2581 && ecoff_data (abfd)->rdata_in_text)
2582 || section.s_flags == STYP_PDATA
2583 || (section.s_flags & STYP_DYNAMIC) != 0
2584 || (section.s_flags & STYP_LIBLIST) != 0
2585 || (section.s_flags & STYP_RELDYN) != 0
2586 || section.s_flags == STYP_CONFLIC
2587 || (section.s_flags & STYP_DYNSTR) != 0
2588 || (section.s_flags & STYP_DYNSYM) != 0
2589 || (section.s_flags & STYP_HASH) != 0
2590 || (section.s_flags & STYP_ECOFF_INIT) != 0
2591 || (section.s_flags & STYP_ECOFF_FINI) != 0
2592 || section.s_flags == STYP_RCONST)
2593 {
2594 text_size += bfd_get_section_size_before_reloc (current);
2595 if (! set_text_start || text_start > vma)
2596 {
2597 text_start = vma;
2598 set_text_start = true;
2599 }
2600 }
2601 else if ((section.s_flags & STYP_RDATA) != 0
2602 || (section.s_flags & STYP_DATA) != 0
2603 || (section.s_flags & STYP_LITA) != 0
2604 || (section.s_flags & STYP_LIT8) != 0
2605 || (section.s_flags & STYP_LIT4) != 0
2606 || (section.s_flags & STYP_SDATA) != 0
2607 || section.s_flags == STYP_XDATA
2608 || (section.s_flags & STYP_GOT) != 0)
2609 {
2610 data_size += bfd_get_section_size_before_reloc (current);
2611 if (! set_data_start || data_start > vma)
2612 {
2613 data_start = vma;
2614 set_data_start = true;
2615 }
2616 }
2617 else if ((section.s_flags & STYP_BSS) != 0
2618 || (section.s_flags & STYP_SBSS) != 0)
2619 bss_size += bfd_get_section_size_before_reloc (current);
2620 else if (section.s_flags == 0
2621 || (section.s_flags & STYP_ECOFF_LIB) != 0
2622 || section.s_flags == STYP_COMMENT)
2623 /* Do nothing */ ;
2624 else
2625 abort ();
1abaf976 2626 }
252b5132
RH
2627
2628 /* Set up the file header. */
2629
2630 internal_f.f_magic = ecoff_get_magic (abfd);
2631
2632 /* We will NOT put a fucking timestamp in the header here. Every
2633 time you put it back, I will come in and take it out again. I'm
2634 sorry. This field does not belong here. We fill it with a 0 so
2635 it compares the same but is not a reasonable time. --
2636 gnu@cygnus.com. */
2637 internal_f.f_timdat = 0;
2638
2639 if (bfd_get_symcount (abfd) != 0)
2640 {
2641 /* The ECOFF f_nsyms field is not actually the number of
2642 symbols, it's the size of symbolic information header. */
2643 internal_f.f_nsyms = external_hdr_size;
2644 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
2645 }
2646 else
2647 {
2648 internal_f.f_nsyms = 0;
2649 internal_f.f_symptr = 0;
2650 }
2651
2652 internal_f.f_opthdr = aoutsz;
2653
2654 internal_f.f_flags = F_LNNO;
2655 if (reloc_size == 0)
2656 internal_f.f_flags |= F_RELFLG;
2657 if (bfd_get_symcount (abfd) == 0)
2658 internal_f.f_flags |= F_LSYMS;
2659 if (abfd->flags & EXEC_P)
2660 internal_f.f_flags |= F_EXEC;
2661
2662 if (bfd_little_endian (abfd))
2663 internal_f.f_flags |= F_AR32WR;
2664 else
2665 internal_f.f_flags |= F_AR32W;
2666
2667 /* Set up the ``optional'' header. */
2668 if ((abfd->flags & D_PAGED) != 0)
2669 internal_a.magic = ECOFF_AOUT_ZMAGIC;
2670 else
2671 internal_a.magic = ECOFF_AOUT_OMAGIC;
2672
2673 /* FIXME: Is this really correct? */
2674 internal_a.vstamp = symhdr->vstamp;
2675
2676 /* At least on Ultrix, these have to be rounded to page boundaries.
2677 FIXME: Is this true on other platforms? */
2678 if ((abfd->flags & D_PAGED) != 0)
2679 {
2680 internal_a.tsize = (text_size + round - 1) &~ (round - 1);
2681 internal_a.text_start = text_start &~ (round - 1);
2682 internal_a.dsize = (data_size + round - 1) &~ (round - 1);
2683 internal_a.data_start = data_start &~ (round - 1);
2684 }
2685 else
2686 {
2687 internal_a.tsize = text_size;
2688 internal_a.text_start = text_start;
2689 internal_a.dsize = data_size;
2690 internal_a.data_start = data_start;
2691 }
2692
2693 /* On Ultrix, the initial portions of the .sbss and .bss segments
2694 are at the end of the data section. The bsize field in the
2695 optional header records how many bss bytes are required beyond
2696 those in the data section. The value is not rounded to a page
2697 boundary. */
2698 if (bss_size < internal_a.dsize - data_size)
2699 bss_size = 0;
2700 else
2701 bss_size -= internal_a.dsize - data_size;
2702 internal_a.bsize = bss_size;
2703 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
2704
2705 internal_a.entry = bfd_get_start_address (abfd);
2706
2707 internal_a.gp_value = ecoff_data (abfd)->gp;
2708
2709 internal_a.gprmask = ecoff_data (abfd)->gprmask;
2710 internal_a.fprmask = ecoff_data (abfd)->fprmask;
2711 for (i = 0; i < 4; i++)
2712 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
2713
2714 /* Let the backend adjust the headers if necessary. */
2715 if (backend->adjust_headers)
2716 {
2717 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a))
2718 goto error_return;
2719 }
2720
2721 /* Write out the file header and the optional header. */
2722
2723 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2724 goto error_return;
2725
2726 bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, buff);
2727 if (bfd_write (buff, 1, filhsz, abfd) != filhsz)
2728 goto error_return;
2729
2730 bfd_coff_swap_aouthdr_out (abfd, (PTR) &internal_a, buff);
2731 if (bfd_write (buff, 1, aoutsz, abfd) != aoutsz)
2732 goto error_return;
2733
2734 /* Build the external symbol information. This must be done before
2735 writing out the relocs so that we know the symbol indices. We
2736 don't do this if this BFD was created by the backend linker,
2737 since it will have already handled the symbols and relocs. */
2738 if (! ecoff_data (abfd)->linker)
2739 {
2740 symhdr->iextMax = 0;
2741 symhdr->issExtMax = 0;
2742 debug->external_ext = debug->external_ext_end = NULL;
2743 debug->ssext = debug->ssext_end = NULL;
2744 if (bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2745 (((abfd->flags & EXEC_P) == 0)
2746 ? true : false),
2747 ecoff_get_extr, ecoff_set_index)
2748 == false)
2749 goto error_return;
2750
2751 /* Write out the relocs. */
2752 for (current = abfd->sections;
2753 current != (asection *) NULL;
2754 current = current->next)
2755 {
2756 arelent **reloc_ptr_ptr;
2757 arelent **reloc_end;
2758 char *out_ptr;
2759
2760 if (current->reloc_count == 0)
2761 continue;
2762
2763 reloc_buff =
2764 bfd_alloc (abfd, current->reloc_count * external_reloc_size);
2765 if (reloc_buff == NULL)
2766 goto error_return;
2767
2768 reloc_ptr_ptr = current->orelocation;
2769 reloc_end = reloc_ptr_ptr + current->reloc_count;
2770 out_ptr = (char *) reloc_buff;
2771 for (;
2772 reloc_ptr_ptr < reloc_end;
2773 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2774 {
2775 arelent *reloc;
2776 asymbol *sym;
2777 struct internal_reloc in;
1abaf976 2778
252b5132
RH
2779 memset ((PTR) &in, 0, sizeof in);
2780
2781 reloc = *reloc_ptr_ptr;
2782 sym = *reloc->sym_ptr_ptr;
2783
2784 in.r_vaddr = (reloc->address
2785 + bfd_get_section_vma (abfd, current));
2786 in.r_type = reloc->howto->type;
2787
2788 if ((sym->flags & BSF_SECTION_SYM) == 0)
2789 {
2790 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2791 in.r_extern = 1;
2792 }
2793 else
2794 {
2795 CONST char *name;
2796
2797 name = bfd_get_section_name (abfd, bfd_get_section (sym));
2798 if (strcmp (name, ".text") == 0)
2799 in.r_symndx = RELOC_SECTION_TEXT;
2800 else if (strcmp (name, ".rdata") == 0)
2801 in.r_symndx = RELOC_SECTION_RDATA;
2802 else if (strcmp (name, ".data") == 0)
2803 in.r_symndx = RELOC_SECTION_DATA;
2804 else if (strcmp (name, ".sdata") == 0)
2805 in.r_symndx = RELOC_SECTION_SDATA;
2806 else if (strcmp (name, ".sbss") == 0)
2807 in.r_symndx = RELOC_SECTION_SBSS;
2808 else if (strcmp (name, ".bss") == 0)
2809 in.r_symndx = RELOC_SECTION_BSS;
2810 else if (strcmp (name, ".init") == 0)
2811 in.r_symndx = RELOC_SECTION_INIT;
2812 else if (strcmp (name, ".lit8") == 0)
2813 in.r_symndx = RELOC_SECTION_LIT8;
2814 else if (strcmp (name, ".lit4") == 0)
2815 in.r_symndx = RELOC_SECTION_LIT4;
2816 else if (strcmp (name, ".xdata") == 0)
2817 in.r_symndx = RELOC_SECTION_XDATA;
2818 else if (strcmp (name, ".pdata") == 0)
2819 in.r_symndx = RELOC_SECTION_PDATA;
2820 else if (strcmp (name, ".fini") == 0)
2821 in.r_symndx = RELOC_SECTION_FINI;
2822 else if (strcmp (name, ".lita") == 0)
2823 in.r_symndx = RELOC_SECTION_LITA;
2824 else if (strcmp (name, "*ABS*") == 0)
2825 in.r_symndx = RELOC_SECTION_ABS;
2826 else if (strcmp (name, ".rconst") == 0)
2827 in.r_symndx = RELOC_SECTION_RCONST;
2828 else
2829 abort ();
2830 in.r_extern = 0;
2831 }
2832
2833 (*adjust_reloc_out) (abfd, reloc, &in);
2834
2835 (*swap_reloc_out) (abfd, &in, (PTR) out_ptr);
2836 }
2837
2838 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
2839 goto error_return;
2840 if (bfd_write (reloc_buff,
2841 external_reloc_size, current->reloc_count, abfd)
2842 != external_reloc_size * current->reloc_count)
2843 goto error_return;
2844 bfd_release (abfd, reloc_buff);
2845 reloc_buff = NULL;
2846 }
2847
2848 /* Write out the symbolic debugging information. */
2849 if (bfd_get_symcount (abfd) > 0)
2850 {
2851 /* Write out the debugging information. */
2852 if (bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
2853 ecoff_data (abfd)->sym_filepos)
2854 == false)
2855 goto error_return;
2856 }
2857 }
2858
2859 /* The .bss section of a demand paged executable must receive an
2860 entire page. If there are symbols, the symbols will start on the
2861 next page. If there are no symbols, we must fill out the page by
2862 hand. */
2863 if (bfd_get_symcount (abfd) == 0
2864 && (abfd->flags & EXEC_P) != 0
2865 && (abfd->flags & D_PAGED) != 0)
2866 {
2867 char c;
2868
2869 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2870 SEEK_SET) != 0)
2871 goto error_return;
2872 if (bfd_read (&c, 1, 1, abfd) == 0)
2873 c = 0;
2874 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2875 SEEK_SET) != 0)
2876 goto error_return;
2877 if (bfd_write (&c, 1, 1, abfd) != 1)
2878 goto error_return;
2879 }
2880
2881 if (reloc_buff != NULL)
2882 bfd_release (abfd, reloc_buff);
2883 if (buff != NULL)
2884 free (buff);
2885 return true;
2886 error_return:
2887 if (reloc_buff != NULL)
2888 bfd_release (abfd, reloc_buff);
2889 if (buff != NULL)
2890 free (buff);
2891 return false;
2892}
2893\f
2894/* Archive handling. ECOFF uses what appears to be a unique type of
2895 archive header (armap). The byte ordering of the armap and the
2896 contents are encoded in the name of the armap itself. At least for
2897 now, we only support archives with the same byte ordering in the
2898 armap and the contents.
2899
2900 The first four bytes in the armap are the number of symbol
2901 definitions. This is always a power of two.
2902
2903 This is followed by the symbol definitions. Each symbol definition
2904 occupies 8 bytes. The first four bytes are the offset from the
2905 start of the armap strings to the null-terminated string naming
2906 this symbol. The second four bytes are the file offset to the
2907 archive member which defines this symbol. If the second four bytes
2908 are 0, then this is not actually a symbol definition, and it should
2909 be ignored.
2910
2911 The symbols are hashed into the armap with a closed hashing scheme.
2912 See the functions below for the details of the algorithm.
2913
2914 After the symbol definitions comes four bytes holding the size of
2915 the string table, followed by the string table itself. */
2916
2917/* The name of an archive headers looks like this:
2918 __________E[BL]E[BL]_ (with a trailing space).
2919 The trailing space is changed to an X if the archive is changed to
2920 indicate that the armap is out of date.
2921
2922 The Alpha seems to use ________64E[BL]E[BL]_. */
2923
2924#define ARMAP_BIG_ENDIAN 'B'
2925#define ARMAP_LITTLE_ENDIAN 'L'
2926#define ARMAP_MARKER 'E'
2927#define ARMAP_START_LENGTH 10
2928#define ARMAP_HEADER_MARKER_INDEX 10
2929#define ARMAP_HEADER_ENDIAN_INDEX 11
2930#define ARMAP_OBJECT_MARKER_INDEX 12
2931#define ARMAP_OBJECT_ENDIAN_INDEX 13
2932#define ARMAP_END_INDEX 14
2933#define ARMAP_END "_ "
2934
2935/* This is a magic number used in the hashing algorithm. */
2936#define ARMAP_HASH_MAGIC 0x9dd68ab5
2937
2938/* This returns the hash value to use for a string. It also sets
2939 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2940 is the number of entries in the hash table, and HLOG is the log
2941 base 2 of SIZE. */
2942
2943static unsigned int
2944ecoff_armap_hash (s, rehash, size, hlog)
2945 CONST char *s;
2946 unsigned int *rehash;
2947 unsigned int size;
2948 unsigned int hlog;
2949{
2950 unsigned int hash;
2951
2952 if (hlog == 0)
2953 return 0;
2954 hash = *s++;
2955 while (*s != '\0')
2956 hash = ((hash >> 27) | (hash << 5)) + *s++;
2957 hash *= ARMAP_HASH_MAGIC;
2958 *rehash = (hash & (size - 1)) | 1;
2959 return hash >> (32 - hlog);
2960}
2961
2962/* Read in the armap. */
2963
2964boolean
2965_bfd_ecoff_slurp_armap (abfd)
2966 bfd *abfd;
2967{
2968 char nextname[17];
2969 unsigned int i;
2970 struct areltdata *mapdata;
2971 bfd_size_type parsed_size;
2972 char *raw_armap;
2973 struct artdata *ardata;
2974 unsigned int count;
2975 char *raw_ptr;
2976 struct symdef *symdef_ptr;
2977 char *stringbase;
1abaf976 2978
252b5132
RH
2979 /* Get the name of the first element. */
2980 i = bfd_read ((PTR) nextname, 1, 16, abfd);
2981 if (i == 0)
2982 return true;
2983 if (i != 16)
2984 return false;
2985
2986 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
2987 return false;
2988
2989 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2990 standard COFF armap. We could move the ECOFF armap stuff into
2991 bfd_slurp_armap, but that seems inappropriate since no other
2992 target uses this format. Instead, we check directly for a COFF
2993 armap. */
2994 if (strncmp (nextname, "/ ", 16) == 0)
2995 return bfd_slurp_armap (abfd);
2996
2997 /* See if the first element is an armap. */
2998 if (strncmp (nextname, ecoff_backend (abfd)->armap_start,
2999 ARMAP_START_LENGTH) != 0
3000 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
3001 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3002 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3003 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
3004 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3005 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3006 || strncmp (nextname + ARMAP_END_INDEX,
3007 ARMAP_END, sizeof ARMAP_END - 1) != 0)
3008 {
3009 bfd_has_map (abfd) = false;
3010 return true;
3011 }
3012
3013 /* Make sure we have the right byte ordering. */
3014 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3015 ^ (bfd_header_big_endian (abfd)))
3016 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3017 ^ (bfd_big_endian (abfd))))
3018 {
3019 bfd_set_error (bfd_error_wrong_format);
3020 return false;
3021 }
3022
3023 /* Read in the armap. */
3024 ardata = bfd_ardata (abfd);
3025 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
3026 if (mapdata == (struct areltdata *) NULL)
3027 return false;
3028 parsed_size = mapdata->parsed_size;
3029 bfd_release (abfd, (PTR) mapdata);
1abaf976 3030
252b5132
RH
3031 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
3032 if (raw_armap == (char *) NULL)
3033 return false;
1abaf976 3034
252b5132
RH
3035 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
3036 {
3037 if (bfd_get_error () != bfd_error_system_call)
3038 bfd_set_error (bfd_error_malformed_archive);
3039 bfd_release (abfd, (PTR) raw_armap);
3040 return false;
3041 }
1abaf976 3042
252b5132
RH
3043 ardata->tdata = (PTR) raw_armap;
3044
3045 count = bfd_h_get_32 (abfd, (PTR) raw_armap);
3046
3047 ardata->symdef_count = 0;
3048 ardata->cache = (struct ar_cache *) NULL;
3049
3050 /* This code used to overlay the symdefs over the raw archive data,
3051 but that doesn't work on a 64 bit host. */
3052
3053 stringbase = raw_armap + count * 8 + 8;
3054
3055#ifdef CHECK_ARMAP_HASH
3056 {
3057 unsigned int hlog;
3058
3059 /* Double check that I have the hashing algorithm right by making
3060 sure that every symbol can be looked up successfully. */
3061 hlog = 0;
3062 for (i = 1; i < count; i <<= 1)
3063 hlog++;
3064 BFD_ASSERT (i == count);
3065
3066 raw_ptr = raw_armap + 4;
3067 for (i = 0; i < count; i++, raw_ptr += 8)
3068 {
3069 unsigned int name_offset, file_offset;
3070 unsigned int hash, rehash, srch;
1abaf976 3071
252b5132
RH
3072 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3073 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3074 if (file_offset == 0)
3075 continue;
3076 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
3077 hlog);
3078 if (hash == i)
3079 continue;
3080
3081 /* See if we can rehash to this location. */
3082 for (srch = (hash + rehash) & (count - 1);
3083 srch != hash && srch != i;
3084 srch = (srch + rehash) & (count - 1))
3085 BFD_ASSERT (bfd_h_get_32 (abfd, (PTR) (raw_armap + 8 + srch * 8))
3086 != 0);
3087 BFD_ASSERT (srch == i);
3088 }
3089 }
3090
3091#endif /* CHECK_ARMAP_HASH */
3092
3093 raw_ptr = raw_armap + 4;
3094 for (i = 0; i < count; i++, raw_ptr += 8)
3095 if (bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)) != 0)
3096 ++ardata->symdef_count;
3097
3098 symdef_ptr = ((struct symdef *)
3099 bfd_alloc (abfd,
3100 ardata->symdef_count * sizeof (struct symdef)));
3101 if (!symdef_ptr)
3102 return false;
3103
3104 ardata->symdefs = (carsym *) symdef_ptr;
3105
3106 raw_ptr = raw_armap + 4;
3107 for (i = 0; i < count; i++, raw_ptr += 8)
3108 {
3109 unsigned int name_offset, file_offset;
3110
3111 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3112 if (file_offset == 0)
3113 continue;
3114 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3115 symdef_ptr->s.name = stringbase + name_offset;
3116 symdef_ptr->file_offset = file_offset;
3117 ++symdef_ptr;
3118 }
3119
3120 ardata->first_file_filepos = bfd_tell (abfd);
3121 /* Pad to an even boundary. */
3122 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3123
3124 bfd_has_map (abfd) = true;
3125
3126 return true;
3127}
3128
3129/* Write out an armap. */
3130
3131boolean
3132_bfd_ecoff_write_armap (abfd, elength, map, orl_count, stridx)
3133 bfd *abfd;
3134 unsigned int elength;
3135 struct orl *map;
3136 unsigned int orl_count;
3137 int stridx;
3138{
3139 unsigned int hashsize, hashlog;
3140 unsigned int symdefsize;
3141 int padit;
3142 unsigned int stringsize;
3143 unsigned int mapsize;
3144 file_ptr firstreal;
3145 struct ar_hdr hdr;
3146 struct stat statbuf;
3147 unsigned int i;
3148 bfd_byte temp[4];
3149 bfd_byte *hashtable;
3150 bfd *current;
3151 bfd *last_elt;
3152
3153 /* Ultrix appears to use as a hash table size the least power of two
3154 greater than twice the number of entries. */
3155 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++)
3156 ;
3157 hashsize = 1 << hashlog;
3158
3159 symdefsize = hashsize * 8;
3160 padit = stridx % 2;
3161 stringsize = stridx + padit;
3162
1abaf976 3163 /* Include 8 bytes to store symdefsize and stringsize in output. */
252b5132
RH
3164 mapsize = symdefsize + stringsize + 8;
3165
3166 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3167
3168 memset ((PTR) &hdr, 0, sizeof hdr);
3169
3170 /* Work out the ECOFF armap name. */
3171 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3172 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3173 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3174 (bfd_header_big_endian (abfd)
3175 ? ARMAP_BIG_ENDIAN
3176 : ARMAP_LITTLE_ENDIAN);
3177 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3178 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3179 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3180 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3181
3182 /* Write the timestamp of the archive header to be just a little bit
3183 later than the timestamp of the file, otherwise the linker will
3184 complain that the index is out of date. Actually, the Ultrix
3185 linker just checks the archive name; the GNU linker may check the
3186 date. */
3187 stat (abfd->filename, &statbuf);
3188 sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60));
3189
3190 /* The DECstation uses zeroes for the uid, gid and mode of the
3191 armap. */
3192 hdr.ar_uid[0] = '0';
3193 hdr.ar_gid[0] = '0';
ec0ef80e 3194#if 0
252b5132 3195 hdr.ar_mode[0] = '0';
ec0ef80e 3196#else
1abaf976 3197 /* Building gcc ends up extracting the armap as a file - twice. */
ec0ef80e
DD
3198 hdr.ar_mode[0] = '6';
3199 hdr.ar_mode[1] = '4';
3200 hdr.ar_mode[2] = '4';
3201#endif
252b5132
RH
3202
3203 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
3204
3205 hdr.ar_fmag[0] = '`';
3206 hdr.ar_fmag[1] = '\012';
3207
3208 /* Turn all null bytes in the header into spaces. */
3209 for (i = 0; i < sizeof (struct ar_hdr); i++)
1abaf976
KH
3210 if (((char *) (&hdr))[i] == '\0')
3211 (((char *) (&hdr))[i]) = ' ';
252b5132
RH
3212
3213 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
3214 != sizeof (struct ar_hdr))
3215 return false;
3216
3217 bfd_h_put_32 (abfd, (bfd_vma) hashsize, temp);
3218 if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3219 return false;
1abaf976 3220
252b5132
RH
3221 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3222 if (!hashtable)
3223 return false;
3224
3225 current = abfd->archive_head;
3226 last_elt = current;
3227 for (i = 0; i < orl_count; i++)
3228 {
3229 unsigned int hash, rehash;
3230
3231 /* Advance firstreal to the file position of this archive
3232 element. */
3233 if (((bfd *) map[i].pos) != last_elt)
3234 {
3235 do
3236 {
3237 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3238 firstreal += firstreal % 2;
3239 current = current->next;
3240 }
3241 while (current != (bfd *) map[i].pos);
3242 }
3243
3244 last_elt = current;
3245
3246 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3247 if (bfd_h_get_32 (abfd, (PTR) (hashtable + (hash * 8) + 4)) != 0)
3248 {
3249 unsigned int srch;
3250
3251 /* The desired slot is already taken. */
3252 for (srch = (hash + rehash) & (hashsize - 1);
3253 srch != hash;
3254 srch = (srch + rehash) & (hashsize - 1))
3255 if (bfd_h_get_32 (abfd, (PTR) (hashtable + (srch * 8) + 4)) == 0)
3256 break;
3257
3258 BFD_ASSERT (srch != hash);
3259
3260 hash = srch;
3261 }
1abaf976 3262
252b5132
RH
3263 bfd_h_put_32 (abfd, (bfd_vma) map[i].namidx,
3264 (PTR) (hashtable + hash * 8));
3265 bfd_h_put_32 (abfd, (bfd_vma) firstreal,
3266 (PTR) (hashtable + hash * 8 + 4));
3267 }
3268
3269 if (bfd_write ((PTR) hashtable, 1, symdefsize, abfd) != symdefsize)
3270 return false;
3271
3272 bfd_release (abfd, hashtable);
3273
3274 /* Now write the strings. */
3275 bfd_h_put_32 (abfd, (bfd_vma) stringsize, temp);
3276 if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3277 return false;
3278 for (i = 0; i < orl_count; i++)
3279 {
3280 bfd_size_type len;
3281
3282 len = strlen (*map[i].name) + 1;
3283 if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len)
3284 return false;
3285 }
3286
3287 /* The spec sez this should be a newline. But in order to be
3288 bug-compatible for DECstation ar we use a null. */
3289 if (padit)
3290 {
3291 if (bfd_write ("", 1, 1, abfd) != 1)
3292 return false;
3293 }
3294
3295 return true;
3296}
3297
3298/* See whether this BFD is an archive. If it is, read in the armap
3299 and the extended name table. */
3300
3301const bfd_target *
3302_bfd_ecoff_archive_p (abfd)
3303 bfd *abfd;
3304{
3305 struct artdata *tdata_hold;
3306 char armag[SARMAG + 1];
3307
3308 tdata_hold = abfd->tdata.aout_ar_data;
3309
3310 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG)
3311 {
3312 if (bfd_get_error () != bfd_error_system_call)
3313 bfd_set_error (bfd_error_wrong_format);
3314 return (const bfd_target *) NULL;
3315 }
3316
3317 if (strncmp (armag, ARMAG, SARMAG) != 0)
3318 {
3319 bfd_set_error (bfd_error_wrong_format);
3320 return NULL;
3321 }
3322
3323 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3324 involves a cast, we can't do it as the left operand of
3325 assignment. */
3326 abfd->tdata.aout_ar_data =
3327 (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata));
3328
3329 if (bfd_ardata (abfd) == (struct artdata *) NULL)
3330 {
3331 abfd->tdata.aout_ar_data = tdata_hold;
3332 return (const bfd_target *) NULL;
3333 }
3334
3335 bfd_ardata (abfd)->first_file_filepos = SARMAG;
3336 bfd_ardata (abfd)->cache = NULL;
3337 bfd_ardata (abfd)->archive_head = NULL;
3338 bfd_ardata (abfd)->symdefs = NULL;
3339 bfd_ardata (abfd)->extended_names = NULL;
3340 bfd_ardata (abfd)->tdata = NULL;
1abaf976 3341
252b5132
RH
3342 if (_bfd_ecoff_slurp_armap (abfd) == false
3343 || _bfd_ecoff_slurp_extended_name_table (abfd) == false)
3344 {
3345 bfd_release (abfd, bfd_ardata (abfd));
3346 abfd->tdata.aout_ar_data = tdata_hold;
3347 return (const bfd_target *) NULL;
3348 }
1abaf976 3349
252b5132
RH
3350 if (bfd_has_map (abfd))
3351 {
3352 bfd *first;
3353
3354 /* This archive has a map, so we may presume that the contents
3355 are object files. Make sure that if the first file in the
3356 archive can be recognized as an object file, it is for this
3357 target. If not, assume that this is the wrong format. If
3358 the first file is not an object file, somebody is doing
3359 something weird, and we permit it so that ar -t will work. */
3360
3361 first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
3362 if (first != NULL)
3363 {
3364 boolean fail;
3365
3366 first->target_defaulted = false;
3367 fail = false;
3368 if (bfd_check_format (first, bfd_object)
3369 && first->xvec != abfd->xvec)
3370 {
3371 (void) bfd_close (first);
3372 bfd_release (abfd, bfd_ardata (abfd));
3373 abfd->tdata.aout_ar_data = tdata_hold;
3374 bfd_set_error (bfd_error_wrong_format);
3375 return NULL;
3376 }
3377
3378 /* We ought to close first here, but we can't, because we
3379 have no way to remove it from the archive cache. FIXME. */
3380 }
3381 }
3382
3383 return abfd->xvec;
3384}
3385\f
3386/* ECOFF linker code. */
3387
3388static struct bfd_hash_entry *ecoff_link_hash_newfunc
3389 PARAMS ((struct bfd_hash_entry *entry,
3390 struct bfd_hash_table *table,
3391 const char *string));
3392static boolean ecoff_link_add_archive_symbols
3393 PARAMS ((bfd *, struct bfd_link_info *));
3394static boolean ecoff_link_check_archive_element
3395 PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded));
3396static boolean ecoff_link_add_object_symbols
3397 PARAMS ((bfd *, struct bfd_link_info *));
3398static boolean ecoff_link_add_externals
3399 PARAMS ((bfd *, struct bfd_link_info *, PTR, char *));
3400
3401/* Routine to create an entry in an ECOFF link hash table. */
3402
3403static struct bfd_hash_entry *
3404ecoff_link_hash_newfunc (entry, table, string)
3405 struct bfd_hash_entry *entry;
3406 struct bfd_hash_table *table;
3407 const char *string;
3408{
3409 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3410
3411 /* Allocate the structure if it has not already been allocated by a
3412 subclass. */
3413 if (ret == (struct ecoff_link_hash_entry *) NULL)
3414 ret = ((struct ecoff_link_hash_entry *)
3415 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3416 if (ret == (struct ecoff_link_hash_entry *) NULL)
3417 return NULL;
3418
3419 /* Call the allocation method of the superclass. */
3420 ret = ((struct ecoff_link_hash_entry *)
3421 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3422 table, string));
3423
3424 if (ret)
3425 {
3426 /* Set local fields. */
3427 ret->indx = -1;
3428 ret->abfd = NULL;
3429 ret->written = 0;
3430 ret->small = 0;
3431 }
3432 memset ((PTR) &ret->esym, 0, sizeof ret->esym);
3433
3434 return (struct bfd_hash_entry *) ret;
3435}
3436
3437/* Create an ECOFF link hash table. */
3438
3439struct bfd_link_hash_table *
3440_bfd_ecoff_bfd_link_hash_table_create (abfd)
3441 bfd *abfd;
3442{
3443 struct ecoff_link_hash_table *ret;
3444
3445 ret = ((struct ecoff_link_hash_table *)
3446 bfd_alloc (abfd, sizeof (struct ecoff_link_hash_table)));
3447 if (ret == NULL)
3448 return NULL;
3449 if (! _bfd_link_hash_table_init (&ret->root, abfd,
3450 ecoff_link_hash_newfunc))
3451 {
3452 free (ret);
3453 return (struct bfd_link_hash_table *) NULL;
3454 }
3455 return &ret->root;
3456}
3457
3458/* Look up an entry in an ECOFF link hash table. */
3459
3460#define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3461 ((struct ecoff_link_hash_entry *) \
3462 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3463
3464/* Traverse an ECOFF link hash table. */
3465
3466#define ecoff_link_hash_traverse(table, func, info) \
3467 (bfd_link_hash_traverse \
3468 (&(table)->root, \
3469 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3470 (info)))
3471
3472/* Get the ECOFF link hash table from the info structure. This is
3473 just a cast. */
3474
3475#define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3476
3477/* Given an ECOFF BFD, add symbols to the global hash table as
3478 appropriate. */
3479
3480boolean
3481_bfd_ecoff_bfd_link_add_symbols (abfd, info)
3482 bfd *abfd;
3483 struct bfd_link_info *info;
3484{
3485 switch (bfd_get_format (abfd))
3486 {
3487 case bfd_object:
3488 return ecoff_link_add_object_symbols (abfd, info);
3489 case bfd_archive:
3490 return ecoff_link_add_archive_symbols (abfd, info);
3491 default:
3492 bfd_set_error (bfd_error_wrong_format);
3493 return false;
3494 }
3495}
3496
3497/* Add the symbols from an archive file to the global hash table.
3498 This looks through the undefined symbols, looks each one up in the
3499 archive hash table, and adds any associated object file. We do not
3500 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3501 already have a hash table, so there is no reason to construct
3502 another one. */
3503
3504static boolean
3505ecoff_link_add_archive_symbols (abfd, info)
3506 bfd *abfd;
3507 struct bfd_link_info *info;
3508{
3509 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3510 const bfd_byte *raw_armap;
3511 struct bfd_link_hash_entry **pundef;
3512 unsigned int armap_count;
3513 unsigned int armap_log;
3514 unsigned int i;
3515 const bfd_byte *hashtable;
3516 const char *stringbase;
3517
3518 if (! bfd_has_map (abfd))
3519 {
3520 /* An empty archive is a special case. */
3521 if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL)
3522 return true;
3523 bfd_set_error (bfd_error_no_armap);
3524 return false;
3525 }
3526
3527 /* If we don't have any raw data for this archive, as can happen on
3528 Irix 4.0.5F, we call the generic routine.
3529 FIXME: We should be more clever about this, since someday tdata
3530 may get to something for a generic archive. */
3531 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3532 if (raw_armap == (bfd_byte *) NULL)
3533 return (_bfd_generic_link_add_archive_symbols
3534 (abfd, info, ecoff_link_check_archive_element));
3535
3536 armap_count = bfd_h_get_32 (abfd, raw_armap);
3537
3538 armap_log = 0;
3539 for (i = 1; i < armap_count; i <<= 1)
3540 armap_log++;
3541 BFD_ASSERT (i == armap_count);
3542
3543 hashtable = raw_armap + 4;
3544 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3545
3546 /* Look through the list of undefined symbols. */
3547 pundef = &info->hash->undefs;
3548 while (*pundef != (struct bfd_link_hash_entry *) NULL)
3549 {
3550 struct bfd_link_hash_entry *h;
3551 unsigned int hash, rehash;
3552 unsigned int file_offset;
3553 const char *name;
3554 bfd *element;
3555
3556 h = *pundef;
3557
3558 /* When a symbol is defined, it is not necessarily removed from
3559 the list. */
3560 if (h->type != bfd_link_hash_undefined
3561 && h->type != bfd_link_hash_common)
3562 {
3563 /* Remove this entry from the list, for general cleanliness
3564 and because we are going to look through the list again
3565 if we search any more libraries. We can't remove the
3566 entry if it is the tail, because that would lose any
3567 entries we add to the list later on. */
3568 if (*pundef != info->hash->undefs_tail)
3569 *pundef = (*pundef)->next;
3570 else
3571 pundef = &(*pundef)->next;
3572 continue;
3573 }
3574
3575 /* Native ECOFF linkers do not pull in archive elements merely
3576 to satisfy common definitions, so neither do we. We leave
3577 them on the list, though, in case we are linking against some
3578 other object format. */
3579 if (h->type != bfd_link_hash_undefined)
3580 {
3581 pundef = &(*pundef)->next;
3582 continue;
3583 }
3584
3585 /* Look for this symbol in the archive hash table. */
3586 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3587 armap_log);
3588
3589 file_offset = bfd_h_get_32 (abfd, hashtable + (hash * 8) + 4);
3590 if (file_offset == 0)
3591 {
3592 /* Nothing in this slot. */
3593 pundef = &(*pundef)->next;
3594 continue;
3595 }
3596
3597 name = stringbase + bfd_h_get_32 (abfd, hashtable + (hash * 8));
3598 if (name[0] != h->root.string[0]
3599 || strcmp (name, h->root.string) != 0)
3600 {
3601 unsigned int srch;
3602 boolean found;
3603
3604 /* That was the wrong symbol. Try rehashing. */
3605 found = false;
3606 for (srch = (hash + rehash) & (armap_count - 1);
3607 srch != hash;
3608 srch = (srch + rehash) & (armap_count - 1))
3609 {
3610 file_offset = bfd_h_get_32 (abfd, hashtable + (srch * 8) + 4);
3611 if (file_offset == 0)
3612 break;
3613 name = stringbase + bfd_h_get_32 (abfd, hashtable + (srch * 8));
3614 if (name[0] == h->root.string[0]
3615 && strcmp (name, h->root.string) == 0)
3616 {
3617 found = true;
3618 break;
3619 }
3620 }
3621
3622 if (! found)
3623 {
3624 pundef = &(*pundef)->next;
3625 continue;
3626 }
3627
3628 hash = srch;
3629 }
3630
3631 element = (*backend->get_elt_at_filepos) (abfd, file_offset);
3632 if (element == (bfd *) NULL)
3633 return false;
3634
3635 if (! bfd_check_format (element, bfd_object))
3636 return false;
3637
3638 /* Unlike the generic linker, we know that this element provides
3639 a definition for an undefined symbol and we know that we want
3640 to include it. We don't need to check anything. */
3641 if (! (*info->callbacks->add_archive_element) (info, element, name))
3642 return false;
3643 if (! ecoff_link_add_object_symbols (element, info))
3644 return false;
3645
3646 pundef = &(*pundef)->next;
3647 }
3648
3649 return true;
3650}
3651
3652/* This is called if we used _bfd_generic_link_add_archive_symbols
3653 because we were not dealing with an ECOFF archive. */
3654
3655static boolean
3656ecoff_link_check_archive_element (abfd, info, pneeded)
3657 bfd *abfd;
3658 struct bfd_link_info *info;
3659 boolean *pneeded;
3660{
3661 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3662 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
3663 = backend->debug_swap.swap_ext_in;
3664 HDRR *symhdr;
3665 bfd_size_type external_ext_size;
3666 PTR external_ext = NULL;
3667 size_t esize;
3668 char *ssext = NULL;
3669 char *ext_ptr;
3670 char *ext_end;
3671
3672 *pneeded = false;
3673
3674 if (! ecoff_slurp_symbolic_header (abfd))
3675 goto error_return;
3676
3677 /* If there are no symbols, we don't want it. */
3678 if (bfd_get_symcount (abfd) == 0)
3679 goto successful_return;
3680
3681 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3682
3683 /* Read in the external symbols and external strings. */
3684 external_ext_size = backend->debug_swap.external_ext_size;
3685 esize = symhdr->iextMax * external_ext_size;
3686 external_ext = (PTR) bfd_malloc (esize);
3687 if (external_ext == NULL && esize != 0)
3688 goto error_return;
3689
3690 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3691 || bfd_read (external_ext, 1, esize, abfd) != esize)
3692 goto error_return;
3693
3694 ssext = (char *) bfd_malloc (symhdr->issExtMax);
3695 if (ssext == NULL && symhdr->issExtMax != 0)
3696 goto error_return;
3697
3698 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3699 || (bfd_read (ssext, 1, symhdr->issExtMax, abfd) !=
3700 (bfd_size_type) symhdr->issExtMax))
3701 goto error_return;
3702
3703 /* Look through the external symbols to see if they define some
3704 symbol that is currently undefined. */
3705 ext_ptr = (char *) external_ext;
3706 ext_end = ext_ptr + esize;
3707 for (; ext_ptr < ext_end; ext_ptr += external_ext_size)
3708 {
3709 EXTR esym;
3710 boolean def;
3711 const char *name;
3712 struct bfd_link_hash_entry *h;
3713
3714 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
3715
3716 /* See if this symbol defines something. */
3717 if (esym.asym.st != stGlobal
3718 && esym.asym.st != stLabel
3719 && esym.asym.st != stProc)
3720 continue;
3721
3722 switch (esym.asym.sc)
3723 {
3724 case scText:
3725 case scData:
3726 case scBss:
3727 case scAbs:
3728 case scSData:
3729 case scSBss:
3730 case scRData:
3731 case scCommon:
3732 case scSCommon:
3733 case scInit:
3734 case scFini:
3735 case scRConst:
3736 def = true;
3737 break;
3738 default:
3739 def = false;
3740 break;
3741 }
3742
3743 if (! def)
3744 continue;
3745
3746 name = ssext + esym.asym.iss;
3747 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
3748
3749 /* Unlike the generic linker, we do not pull in elements because
3750 of common symbols. */
3751 if (h == (struct bfd_link_hash_entry *) NULL
3752 || h->type != bfd_link_hash_undefined)
3753 continue;
3754
3755 /* Include this element. */
3756 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
3757 goto error_return;
3758 if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
3759 goto error_return;
3760
3761 *pneeded = true;
3762 goto successful_return;
3763 }
3764
3765 successful_return:
3766 if (external_ext != NULL)
3767 free (external_ext);
3768 if (ssext != NULL)
3769 free (ssext);
3770 return true;
3771 error_return:
3772 if (external_ext != NULL)
3773 free (external_ext);
3774 if (ssext != NULL)
3775 free (ssext);
3776 return false;
3777}
3778
3779/* Add symbols from an ECOFF object file to the global linker hash
3780 table. */
3781
3782static boolean
3783ecoff_link_add_object_symbols (abfd, info)
3784 bfd *abfd;
3785 struct bfd_link_info *info;
3786{
3787 HDRR *symhdr;
3788 bfd_size_type external_ext_size;
3789 PTR external_ext = NULL;
3790 size_t esize;
3791 char *ssext = NULL;
3792 boolean result;
3793
3794 if (! ecoff_slurp_symbolic_header (abfd))
3795 return false;
3796
3797 /* If there are no symbols, we don't want it. */
3798 if (bfd_get_symcount (abfd) == 0)
3799 return true;
3800
3801 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3802
3803 /* Read in the external symbols and external strings. */
3804 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3805 esize = symhdr->iextMax * external_ext_size;
3806 external_ext = (PTR) bfd_malloc (esize);
3807 if (external_ext == NULL && esize != 0)
3808 goto error_return;
3809
3810 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3811 || bfd_read (external_ext, 1, esize, abfd) != esize)
3812 goto error_return;
3813
3814 ssext = (char *) bfd_malloc (symhdr->issExtMax);
3815 if (ssext == NULL && symhdr->issExtMax != 0)
3816 goto error_return;
3817
3818 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3819 || (bfd_read (ssext, 1, symhdr->issExtMax, abfd)
3820 != (bfd_size_type) symhdr->issExtMax))
3821 goto error_return;
3822
3823 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3824
3825 if (ssext != NULL)
3826 free (ssext);
3827 if (external_ext != NULL)
3828 free (external_ext);
3829 return result;
3830
3831 error_return:
3832 if (ssext != NULL)
3833 free (ssext);
3834 if (external_ext != NULL)
3835 free (external_ext);
3836 return false;
3837}
3838
3839/* Add the external symbols of an object file to the global linker
3840 hash table. The external symbols and strings we are passed are
3841 just allocated on the stack, and will be discarded. We must
3842 explicitly save any information we may need later on in the link.
3843 We do not want to read the external symbol information again. */
3844
3845static boolean
3846ecoff_link_add_externals (abfd, info, external_ext, ssext)
3847 bfd *abfd;
3848 struct bfd_link_info *info;
3849 PTR external_ext;
3850 char *ssext;
3851{
3852 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3853 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
3854 = backend->debug_swap.swap_ext_in;
3855 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
3856 unsigned long ext_count;
3857 struct ecoff_link_hash_entry **sym_hash;
3858 char *ext_ptr;
3859 char *ext_end;
3860
3861 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
3862
3863 sym_hash = ((struct ecoff_link_hash_entry **)
3864 bfd_alloc (abfd,
3865 ext_count * sizeof (struct bfd_link_hash_entry *)));
3866 if (!sym_hash)
3867 return false;
3868 ecoff_data (abfd)->sym_hashes = sym_hash;
3869
3870 ext_ptr = (char *) external_ext;
3871 ext_end = ext_ptr + ext_count * external_ext_size;
3872 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
3873 {
3874 EXTR esym;
3875 boolean skip;
3876 bfd_vma value;
3877 asection *section;
3878 const char *name;
3879 struct ecoff_link_hash_entry *h;
3880
3881 *sym_hash = NULL;
3882
3883 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
3884
3885 /* Skip debugging symbols. */
3886 skip = false;
3887 switch (esym.asym.st)
3888 {
3889 case stGlobal:
3890 case stStatic:
3891 case stLabel:
3892 case stProc:
3893 case stStaticProc:
3894 break;
3895 default:
3896 skip = true;
3897 break;
3898 }
3899
3900 if (skip)
3901 continue;
3902
3903 /* Get the information for this symbol. */
3904 value = esym.asym.value;
3905 switch (esym.asym.sc)
3906 {
3907 default:
3908 case scNil:
3909 case scRegister:
3910 case scCdbLocal:
3911 case scBits:
3912 case scCdbSystem:
3913 case scRegImage:
3914 case scInfo:
3915 case scUserStruct:
3916 case scVar:
3917 case scVarRegister:
3918 case scVariant:
3919 case scBasedVar:
3920 case scXData:
3921 case scPData:
3922 section = NULL;
3923 break;
3924 case scText:
3925 section = bfd_make_section_old_way (abfd, ".text");
3926 value -= section->vma;
3927 break;
3928 case scData:
3929 section = bfd_make_section_old_way (abfd, ".data");
3930 value -= section->vma;
3931 break;
3932 case scBss:
3933 section = bfd_make_section_old_way (abfd, ".bss");
3934 value -= section->vma;
3935 break;
3936 case scAbs:
3937 section = bfd_abs_section_ptr;
3938 break;
3939 case scUndefined:
3940 section = bfd_und_section_ptr;
3941 break;
3942 case scSData:
3943 section = bfd_make_section_old_way (abfd, ".sdata");
3944 value -= section->vma;
3945 break;
3946 case scSBss:
3947 section = bfd_make_section_old_way (abfd, ".sbss");
3948 value -= section->vma;
3949 break;
3950 case scRData:
3951 section = bfd_make_section_old_way (abfd, ".rdata");
3952 value -= section->vma;
3953 break;
3954 case scCommon:
3955 if (value > ecoff_data (abfd)->gp_size)
3956 {
3957 section = bfd_com_section_ptr;
3958 break;
3959 }
3960 /* Fall through. */
3961 case scSCommon:
3962 if (ecoff_scom_section.name == NULL)
3963 {
3964 /* Initialize the small common section. */
3965 ecoff_scom_section.name = SCOMMON;
3966 ecoff_scom_section.flags = SEC_IS_COMMON;
3967 ecoff_scom_section.output_section = &ecoff_scom_section;
3968 ecoff_scom_section.symbol = &ecoff_scom_symbol;
3969 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
3970 ecoff_scom_symbol.name = SCOMMON;
3971 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
3972 ecoff_scom_symbol.section = &ecoff_scom_section;
3973 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
3974 }
3975 section = &ecoff_scom_section;
3976 break;
3977 case scSUndefined:
3978 section = bfd_und_section_ptr;
3979 break;
3980 case scInit:
3981 section = bfd_make_section_old_way (abfd, ".init");
3982 value -= section->vma;
3983 break;
3984 case scFini:
3985 section = bfd_make_section_old_way (abfd, ".fini");
3986 value -= section->vma;
3987 break;
3988 case scRConst:
3989 section = bfd_make_section_old_way (abfd, ".rconst");
3990 value -= section->vma;
3991 break;
3992 }
3993
3994 if (section == (asection *) NULL)
3995 continue;
3996
3997 name = ssext + esym.asym.iss;
3998
3999 h = NULL;
4000 if (! (_bfd_generic_link_add_one_symbol
4001 (info, abfd, name,
4002 esym.weakext ? BSF_WEAK : BSF_GLOBAL,
4003 section, value, (const char *) NULL, true, true,
4004 (struct bfd_link_hash_entry **) &h)))
4005 return false;
4006
4007 *sym_hash = h;
4008
4009 /* If we are building an ECOFF hash table, save the external
4010 symbol information. */
4011 if (info->hash->creator->flavour == bfd_get_flavour (abfd))
4012 {
4013 if (h->abfd == (bfd *) NULL
4014 || (! bfd_is_und_section (section)
4015 && (! bfd_is_com_section (section)
4016 || (h->root.type != bfd_link_hash_defined
4017 && h->root.type != bfd_link_hash_defweak))))
4018 {
4019 h->abfd = abfd;
4020 h->esym = esym;
4021 }
4022
4023 /* Remember whether this symbol was small undefined. */
4024 if (esym.asym.sc == scSUndefined)
4025 h->small = 1;
4026
4027 /* If this symbol was ever small undefined, it needs to wind
4028 up in a GP relative section. We can't control the
4029 section of a defined symbol, but we can control the
4030 section of a common symbol. This case is actually needed
4031 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4032 if (h->small
4033 && h->root.type == bfd_link_hash_common
4034 && strcmp (h->root.u.c.p->section->name, SCOMMON) != 0)
4035 {
4036 h->root.u.c.p->section = bfd_make_section_old_way (abfd,
4037 SCOMMON);
4038 h->root.u.c.p->section->flags = SEC_ALLOC;
4039 if (h->esym.asym.sc == scCommon)
4040 h->esym.asym.sc = scSCommon;
4041 }
4042 }
4043 }
4044
4045 return true;
4046}
4047\f
4048/* ECOFF final link routines. */
4049
4050static boolean ecoff_final_link_debug_accumulate
4051 PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *,
4052 PTR handle));
4053static boolean ecoff_link_write_external
4054 PARAMS ((struct ecoff_link_hash_entry *, PTR));
4055static boolean ecoff_indirect_link_order
4056 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4057 struct bfd_link_order *));
4058static boolean ecoff_reloc_link_order
4059 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4060 struct bfd_link_order *));
4061
4062/* Structure used to pass information to ecoff_link_write_external. */
4063
4064struct extsym_info
4065{
4066 bfd *abfd;
4067 struct bfd_link_info *info;
4068};
4069
4070/* ECOFF final link routine. This looks through all the input BFDs
4071 and gathers together all the debugging information, and then
4072 processes all the link order information. This may cause it to
4073 close and reopen some input BFDs; I'll see how bad this is. */
4074
4075boolean
4076_bfd_ecoff_bfd_final_link (abfd, info)
4077 bfd *abfd;
4078 struct bfd_link_info *info;
4079{
4080 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4081 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4082 HDRR *symhdr;
4083 PTR handle;
4084 register bfd *input_bfd;
4085 asection *o;
4086 struct bfd_link_order *p;
4087 struct extsym_info einfo;
4088
4089 /* We accumulate the debugging information counts in the symbolic
4090 header. */
4091 symhdr = &debug->symbolic_header;
4092 symhdr->vstamp = 0;
4093 symhdr->ilineMax = 0;
4094 symhdr->cbLine = 0;
4095 symhdr->idnMax = 0;
4096 symhdr->ipdMax = 0;
4097 symhdr->isymMax = 0;
4098 symhdr->ioptMax = 0;
4099 symhdr->iauxMax = 0;
4100 symhdr->issMax = 0;
4101 symhdr->issExtMax = 0;
4102 symhdr->ifdMax = 0;
4103 symhdr->crfd = 0;
4104 symhdr->iextMax = 0;
4105
4106 /* We accumulate the debugging information itself in the debug_info
4107 structure. */
4108 debug->line = NULL;
4109 debug->external_dnr = NULL;
4110 debug->external_pdr = NULL;
4111 debug->external_sym = NULL;
4112 debug->external_opt = NULL;
4113 debug->external_aux = NULL;
4114 debug->ss = NULL;
4115 debug->ssext = debug->ssext_end = NULL;
4116 debug->external_fdr = NULL;
4117 debug->external_rfd = NULL;
4118 debug->external_ext = debug->external_ext_end = NULL;
4119
4120 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4121 if (handle == (PTR) NULL)
4122 return false;
4123
4124 /* Accumulate the debugging symbols from each input BFD. */
4125 for (input_bfd = info->input_bfds;
4126 input_bfd != (bfd *) NULL;
4127 input_bfd = input_bfd->link_next)
4128 {
4129 boolean ret;
4130
4131 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4132 {
4133 /* Abitrarily set the symbolic header vstamp to the vstamp
4134 of the first object file in the link. */
4135 if (symhdr->vstamp == 0)
4136 symhdr->vstamp
4137 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4138 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4139 handle);
4140 }
4141 else
4142 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4143 debug, &backend->debug_swap,
4144 input_bfd, info);
4145 if (! ret)
4146 return false;
4147
4148 /* Combine the register masks. */
4149 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4150 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4151 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4152 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4153 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4154 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4155 }
4156
4157 /* Write out the external symbols. */
4158 einfo.abfd = abfd;
4159 einfo.info = info;
4160 ecoff_link_hash_traverse (ecoff_hash_table (info),
4161 ecoff_link_write_external,
4162 (PTR) &einfo);
4163
4164 if (info->relocateable)
4165 {
4166 /* We need to make a pass over the link_orders to count up the
4167 number of relocations we will need to output, so that we know
4168 how much space they will take up. */
4169 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4170 {
4171 o->reloc_count = 0;
4172 for (p = o->link_order_head;
4173 p != (struct bfd_link_order *) NULL;
4174 p = p->next)
4175 if (p->type == bfd_indirect_link_order)
4176 o->reloc_count += p->u.indirect.section->reloc_count;
4177 else if (p->type == bfd_section_reloc_link_order
4178 || p->type == bfd_symbol_reloc_link_order)
4179 ++o->reloc_count;
4180 }
4181 }
4182
4183 /* Compute the reloc and symbol file positions. */
4184 ecoff_compute_reloc_file_positions (abfd);
4185
4186 /* Write out the debugging information. */
4187 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4188 &backend->debug_swap, info,
4189 ecoff_data (abfd)->sym_filepos))
4190 return false;
4191
4192 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4193
4194 if (info->relocateable)
4195 {
4196 /* Now reset the reloc_count field of the sections in the output
4197 BFD to 0, so that we can use them to keep track of how many
4198 relocs we have output thus far. */
4199 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4200 o->reloc_count = 0;
4201 }
4202
4203 /* Get a value for the GP register. */
4204 if (ecoff_data (abfd)->gp == 0)
4205 {
4206 struct bfd_link_hash_entry *h;
4207
4208 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
4209 if (h != (struct bfd_link_hash_entry *) NULL
4210 && h->type == bfd_link_hash_defined)
4211 ecoff_data (abfd)->gp = (h->u.def.value
4212 + h->u.def.section->output_section->vma
4213 + h->u.def.section->output_offset);
4214 else if (info->relocateable)
4215 {
4216 bfd_vma lo;
4217
4218 /* Make up a value. */
4219 lo = (bfd_vma) -1;
4220 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4221 {
4222 if (o->vma < lo
4223 && (strcmp (o->name, _SBSS) == 0
4224 || strcmp (o->name, _SDATA) == 0
4225 || strcmp (o->name, _LIT4) == 0
4226 || strcmp (o->name, _LIT8) == 0
4227 || strcmp (o->name, _LITA) == 0))
4228 lo = o->vma;
4229 }
4230 ecoff_data (abfd)->gp = lo + 0x8000;
4231 }
4232 else
4233 {
4234 /* If the relocate_section function needs to do a reloc
4235 involving the GP value, it should make a reloc_dangerous
4236 callback to warn that GP is not defined. */
4237 }
4238 }
4239
4240 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4241 {
4242 for (p = o->link_order_head;
4243 p != (struct bfd_link_order *) NULL;
4244 p = p->next)
4245 {
4246 if (p->type == bfd_indirect_link_order
4247 && (bfd_get_flavour (p->u.indirect.section->owner)
4248 == bfd_target_ecoff_flavour))
4249 {
4250 if (! ecoff_indirect_link_order (abfd, info, o, p))
4251 return false;
4252 }
4253 else if (p->type == bfd_section_reloc_link_order
4254 || p->type == bfd_symbol_reloc_link_order)
4255 {
4256 if (! ecoff_reloc_link_order (abfd, info, o, p))
4257 return false;
4258 }
4259 else
4260 {
4261 if (! _bfd_default_link_order (abfd, info, o, p))
4262 return false;
4263 }
4264 }
4265 }
4266
4267 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4268
4269 ecoff_data (abfd)->linker = true;
4270
4271 return true;
4272}
4273
4274/* Accumulate the debugging information for an input BFD into the
4275 output BFD. This must read in the symbolic information of the
4276 input BFD. */
4277
4278static boolean
4279ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle)
4280 bfd *output_bfd;
4281 bfd *input_bfd;
4282 struct bfd_link_info *info;
4283 PTR handle;
4284{
4285 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
4286 const struct ecoff_debug_swap * const swap =
4287 &ecoff_backend (input_bfd)->debug_swap;
4288 HDRR *symhdr = &debug->symbolic_header;
4289 boolean ret;
4290
4291#define READ(ptr, offset, count, size, type) \
4292 if (symhdr->count == 0) \
4293 debug->ptr = NULL; \
4294 else \
4295 { \
4296 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
4297 if (debug->ptr == NULL) \
4298 { \
4299 ret = false; \
4300 goto return_something; \
4301 } \
4302 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4303 != 0) \
4304 || (bfd_read (debug->ptr, size, symhdr->count, \
4305 input_bfd) != size * symhdr->count)) \
4306 { \
4307 ret = false; \
4308 goto return_something; \
4309 } \
4310 }
4311
4312 /* If raw_syments is not NULL, then the data was already by read by
4313 _bfd_ecoff_slurp_symbolic_info. */
4314 if (ecoff_data (input_bfd)->raw_syments == NULL)
4315 {
4316 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
4317 unsigned char *);
4318 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
4319 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
4320 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
4321 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
4322 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
4323 union aux_ext *);
4324 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
4325 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
4326 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
4327 }
4328#undef READ
4329
4330 /* We do not read the external strings or the external symbols. */
4331
4332 ret = (bfd_ecoff_debug_accumulate
4333 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
4334 &ecoff_backend (output_bfd)->debug_swap,
4335 input_bfd, debug, swap, info));
4336
4337 return_something:
4338 if (ecoff_data (input_bfd)->raw_syments == NULL)
4339 {
4340 if (debug->line != NULL)
4341 free (debug->line);
4342 if (debug->external_dnr != NULL)
4343 free (debug->external_dnr);
4344 if (debug->external_pdr != NULL)
4345 free (debug->external_pdr);
4346 if (debug->external_sym != NULL)
4347 free (debug->external_sym);
4348 if (debug->external_opt != NULL)
4349 free (debug->external_opt);
4350 if (debug->external_aux != NULL)
4351 free (debug->external_aux);
4352 if (debug->ss != NULL)
4353 free (debug->ss);
4354 if (debug->external_fdr != NULL)
4355 free (debug->external_fdr);
4356 if (debug->external_rfd != NULL)
4357 free (debug->external_rfd);
4358
4359 /* Make sure we don't accidentally follow one of these pointers
4360 into freed memory. */
4361 debug->line = NULL;
4362 debug->external_dnr = NULL;
4363 debug->external_pdr = NULL;
4364 debug->external_sym = NULL;
4365 debug->external_opt = NULL;
4366 debug->external_aux = NULL;
4367 debug->ss = NULL;
4368 debug->external_fdr = NULL;
4369 debug->external_rfd = NULL;
4370 }
4371
4372 return ret;
4373}
4374
4375/* Put out information for an external symbol. These come only from
4376 the hash table. */
4377
4378static boolean
4379ecoff_link_write_external (h, data)
4380 struct ecoff_link_hash_entry *h;
4381 PTR data;
4382{
4383 struct extsym_info *einfo = (struct extsym_info *) data;
4384 bfd *output_bfd = einfo->abfd;
4385 boolean strip;
4386
1abaf976 4387 /* We need to check if this symbol is being stripped. */
252b5132
RH
4388 if (h->root.type == bfd_link_hash_undefined
4389 || h->root.type == bfd_link_hash_undefweak)
4390 strip = false;
4391 else if (einfo->info->strip == strip_all
4392 || (einfo->info->strip == strip_some
4393 && bfd_hash_lookup (einfo->info->keep_hash,
4394 h->root.root.string,
4395 false, false) == NULL))
4396 strip = true;
4397 else
4398 strip = false;
4399
4400 if (strip || h->written)
4401 return true;
4402
4403 if (h->abfd == (bfd *) NULL)
4404 {
4405 h->esym.jmptbl = 0;
4406 h->esym.cobol_main = 0;
4407 h->esym.weakext = 0;
4408 h->esym.reserved = 0;
4409 h->esym.ifd = ifdNil;
4410 h->esym.asym.value = 0;
4411 h->esym.asym.st = stGlobal;
4412
4413 if (h->root.type != bfd_link_hash_defined
4414 && h->root.type != bfd_link_hash_defweak)
4415 h->esym.asym.sc = scAbs;
4416 else
4417 {
4418 asection *output_section;
4419 const char *name;
4420
4421 output_section = h->root.u.def.section->output_section;
4422 name = bfd_section_name (output_section->owner, output_section);
1abaf976 4423
252b5132
RH
4424 if (strcmp (name, _TEXT) == 0)
4425 h->esym.asym.sc = scText;
4426 else if (strcmp (name, _DATA) == 0)
4427 h->esym.asym.sc = scData;
4428 else if (strcmp (name, _SDATA) == 0)
4429 h->esym.asym.sc = scSData;
4430 else if (strcmp (name, _RDATA) == 0)
4431 h->esym.asym.sc = scRData;
4432 else if (strcmp (name, _BSS) == 0)
4433 h->esym.asym.sc = scBss;
4434 else if (strcmp (name, _SBSS) == 0)
4435 h->esym.asym.sc = scSBss;
4436 else if (strcmp (name, _INIT) == 0)
4437 h->esym.asym.sc = scInit;
4438 else if (strcmp (name, _FINI) == 0)
4439 h->esym.asym.sc = scFini;
4440 else if (strcmp (name, _PDATA) == 0)
4441 h->esym.asym.sc = scPData;
4442 else if (strcmp (name, _XDATA) == 0)
4443 h->esym.asym.sc = scXData;
4444 else if (strcmp (name, _RCONST) == 0)
4445 h->esym.asym.sc = scRConst;
4446 else
4447 h->esym.asym.sc = scAbs;
4448 }
4449
4450 h->esym.asym.reserved = 0;
4451 h->esym.asym.index = indexNil;
4452 }
4453 else if (h->esym.ifd != -1)
4454 {
4455 struct ecoff_debug_info *debug;
4456
4457 /* Adjust the FDR index for the symbol by that used for the
4458 input BFD. */
4459 debug = &ecoff_data (h->abfd)->debug_info;
4460 BFD_ASSERT (h->esym.ifd >= 0
4461 && h->esym.ifd < debug->symbolic_header.ifdMax);
4462 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4463 }
4464
4465 switch (h->root.type)
4466 {
4467 default:
4468 case bfd_link_hash_new:
4469 abort ();
4470 case bfd_link_hash_undefined:
4471 case bfd_link_hash_undefweak:
4472 if (h->esym.asym.sc != scUndefined
4473 && h->esym.asym.sc != scSUndefined)
4474 h->esym.asym.sc = scUndefined;
4475 break;
4476 case bfd_link_hash_defined:
4477 case bfd_link_hash_defweak:
4478 if (h->esym.asym.sc == scUndefined
4479 || h->esym.asym.sc == scSUndefined)
4480 h->esym.asym.sc = scAbs;
4481 else if (h->esym.asym.sc == scCommon)
4482 h->esym.asym.sc = scBss;
4483 else if (h->esym.asym.sc == scSCommon)
4484 h->esym.asym.sc = scSBss;
4485 h->esym.asym.value = (h->root.u.def.value
4486 + h->root.u.def.section->output_section->vma
4487 + h->root.u.def.section->output_offset);
4488 break;
4489 case bfd_link_hash_common:
4490 if (h->esym.asym.sc != scCommon
4491 && h->esym.asym.sc != scSCommon)
4492 h->esym.asym.sc = scCommon;
4493 h->esym.asym.value = h->root.u.c.size;
4494 break;
4495 case bfd_link_hash_indirect:
4496 case bfd_link_hash_warning:
4497 /* FIXME: Ignore these for now. The circumstances under which
4498 they should be written out are not clear to me. */
4499 return true;
4500 }
4501
4502 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4503 symbol number. */
4504 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4505 h->written = 1;
4506
4507 return (bfd_ecoff_debug_one_external
4508 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4509 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4510 &h->esym));
4511}
4512
4513/* Relocate and write an ECOFF section into an ECOFF output file. */
4514
4515static boolean
4516ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
4517 bfd *output_bfd;
4518 struct bfd_link_info *info;
4519 asection *output_section;
4520 struct bfd_link_order *link_order;
4521{
4522 asection *input_section;
4523 bfd *input_bfd;
4524 struct ecoff_section_tdata *section_tdata;
4525 bfd_size_type raw_size;
4526 bfd_size_type cooked_size;
4527 bfd_byte *contents = NULL;
4528 bfd_size_type external_reloc_size;
4529 bfd_size_type external_relocs_size;
4530 PTR external_relocs = NULL;
4531
4532 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
4533
4534 if (link_order->size == 0)
4535 return true;
4536
4537 input_section = link_order->u.indirect.section;
4538 input_bfd = input_section->owner;
4539 section_tdata = ecoff_section_data (input_bfd, input_section);
4540
4541 raw_size = input_section->_raw_size;
4542 cooked_size = input_section->_cooked_size;
4543 if (cooked_size == 0)
4544 cooked_size = raw_size;
4545
4546 BFD_ASSERT (input_section->output_section == output_section);
4547 BFD_ASSERT (input_section->output_offset == link_order->offset);
4548 BFD_ASSERT (cooked_size == link_order->size);
4549
4550 /* Get the section contents. We allocate memory for the larger of
4551 the size before relocating and the size after relocating. */
4552 contents = (bfd_byte *) bfd_malloc (raw_size >= cooked_size
4553 ? (size_t) raw_size
4554 : (size_t) cooked_size);
4555 if (contents == NULL && raw_size != 0)
4556 goto error_return;
4557
4558 /* If we are relaxing, the contents may have already been read into
4559 memory, in which case we copy them into our new buffer. We don't
4560 simply reuse the old buffer in case cooked_size > raw_size. */
4561 if (section_tdata != (struct ecoff_section_tdata *) NULL
4562 && section_tdata->contents != (bfd_byte *) NULL)
4563 memcpy (contents, section_tdata->contents, (size_t) raw_size);
4564 else
4565 {
4566 if (! bfd_get_section_contents (input_bfd, input_section,
4567 (PTR) contents,
4568 (file_ptr) 0, raw_size))
4569 goto error_return;
4570 }
4571
4572 /* Get the relocs. If we are relaxing MIPS code, they will already
4573 have been read in. Otherwise, we read them in now. */
4574 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
4575 external_relocs_size = external_reloc_size * input_section->reloc_count;
4576
4577 if (section_tdata != (struct ecoff_section_tdata *) NULL
4578 && section_tdata->external_relocs != NULL)
4579 external_relocs = section_tdata->external_relocs;
4580 else
4581 {
4582 external_relocs = (PTR) bfd_malloc ((size_t) external_relocs_size);
4583 if (external_relocs == NULL && external_relocs_size != 0)
4584 goto error_return;
4585
4586 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
4587 || (bfd_read (external_relocs, 1, external_relocs_size, input_bfd)
4588 != external_relocs_size))
4589 goto error_return;
4590 }
4591
4592 /* Relocate the section contents. */
4593 if (! ((*ecoff_backend (input_bfd)->relocate_section)
4594 (output_bfd, info, input_bfd, input_section, contents,
4595 external_relocs)))
4596 goto error_return;
4597
4598 /* Write out the relocated section. */
4599 if (! bfd_set_section_contents (output_bfd,
4600 output_section,
4601 (PTR) contents,
4602 input_section->output_offset,
4603 cooked_size))
4604 goto error_return;
4605
4606 /* If we are producing relocateable output, the relocs were
4607 modified, and we write them out now. We use the reloc_count
4608 field of output_section to keep track of the number of relocs we
4609 have output so far. */
4610 if (info->relocateable)
4611 {
4612 if (bfd_seek (output_bfd,
4613 (output_section->rel_filepos +
4614 output_section->reloc_count * external_reloc_size),
4615 SEEK_SET) != 0
4616 || (bfd_write (external_relocs, 1, external_relocs_size, output_bfd)
4617 != external_relocs_size))
4618 goto error_return;
4619 output_section->reloc_count += input_section->reloc_count;
4620 }
4621
4622 if (contents != NULL)
4623 free (contents);
4624 if (external_relocs != NULL && section_tdata == NULL)
4625 free (external_relocs);
4626 return true;
4627
4628 error_return:
4629 if (contents != NULL)
4630 free (contents);
4631 if (external_relocs != NULL && section_tdata == NULL)
4632 free (external_relocs);
4633 return false;
4634}
4635
4636/* Generate a reloc when linking an ECOFF file. This is a reloc
4637 requested by the linker, and does come from any input file. This
4638 is used to build constructor and destructor tables when linking
4639 with -Ur. */
4640
4641static boolean
4642ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
4643 bfd *output_bfd;
4644 struct bfd_link_info *info;
4645 asection *output_section;
4646 struct bfd_link_order *link_order;
4647{
4648 enum bfd_link_order_type type;
4649 asection *section;
4650 bfd_vma addend;
4651 arelent rel;
4652 struct internal_reloc in;
4653 bfd_size_type external_reloc_size;
4654 bfd_byte *rbuf;
4655 boolean ok;
4656
4657 type = link_order->type;
4658 section = NULL;
4659 addend = link_order->u.reloc.p->addend;
4660
4661 /* We set up an arelent to pass to the backend adjust_reloc_out
4662 routine. */
4663 rel.address = link_order->offset;
4664
4665 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4666 if (rel.howto == 0)
4667 {
4668 bfd_set_error (bfd_error_bad_value);
4669 return false;
4670 }
4671
4672 if (type == bfd_section_reloc_link_order)
4673 {
4674 section = link_order->u.reloc.p->u.section;
4675 rel.sym_ptr_ptr = section->symbol_ptr_ptr;
4676 }
4677 else
4678 {
4679 struct bfd_link_hash_entry *h;
4680
4681 /* Treat a reloc against a defined symbol as though it were
4682 actually against the section. */
4683 h = bfd_wrapped_link_hash_lookup (output_bfd, info,
4684 link_order->u.reloc.p->u.name,
4685 false, false, false);
4686 if (h != NULL
4687 && (h->type == bfd_link_hash_defined
4688 || h->type == bfd_link_hash_defweak))
4689 {
4690 type = bfd_section_reloc_link_order;
4691 section = h->u.def.section->output_section;
4692 /* It seems that we ought to add the symbol value to the
4693 addend here, but in practice it has already been added
4694 because it was passed to constructor_callback. */
4695 addend += section->vma + h->u.def.section->output_offset;
4696 }
4697 else
4698 {
4699 /* We can't set up a reloc against a symbol correctly,
4700 because we have no asymbol structure. Currently no
4701 adjust_reloc_out routine cares. */
4702 rel.sym_ptr_ptr = (asymbol **) NULL;
4703 }
4704 }
4705
4706 /* All ECOFF relocs are in-place. Put the addend into the object
4707 file. */
4708
4709 BFD_ASSERT (rel.howto->partial_inplace);
4710 if (addend != 0)
4711 {
4712 bfd_size_type size;
4713 bfd_reloc_status_type rstat;
4714 bfd_byte *buf;
4715 boolean ok;
4716
4717 size = bfd_get_reloc_size (rel.howto);
4718 buf = (bfd_byte *) bfd_zmalloc (size);
4719 if (buf == (bfd_byte *) NULL)
4720 return false;
4721 rstat = _bfd_relocate_contents (rel.howto, output_bfd, addend, buf);
4722 switch (rstat)
4723 {
4724 case bfd_reloc_ok:
4725 break;
4726 default:
4727 case bfd_reloc_outofrange:
4728 abort ();
4729 case bfd_reloc_overflow:
4730 if (! ((*info->callbacks->reloc_overflow)
4731 (info,
4732 (link_order->type == bfd_section_reloc_link_order
4733 ? bfd_section_name (output_bfd, section)
4734 : link_order->u.reloc.p->u.name),
4735 rel.howto->name, addend, (bfd *) NULL,
4736 (asection *) NULL, (bfd_vma) 0)))
4737 {
4738 free (buf);
4739 return false;
4740 }
4741 break;
4742 }
4743 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
4744 (file_ptr) link_order->offset, size);
4745 free (buf);
4746 if (! ok)
4747 return false;
4748 }
4749
4750 rel.addend = 0;
4751
4752 /* Move the information into a internal_reloc structure. */
4753 in.r_vaddr = (rel.address
4754 + bfd_get_section_vma (output_bfd, output_section));
4755 in.r_type = rel.howto->type;
4756
4757 if (type == bfd_symbol_reloc_link_order)
4758 {
4759 struct ecoff_link_hash_entry *h;
4760
4761 h = ((struct ecoff_link_hash_entry *)
4762 bfd_wrapped_link_hash_lookup (output_bfd, info,
4763 link_order->u.reloc.p->u.name,
4764 false, false, true));
4765 if (h != (struct ecoff_link_hash_entry *) NULL
4766 && h->indx != -1)
4767 in.r_symndx = h->indx;
4768 else
4769 {
4770 if (! ((*info->callbacks->unattached_reloc)
4771 (info, link_order->u.reloc.p->u.name, (bfd *) NULL,
4772 (asection *) NULL, (bfd_vma) 0)))
4773 return false;
4774 in.r_symndx = 0;
4775 }
4776 in.r_extern = 1;
4777 }
4778 else
4779 {
4780 CONST char *name;
4781
4782 name = bfd_get_section_name (output_bfd, section);
4783 if (strcmp (name, ".text") == 0)
4784 in.r_symndx = RELOC_SECTION_TEXT;
4785 else if (strcmp (name, ".rdata") == 0)
4786 in.r_symndx = RELOC_SECTION_RDATA;
4787 else if (strcmp (name, ".data") == 0)
4788 in.r_symndx = RELOC_SECTION_DATA;
4789 else if (strcmp (name, ".sdata") == 0)
4790 in.r_symndx = RELOC_SECTION_SDATA;
4791 else if (strcmp (name, ".sbss") == 0)
4792 in.r_symndx = RELOC_SECTION_SBSS;
4793 else if (strcmp (name, ".bss") == 0)
4794 in.r_symndx = RELOC_SECTION_BSS;
4795 else if (strcmp (name, ".init") == 0)
4796 in.r_symndx = RELOC_SECTION_INIT;
4797 else if (strcmp (name, ".lit8") == 0)
4798 in.r_symndx = RELOC_SECTION_LIT8;
4799 else if (strcmp (name, ".lit4") == 0)
4800 in.r_symndx = RELOC_SECTION_LIT4;
4801 else if (strcmp (name, ".xdata") == 0)
4802 in.r_symndx = RELOC_SECTION_XDATA;
4803 else if (strcmp (name, ".pdata") == 0)
4804 in.r_symndx = RELOC_SECTION_PDATA;
4805 else if (strcmp (name, ".fini") == 0)
4806 in.r_symndx = RELOC_SECTION_FINI;
4807 else if (strcmp (name, ".lita") == 0)
4808 in.r_symndx = RELOC_SECTION_LITA;
4809 else if (strcmp (name, "*ABS*") == 0)
4810 in.r_symndx = RELOC_SECTION_ABS;
4811 else if (strcmp (name, ".rconst") == 0)
4812 in.r_symndx = RELOC_SECTION_RCONST;
4813 else
4814 abort ();
4815 in.r_extern = 0;
4816 }
4817
4818 /* Let the BFD backend adjust the reloc. */
4819 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4820
4821 /* Get some memory and swap out the reloc. */
4822 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4823 rbuf = (bfd_byte *) bfd_malloc ((size_t) external_reloc_size);
4824 if (rbuf == (bfd_byte *) NULL)
4825 return false;
4826
4827 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (PTR) rbuf);
4828
4829 ok = (bfd_seek (output_bfd,
4830 (output_section->rel_filepos +
4831 output_section->reloc_count * external_reloc_size),
4832 SEEK_SET) == 0
4833 && (bfd_write ((PTR) rbuf, 1, external_reloc_size, output_bfd)
4834 == external_reloc_size));
4835
4836 if (ok)
4837 ++output_section->reloc_count;
4838
4839 free (rbuf);
4840
4841 return ok;
4842}
This page took 0.260587 seconds and 4 git commands to generate.