* oasys.c (oasys_write_object_contents): Lint.
[deliverable/binutils-gdb.git] / bfd / coff-mips.c
1 /* BFD back-end for MIPS Extended-Coff files.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Original version by Per Bothner.
4 Full support added by Ian Lance Taylor, ian@cygnus.com.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "libbfd.h"
25 #include "seclet.h"
26 #include "aout/ar.h"
27 #include "aout/ranlib.h"
28 #include "coff/mips.h"
29 #include "coff/internal.h"
30 #include "coff/sym.h"
31 #include "coff/symconst.h"
32 #include "coff/ecoff-ext.h"
33 #include "libcoff.h"
34
35 /* `Tdata' information kept for ECOFF files. */
36
37 #define ecoff_data(abfd) ((abfd)->tdata.ecoff_obj_data)
38
39 typedef struct ecoff_tdata
40 {
41 /* The reloc file position, set by
42 ecoff_compute_section_file_positions. */
43 file_ptr reloc_filepos;
44
45 /* The symbol table file position, set by ecoff_mkobject_hook. */
46 file_ptr sym_filepos;
47
48 /* The start and end of the text segment. Only valid for an
49 existing file, not for one we are creating. */
50 unsigned long text_start;
51 unsigned long text_end;
52
53 /* The cached gp value. This is used when relocating. */
54 bfd_vma gp;
55
56 /* The register masks. When linking, all the masks found in the
57 input files are combined into the masks of the output file. */
58 unsigned long gprmask;
59 unsigned long cprmask[4];
60
61 /* The size of the unswapped ECOFF symbolic information. */
62 bfd_size_type raw_size;
63
64 /* The unswapped ECOFF symbolic information. */
65 PTR raw_syments;
66
67 /* The swapped ECOFF symbolic header. */
68 HDRR symbolic_header;
69
70 /* Pointers to the unswapped symbolic information. */
71 unsigned char *line;
72 struct dnr_ext *external_dnr;
73 struct pdr_ext *external_pdr;
74 struct sym_ext *external_sym;
75 struct opt_ext *external_opt;
76 union aux_ext *external_aux;
77 char *ss;
78 char *ssext;
79 struct fdr_ext *external_fdr;
80 struct rfd_ext *external_rfd;
81 struct ext_ext *external_ext;
82
83 /* The swapped FDR information. */
84 FDR *fdr;
85
86 /* The FDR index. This is set for an input BFD to a link so that
87 the external symbols can set their FDR index correctly. */
88 unsigned int ifdbase;
89
90 /* The canonical BFD symbols. */
91 struct ecoff_symbol_struct *canonical_symbols;
92
93 } ecoff_data_type;
94
95 /* Each canonical asymbol really looks like this. */
96
97 typedef struct ecoff_symbol_struct
98 {
99 /* The actual symbol which the rest of BFD works with */
100 asymbol symbol;
101
102 /* The fdr for this symbol. */
103 FDR *fdr;
104
105 /* true if this is a local symbol rather than an external one. */
106 boolean local;
107
108 /* A pointer to the unswapped hidden information for this symbol */
109 union
110 {
111 struct sym_ext *lnative;
112 struct ext_ext *enative;
113 }
114 native;
115 } ecoff_symbol_type;
116
117 /* We take the address of the first element of a asymbol to ensure that the
118 macro is only ever applied to an asymbol. */
119 #define ecoffsymbol(asymbol) ((ecoff_symbol_type *) (&((asymbol)->the_bfd)))
120
121 /* This is a hack borrowed from coffcode.h; we need to save the index
122 of a symbol when we write it out so that can set the symbol index
123 correctly when we write out the relocs. */
124 #define ecoff_get_sym_index(symbol) ((unsigned long) (symbol)->udata)
125 #define ecoff_set_sym_index(symbol, idx) ((symbol)->udata = (PTR) (idx))
126
127 /* The page boundary used to align sections in the executable file. */
128 #define PAGE_SIZE 0x2000
129
130 /* The linker needs a section to hold small common variables while
131 linking. There is no convenient way to create it when the linker
132 needs it, so we always create one for each BFD. We then avoid
133 writing it out. */
134 #define SCOMMON ".scommon"
135
136 /* MIPS ECOFF has COFF sections, but the debugging information is
137 stored in a completely different format. This files uses the some
138 of the swapping routines from coffswap.h, and some of the generic
139 COFF routines in coffgen.c, but, unlike the real COFF targets, does
140 not use coffcode.h itself. */
141 \f
142 /* Prototypes for static functions. */
143
144 static boolean ecoff_bad_format_hook PARAMS ((bfd *abfd, PTR filehdr));
145 static asection *ecoff_make_section_hook PARAMS ((bfd *abfd, char *name));
146 static boolean ecoff_new_section_hook PARAMS ((bfd *abfd, asection *section));
147 static boolean ecoff_mkobject PARAMS ((bfd *abfd));
148 static PTR ecoff_mkobject_hook PARAMS ((bfd *abfd, PTR filehdr, PTR aouthdr));
149 static boolean ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr));
150 static long ecoff_sec_to_styp_flags PARAMS ((CONST char *name,
151 flagword flags));
152 static flagword ecoff_styp_to_sec_flags PARAMS ((bfd *abfd, PTR hdr));
153 static boolean ecoff_slurp_symbolic_info PARAMS ((bfd *abfd));
154 static asymbol *ecoff_make_empty_symbol PARAMS ((bfd *abfd));
155 static void ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym,
156 asymbol *asym, int ext));
157 static boolean ecoff_slurp_symbol_table PARAMS ((bfd *abfd));
158 static unsigned int ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd));
159 static unsigned int ecoff_get_symtab PARAMS ((bfd *abfd,
160 asymbol **alocation));
161 static void ecoff_emit_aggregate PARAMS ((bfd *abfd, char *string,
162 RNDXR *rndx, long isym,
163 CONST char *which));
164 static char *ecoff_type_to_string PARAMS ((bfd *abfd, union aux_ext *aux_ptr,
165 int indx, int bigendian));
166 static void ecoff_print_symbol PARAMS ((bfd *abfd, PTR filep,
167 asymbol *symbol,
168 bfd_print_symbol_type how));
169 static void ecoff_swap_reloc_in PARAMS ((bfd *abfd, RELOC *ext,
170 struct internal_reloc *intern));
171 static unsigned int ecoff_swap_reloc_out PARAMS ((bfd *abfd, PTR src,
172 PTR dst));
173 static bfd_reloc_status_type ecoff_generic_reloc PARAMS ((bfd *abfd,
174 arelent *reloc,
175 asymbol *symbol,
176 PTR data,
177 asection *section,
178 bfd *output_bfd));
179 static bfd_reloc_status_type ecoff_refhi_reloc PARAMS ((bfd *abfd,
180 arelent *reloc,
181 asymbol *symbol,
182 PTR data,
183 asection *section,
184 bfd *output_bfd));
185 static bfd_reloc_status_type ecoff_gprel_reloc PARAMS ((bfd *abfd,
186 arelent *reloc,
187 asymbol *symbol,
188 PTR data,
189 asection *section,
190 bfd *output_bfd));
191 static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section,
192 asymbol **symbols));
193 static unsigned int ecoff_canonicalize_reloc PARAMS ((bfd *abfd,
194 asection *section,
195 arelent **relptr,
196 asymbol **symbols));
197 static boolean ecoff_find_nearest_line PARAMS ((bfd *abfd,
198 asection *section,
199 asymbol **symbols,
200 bfd_vma offset,
201 CONST char **filename_ptr,
202 CONST char **fnname_ptr,
203 unsigned int *retline_ptr));
204 static void ecoff_clear_output_flags PARAMS ((bfd *abfd));
205 static boolean ecoff_rel PARAMS ((bfd *output_bfd, bfd_seclet_type *seclet,
206 asection *output_section, PTR data,
207 boolean relocateable));
208 static boolean ecoff_dump_seclet PARAMS ((bfd *abfd, bfd_seclet_type *seclet,
209 asection *section, PTR data,
210 boolean relocateable));
211 static long ecoff_add_string PARAMS ((bfd *output_bfd, FDR *fdr,
212 CONST char *string, boolean external));
213 static boolean ecoff_get_debug PARAMS ((bfd *output_bfd,
214 bfd_seclet_type *seclet,
215 asection *section,
216 boolean relocateable));
217 static boolean ecoff_bfd_seclet_link PARAMS ((bfd *abfd, PTR data,
218 boolean relocateable));
219 static boolean ecoff_set_arch_mach PARAMS ((bfd *abfd,
220 enum bfd_architecture arch,
221 unsigned long machine));
222 static int ecoff_sizeof_headers PARAMS ((bfd *abfd, boolean reloc));
223 static void ecoff_compute_section_file_positions PARAMS ((bfd *abfd));
224 static boolean ecoff_set_section_contents PARAMS ((bfd *abfd,
225 asection *section,
226 PTR location,
227 file_ptr offset,
228 bfd_size_type count));
229 static boolean ecoff_write_object_contents PARAMS ((bfd *abfd));
230 static unsigned int ecoff_armap_hash PARAMS ((CONST char *s,
231 unsigned int *rehash,
232 unsigned int size,
233 unsigned int hlog));
234 static boolean ecoff_slurp_armap PARAMS ((bfd *abfd));
235 static boolean ecoff_write_armap PARAMS ((bfd *abfd, unsigned int elength,
236 struct orl *map,
237 unsigned int orl_count,
238 int stridx));
239 static bfd_target *ecoff_archive_p PARAMS ((bfd *abfd));
240 \f
241 /* Get the generic COFF swapping routines, except for the reloc,
242 symbol, and lineno ones. Give them ecoff names. */
243 #define MIPSECOFF
244 #define NO_COFF_RELOCS
245 #define NO_COFF_SYMBOLS
246 #define NO_COFF_LINENOS
247 #define coff_swap_filehdr_in ecoff_swap_filehdr_in
248 #define coff_swap_filehdr_out ecoff_swap_filehdr_out
249 #define coff_swap_aouthdr_in ecoff_swap_aouthdr_in
250 #define coff_swap_aouthdr_out ecoff_swap_aouthdr_out
251 #define coff_swap_scnhdr_in ecoff_swap_scnhdr_in
252 #define coff_swap_scnhdr_out ecoff_swap_scnhdr_out
253 #include "coffswap.h"
254 \f
255 /* This stuff is somewhat copied from coffcode.h. */
256
257 static asection bfd_debug_section = { "*DEBUG*" };
258
259 /* See whether the magic number matches. */
260
261 static boolean
262 ecoff_bad_format_hook (abfd, filehdr)
263 bfd *abfd;
264 PTR filehdr;
265 {
266 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
267
268 if (ECOFFBADMAG (*internal_f))
269 return false;
270
271 return true;
272 }
273
274 /* This is a hook needed by SCO COFF, but we have nothing to do. */
275
276 static asection *
277 ecoff_make_section_hook (abfd, name)
278 bfd *abfd;
279 char *name;
280 {
281 return (asection *) NULL;
282 }
283
284 /* Initialize a new section. */
285
286 static boolean
287 ecoff_new_section_hook (abfd, section)
288 bfd *abfd;
289 asection *section;
290 {
291 section->alignment_power = abfd->xvec->align_power_min;
292
293 if (strcmp (section->name, _TEXT) == 0)
294 section->flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
295 else if (strcmp (section->name, _DATA) == 0
296 || strcmp (section->name, _SDATA) == 0)
297 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
298 else if (strcmp (section->name, _RDATA) == 0
299 || strcmp (section->name, _LIT8) == 0
300 || strcmp (section->name, _LIT4) == 0)
301 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
302 else if (strcmp (section->name, _BSS) == 0
303 || strcmp (section->name, _SBSS) == 0)
304 section->flags |= SEC_ALLOC;
305
306 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
307 uncertain about .init on some systems and I don't know how shared
308 libraries work. */
309
310 return true;
311 }
312
313 /* Set the alignment of a section; we have nothing to do. */
314
315 #define ecoff_set_alignment_hook \
316 ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
317
318 /* Create an ECOFF object. */
319
320 static boolean
321 ecoff_mkobject (abfd)
322 bfd *abfd;
323 {
324 abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *)
325 bfd_zalloc (abfd, sizeof(ecoff_data_type)));
326 if (abfd->tdata.ecoff_obj_data == NULL)
327 {
328 bfd_error = no_memory;
329 return false;
330 }
331
332 /* Always create a .scommon section for every BFD. This is a hack so
333 that the linker has something to attach scSCommon symbols to. */
334 bfd_make_section (abfd, SCOMMON);
335
336 return true;
337 }
338
339 /* Create the ECOFF backend specific information. */
340
341 static PTR
342 ecoff_mkobject_hook (abfd, filehdr, aouthdr)
343 bfd *abfd;
344 PTR filehdr;
345 PTR aouthdr;
346 {
347 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
348 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
349 ecoff_data_type *ecoff;
350
351 if (ecoff_mkobject (abfd) == false)
352 return NULL;
353
354 ecoff = ecoff_data (abfd);
355 ecoff->sym_filepos = internal_f->f_symptr;
356
357 if (internal_a != (struct internal_aouthdr *) NULL)
358 {
359 int i;
360
361 ecoff->text_start = internal_a->text_start;
362 ecoff->text_end = internal_a->text_start + internal_a->tsize;
363 ecoff->gp = internal_a->gp_value;
364 ecoff->gprmask = internal_a->gprmask;
365 for (i = 0; i < 4; i++)
366 ecoff->cprmask[i] = internal_a->cprmask[i];
367 }
368
369 return (PTR) ecoff;
370 }
371
372 /* Determine the machine architecture and type. */
373
374 static boolean
375 ecoff_set_arch_mach_hook (abfd, filehdr)
376 bfd *abfd;
377 PTR filehdr;
378 {
379 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
380 enum bfd_architecture arch;
381
382 switch (internal_f->f_magic)
383 {
384 case MIPS_MAGIC_1:
385 case MIPS_MAGIC_LITTLE:
386 case MIPS_MAGIC_BIG:
387 arch = bfd_arch_mips;
388 break;
389
390 default:
391 arch = bfd_arch_obscure;
392 break;
393 }
394
395 bfd_default_set_arch_mach (abfd, arch, (unsigned long) 0);
396
397 return true;
398 }
399
400 /* Get the section s_flags to use for a section. */
401
402 static long
403 ecoff_sec_to_styp_flags (name, flags)
404 CONST char *name;
405 flagword flags;
406 {
407 long styp;
408
409 styp = 0;
410
411 if (strcmp (name, _TEXT) == 0)
412 styp = STYP_TEXT;
413 else if (strcmp (name, _DATA) == 0)
414 styp = STYP_DATA;
415 else if (strcmp (name, _SDATA) == 0)
416 styp = STYP_SDATA;
417 else if (strcmp (name, _RDATA) == 0)
418 styp = STYP_RDATA;
419 else if (strcmp (name, _LIT8) == 0)
420 styp = STYP_LIT8;
421 else if (strcmp (name, _LIT4) == 0)
422 styp = STYP_LIT4;
423 else if (strcmp (name, _BSS) == 0)
424 styp = STYP_BSS;
425 else if (strcmp (name, _SBSS) == 0)
426 styp = STYP_SBSS;
427 else if (flags & SEC_CODE)
428 styp = STYP_TEXT;
429 else if (flags & SEC_DATA)
430 styp = STYP_DATA;
431 else if (flags & SEC_READONLY)
432 styp = STYP_RDATA;
433 else if (flags & SEC_LOAD)
434 styp = STYP_TEXT;
435 else
436 styp = STYP_BSS;
437
438 if (flags & SEC_NEVER_LOAD)
439 styp |= STYP_NOLOAD;
440
441 return styp;
442 }
443
444 /* Get the BFD flags to use for a section. */
445
446 static flagword
447 ecoff_styp_to_sec_flags (abfd, hdr)
448 bfd *abfd;
449 PTR hdr;
450 {
451 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
452 long styp_flags = internal_s->s_flags;
453 flagword sec_flags=0;
454
455 if (styp_flags & STYP_NOLOAD)
456 sec_flags |= SEC_NEVER_LOAD;
457
458 /* For 386 COFF, at least, an unloadable text or data section is
459 actually a shared library section. */
460 if (styp_flags & STYP_TEXT)
461 {
462 if (sec_flags & SEC_NEVER_LOAD)
463 sec_flags |= SEC_CODE | SEC_SHARED_LIBRARY;
464 else
465 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
466 }
467 else if ((styp_flags & STYP_DATA)
468 || (styp_flags & STYP_RDATA)
469 || (styp_flags & STYP_SDATA))
470 {
471 if (sec_flags & SEC_NEVER_LOAD)
472 sec_flags |= SEC_DATA | SEC_SHARED_LIBRARY;
473 else
474 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
475 if (styp_flags & STYP_RDATA)
476 sec_flags |= SEC_READONLY;
477 }
478 else if ((styp_flags & STYP_BSS)
479 || (styp_flags & STYP_SBSS))
480 {
481 sec_flags |= SEC_ALLOC;
482 }
483 else if (styp_flags & STYP_INFO)
484 {
485 sec_flags |= SEC_NEVER_LOAD;
486 }
487 else if ((styp_flags & STYP_LIT8)
488 || (styp_flags & STYP_LIT4))
489 {
490 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
491 }
492 else
493 {
494 sec_flags |= SEC_ALLOC | SEC_LOAD;
495 }
496
497 return sec_flags;
498 }
499 \f
500 /* Read in and swap the important symbolic information for an ECOFF
501 object file. */
502
503 static boolean
504 ecoff_slurp_symbolic_info (abfd)
505 bfd *abfd;
506 {
507 struct hdr_ext external_symhdr;
508 HDRR *internal_symhdr;
509 bfd_size_type raw_base;
510 bfd_size_type raw_size;
511 PTR raw;
512 struct fdr_ext *fraw_src;
513 struct fdr_ext *fraw_end;
514 struct fdr *fdr_ptr;
515
516 /* Check whether we've already gotten it, and whether there's any to
517 get. */
518 if (ecoff_data (abfd)->raw_syments != (PTR) NULL)
519 return true;
520 if (ecoff_data (abfd)->sym_filepos == 0)
521 {
522 bfd_get_symcount (abfd) = 0;
523 return true;
524 }
525
526 /* At this point bfd_get_symcount (abfd) holds the number of symbols
527 as read from the file header, but on ECOFF this is always the
528 size of the symbolic information header. It would be cleaner to
529 handle this when we first read the file in coffgen.c. */
530 if (bfd_get_symcount (abfd) != sizeof (external_symhdr))
531 {
532 bfd_error = bad_value;
533 return false;
534 }
535
536 /* Read the symbolic information header. */
537 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) == -1
538 || (bfd_read ((PTR) &external_symhdr, sizeof (external_symhdr), 1, abfd)
539 != sizeof (external_symhdr)))
540 {
541 bfd_error = system_call_error;
542 return false;
543 }
544 internal_symhdr = &ecoff_data (abfd)->symbolic_header;
545 ecoff_swap_hdr_in (abfd, &external_symhdr, internal_symhdr);
546
547 if (internal_symhdr->magic != magicSym)
548 {
549 bfd_error = bad_value;
550 return false;
551 }
552
553 /* Now we can get the correct number of symbols. */
554 bfd_get_symcount (abfd) = (internal_symhdr->isymMax
555 + internal_symhdr->iextMax);
556
557 /* Read all the symbolic information at once. */
558 raw_base = ecoff_data (abfd)->sym_filepos + sizeof (struct hdr_ext);
559
560 if (internal_symhdr->cbExtOffset != 0)
561 raw_size = (internal_symhdr->cbExtOffset
562 - raw_base
563 + internal_symhdr->iextMax * sizeof (struct ext_ext));
564 else
565 {
566 long cbline, issmax, issextmax;
567
568 cbline = (internal_symhdr->cbLine + 3) &~ 3;
569 issmax = (internal_symhdr->issMax + 3) &~ 3;
570 issextmax = (internal_symhdr->issExtMax + 3) &~ 3;
571 raw_size = (cbline * sizeof (unsigned char)
572 + internal_symhdr->idnMax * sizeof (struct dnr_ext)
573 + internal_symhdr->ipdMax * sizeof (struct pdr_ext)
574 + internal_symhdr->isymMax * sizeof (struct sym_ext)
575 + internal_symhdr->ioptMax * sizeof (struct opt_ext)
576 + internal_symhdr->iauxMax * sizeof (union aux_ext)
577 + issmax * sizeof (char)
578 + issextmax * sizeof (char)
579 + internal_symhdr->ifdMax * sizeof (struct fdr_ext)
580 + internal_symhdr->crfd * sizeof (struct rfd_ext)
581 + internal_symhdr->iextMax * sizeof (struct ext_ext));
582 }
583
584 if (raw_size == 0)
585 {
586 ecoff_data (abfd)->sym_filepos = 0;
587 return true;
588 }
589 raw = (PTR) bfd_alloc (abfd, raw_size);
590 if (raw == NULL)
591 {
592 bfd_error = no_memory;
593 return false;
594 }
595 if (bfd_read (raw, raw_size, 1, abfd) != raw_size)
596 {
597 bfd_error = system_call_error;
598 bfd_release (abfd, raw);
599 return false;
600 }
601
602 ecoff_data (abfd)->raw_size = raw_size;
603 ecoff_data (abfd)->raw_syments = raw;
604
605 /* Get pointers for the numeric offsets in the HDRR structure. */
606 #define FIX(off1, off2, type) \
607 if (internal_symhdr->off1 == 0) \
608 ecoff_data (abfd)->off2 = (type *) NULL; \
609 else \
610 ecoff_data (abfd)->off2 = (type *) ((char *) raw \
611 + internal_symhdr->off1 \
612 - raw_base)
613 FIX (cbLineOffset, line, unsigned char);
614 FIX (cbDnOffset, external_dnr, struct dnr_ext);
615 FIX (cbPdOffset, external_pdr, struct pdr_ext);
616 FIX (cbSymOffset, external_sym, struct sym_ext);
617 FIX (cbOptOffset, external_opt, struct opt_ext);
618 FIX (cbAuxOffset, external_aux, union aux_ext);
619 FIX (cbSsOffset, ss, char);
620 FIX (cbSsExtOffset, ssext, char);
621 FIX (cbFdOffset, external_fdr, struct fdr_ext);
622 FIX (cbRfdOffset, external_rfd, struct rfd_ext);
623 FIX (cbExtOffset, external_ext, struct ext_ext);
624 #undef FIX
625
626 /* I don't want to always swap all the data, because it will just
627 waste time and most programs will never look at it. The only
628 time the linker needs most of the debugging information swapped
629 is when linking big-endian and little-endian MIPS object files
630 together, which is not a common occurrence.
631
632 We need to look at the fdr to deal with a lot of information in
633 the symbols, so we swap them here. */
634 ecoff_data (abfd)->fdr = (struct fdr *) bfd_alloc (abfd,
635 (internal_symhdr->ifdMax *
636 sizeof (struct fdr)));
637 if (ecoff_data (abfd)->fdr == NULL)
638 {
639 bfd_error = no_memory;
640 return false;
641 }
642 fdr_ptr = ecoff_data (abfd)->fdr;
643 fraw_src = ecoff_data (abfd)->external_fdr;
644 fraw_end = fraw_src + internal_symhdr->ifdMax;
645 for (; fraw_src < fraw_end; fraw_src++, fdr_ptr++)
646 ecoff_swap_fdr_in (abfd, fraw_src, fdr_ptr);
647
648 return true;
649 }
650 \f
651 /* ECOFF symbol table routines. The ECOFF symbol table is described
652 in gcc/mips-tfile.c. */
653
654 /* ECOFF uses two common sections. One is the usual one, and the
655 other is for small objects. All the small objects are kept
656 together, and then referenced via the gp pointer, which yields
657 faster assembler code. This is what we use for the small common
658 section. */
659 static asection ecoff_scom_section;
660 static asymbol ecoff_scom_symbol;
661 static asymbol *ecoff_scom_symbol_ptr;
662
663 /* Create an empty symbol. */
664
665 static asymbol *
666 ecoff_make_empty_symbol (abfd)
667 bfd *abfd;
668 {
669 ecoff_symbol_type *new;
670
671 new = (ecoff_symbol_type *) bfd_alloc (abfd, sizeof (ecoff_symbol_type));
672 if (new == (ecoff_symbol_type *) NULL)
673 {
674 bfd_error = no_memory;
675 return (asymbol *) NULL;
676 }
677 new->symbol.section = (asection *) NULL;
678 new->fdr = (FDR *) NULL;
679 new->local = false;
680 new->native.lnative = (struct sym_ext *) NULL;
681 new->symbol.the_bfd = abfd;
682 return &new->symbol;
683 }
684
685 /* Set the BFD flags and section for an ECOFF symbol. */
686
687 static void
688 ecoff_set_symbol_info (abfd, ecoff_sym, asym, ext)
689 bfd *abfd;
690 SYMR *ecoff_sym;
691 asymbol *asym;
692 int ext;
693 {
694 asym->the_bfd = abfd;
695 asym->value = ecoff_sym->value;
696 asym->section = &bfd_debug_section;
697 asym->udata = NULL;
698
699 /* Most symbol types are just for debugging. */
700 switch (ecoff_sym->st)
701 {
702 case stGlobal:
703 case stStatic:
704 case stLabel:
705 case stProc:
706 case stStaticProc:
707 case stBlock:
708 case stNil:
709 break;
710 default:
711 asym->flags = BSF_DEBUGGING;
712 return;
713 }
714
715 if (ext)
716 asym->flags = BSF_EXPORT | BSF_GLOBAL;
717 else
718 asym->flags = BSF_LOCAL;
719 switch (ecoff_sym->sc)
720 {
721 case scNil:
722 /* Used for compiler generated labels. Leave them in the
723 debugging section, and mark them as local. If BSF_DEBUGGING
724 is set, then nm does not display them for some reason. If no
725 flags are set then the linker whines about them. */
726 asym->flags = BSF_LOCAL;
727 break;
728 case scText:
729 asym->section = bfd_make_section_old_way (abfd, ".text");
730 asym->value -= asym->section->vma;
731 break;
732 case scData:
733 asym->section = bfd_make_section_old_way (abfd, ".data");
734 asym->value -= asym->section->vma;
735 break;
736 case scBss:
737 if (ext)
738 {
739 asym->section = &bfd_com_section;
740 asym->flags = 0;
741 }
742 else
743 {
744 asym->section = bfd_make_section_old_way (abfd, ".bss");
745 asym->value -= asym->section->vma;
746 }
747 break;
748 case scRegister:
749 asym->flags = BSF_DEBUGGING;
750 break;
751 case scAbs:
752 asym->section = &bfd_abs_section;
753 break;
754 case scUndefined:
755 asym->section = &bfd_und_section;
756 asym->flags = 0;
757 asym->value = 0;
758 break;
759 case scCdbLocal:
760 case scBits:
761 case scCdbSystem:
762 case scRegImage:
763 case scInfo:
764 case scUserStruct:
765 asym->flags = BSF_DEBUGGING;
766 break;
767 case scSData:
768 asym->section = bfd_make_section_old_way (abfd, ".sdata");
769 asym->value -= asym->section->vma;
770 break;
771 case scSBss:
772 asym->section = bfd_make_section_old_way (abfd, ".sbss");
773 if (! ext)
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 /* FIXME: We should take a -G argument, which gives the maximum
785 size of objects to be put in the small common section. Until
786 we do, we put objects of sizes up to 8 in the small common
787 section. The assembler should do this for us, but the native
788 assembler seems to get confused. */
789 if (asym->value > 8)
790 {
791 asym->section = &bfd_com_section;
792 break;
793 }
794 /* Fall through. */
795 case scSCommon:
796 if (ecoff_scom_section.name == NULL)
797 {
798 /* Initialize the small common section. */
799 ecoff_scom_section.name = SCOMMON;
800 ecoff_scom_section.flags = SEC_IS_COMMON;
801 ecoff_scom_section.output_section = &ecoff_scom_section;
802 ecoff_scom_section.symbol = &ecoff_scom_symbol;
803 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
804 ecoff_scom_symbol.name = SCOMMON;
805 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
806 ecoff_scom_symbol.section = &ecoff_scom_section;
807 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
808 }
809 asym->section = &ecoff_scom_section;
810 asym->flags = 0;
811 break;
812 case scVarRegister:
813 case scVariant:
814 asym->flags = BSF_DEBUGGING;
815 break;
816 case scSUndefined:
817 asym->section = &bfd_und_section;
818 asym->flags = 0;
819 asym->value = 0;
820 break;
821 case scInit:
822 asym->section = bfd_make_section_old_way (abfd, ".init");
823 asym->value -= asym->section->vma;
824 break;
825 case scBasedVar:
826 case scXData:
827 case scPData:
828 asym->flags = BSF_DEBUGGING;
829 break;
830 case scFini:
831 asym->section = bfd_make_section_old_way (abfd, ".fini");
832 asym->value -= asym->section->vma;
833 break;
834 default:
835 break;
836 }
837 }
838
839 /* Read an ECOFF symbol table. */
840
841 static boolean
842 ecoff_slurp_symbol_table (abfd)
843 bfd *abfd;
844 {
845 bfd_size_type internal_size;
846 ecoff_symbol_type *internal;
847 ecoff_symbol_type *internal_ptr;
848 struct ext_ext *eraw_src;
849 struct ext_ext *eraw_end;
850 FDR *fdr_ptr;
851 FDR *fdr_end;
852
853 /* If we've already read in the symbol table, do nothing. */
854 if (ecoff_data (abfd)->canonical_symbols != NULL)
855 return true;
856
857 /* Get the symbolic information. */
858 if (ecoff_slurp_symbolic_info (abfd) == false)
859 return false;
860 if (bfd_get_symcount (abfd) == 0)
861 return true;
862
863 internal_size = bfd_get_symcount (abfd) * sizeof (ecoff_symbol_type);
864 internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size);
865 if (internal == NULL)
866 {
867 bfd_error = no_memory;
868 return false;
869 }
870
871 internal_ptr = internal;
872 eraw_src = ecoff_data (abfd)->external_ext;
873 eraw_end = eraw_src + ecoff_data (abfd)->symbolic_header.iextMax;
874 for (; eraw_src < eraw_end; eraw_src++, internal_ptr++)
875 {
876 EXTR internal_esym;
877
878 ecoff_swap_ext_in (abfd, eraw_src, &internal_esym);
879 internal_ptr->symbol.name = (ecoff_data (abfd)->ssext
880 + internal_esym.asym.iss);
881 ecoff_set_symbol_info (abfd, &internal_esym.asym,
882 &internal_ptr->symbol, 1);
883 internal_ptr->fdr = ecoff_data (abfd)->fdr + internal_esym.ifd;
884 internal_ptr->local = false;
885 internal_ptr->native.enative = eraw_src;
886 }
887
888 /* The local symbols must be accessed via the fdr's, because the
889 string and aux indices are relative to the fdr information. */
890 fdr_ptr = ecoff_data (abfd)->fdr;
891 fdr_end = fdr_ptr + ecoff_data (abfd)->symbolic_header.ifdMax;
892 for (; fdr_ptr < fdr_end; fdr_ptr++)
893 {
894 struct sym_ext *lraw_src;
895 struct sym_ext *lraw_end;
896
897 lraw_src = ecoff_data (abfd)->external_sym + fdr_ptr->isymBase;
898 lraw_end = lraw_src + fdr_ptr->csym;
899 for (; lraw_src < lraw_end; lraw_src++, internal_ptr++)
900 {
901 SYMR internal_sym;
902
903 ecoff_swap_sym_in (abfd, lraw_src, &internal_sym);
904 internal_ptr->symbol.name = (ecoff_data (abfd)->ss
905 + fdr_ptr->issBase
906 + internal_sym.iss);
907 ecoff_set_symbol_info (abfd, &internal_sym,
908 &internal_ptr->symbol, 0);
909 internal_ptr->fdr = fdr_ptr;
910 internal_ptr->local = true;
911 internal_ptr->native.lnative = lraw_src;
912 }
913 }
914
915 ecoff_data (abfd)->canonical_symbols = internal;
916
917 return true;
918 }
919
920 static unsigned int
921 ecoff_get_symtab_upper_bound (abfd)
922 bfd *abfd;
923 {
924 if (ecoff_slurp_symbolic_info (abfd) == false
925 || bfd_get_symcount (abfd) == 0)
926 return 0;
927
928 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
929 }
930
931 static unsigned int
932 ecoff_get_symtab (abfd, alocation)
933 bfd *abfd;
934 asymbol **alocation;
935 {
936 unsigned int counter = 0;
937 ecoff_symbol_type *symbase;
938 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
939
940 if (ecoff_slurp_symbol_table (abfd) == false
941 || bfd_get_symcount (abfd) == 0)
942 return 0;
943
944 symbase = ecoff_data (abfd)->canonical_symbols;
945 while (counter < bfd_get_symcount (abfd))
946 {
947 *(location++) = symbase++;
948 counter++;
949 }
950 *location++ = (ecoff_symbol_type *) NULL;
951 return bfd_get_symcount (abfd);
952 }
953
954 /* Turn ECOFF type information into a printable string.
955 ecoff_emit_aggregate and ecoff_type_to_string are from
956 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
957
958 /* Write aggregate information to a string. */
959
960 static void
961 ecoff_emit_aggregate (abfd, string, rndx, isym, which)
962 bfd *abfd;
963 char *string;
964 RNDXR *rndx;
965 long isym;
966 CONST char *which;
967 {
968 int ifd = rndx->rfd;
969 int indx = rndx->index;
970 int sym_base, ss_base;
971 CONST char *name;
972
973 if (ifd == 0xfff)
974 ifd = isym;
975
976 sym_base = ecoff_data (abfd)->fdr[ifd].isymBase;
977 ss_base = ecoff_data (abfd)->fdr[ifd].issBase;
978
979 if (indx == indexNil)
980 name = "/* no name */";
981 else
982 {
983 SYMR sym;
984
985 indx += sym_base;
986 ecoff_swap_sym_in (abfd,
987 ecoff_data (abfd)->external_sym + indx,
988 &sym);
989 name = ecoff_data (abfd)->ss + ss_base + sym.iss;
990 }
991
992 sprintf (string,
993 "%s %s { ifd = %d, index = %d }",
994 which, name, ifd,
995 indx + ecoff_data (abfd)->symbolic_header.iextMax);
996 }
997
998 /* Convert the type information to string format. */
999
1000 static char *
1001 ecoff_type_to_string (abfd, aux_ptr, indx, bigendian)
1002 bfd *abfd;
1003 union aux_ext *aux_ptr;
1004 int indx;
1005 int bigendian;
1006 {
1007 AUXU u;
1008 struct qual {
1009 unsigned int type;
1010 int low_bound;
1011 int high_bound;
1012 int stride;
1013 } qualifiers[7];
1014
1015 unsigned int basic_type;
1016 int i;
1017 static char buffer1[1024];
1018 static char buffer2[1024];
1019 char *p1 = buffer1;
1020 char *p2 = buffer2;
1021 RNDXR rndx;
1022
1023 for (i = 0; i < 7; i++)
1024 {
1025 qualifiers[i].low_bound = 0;
1026 qualifiers[i].high_bound = 0;
1027 qualifiers[i].stride = 0;
1028 }
1029
1030 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == -1)
1031 return "-1 (no type)";
1032 ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1033
1034 basic_type = u.ti.bt;
1035 qualifiers[0].type = u.ti.tq0;
1036 qualifiers[1].type = u.ti.tq1;
1037 qualifiers[2].type = u.ti.tq2;
1038 qualifiers[3].type = u.ti.tq3;
1039 qualifiers[4].type = u.ti.tq4;
1040 qualifiers[5].type = u.ti.tq5;
1041 qualifiers[6].type = tqNil;
1042
1043 /*
1044 * Go get the basic type.
1045 */
1046 switch (basic_type)
1047 {
1048 case btNil: /* undefined */
1049 strcpy (p1, "nil");
1050 break;
1051
1052 case btAdr: /* address - integer same size as pointer */
1053 strcpy (p1, "address");
1054 break;
1055
1056 case btChar: /* character */
1057 strcpy (p1, "char");
1058 break;
1059
1060 case btUChar: /* unsigned character */
1061 strcpy (p1, "unsigned char");
1062 break;
1063
1064 case btShort: /* short */
1065 strcpy (p1, "short");
1066 break;
1067
1068 case btUShort: /* unsigned short */
1069 strcpy (p1, "unsigned short");
1070 break;
1071
1072 case btInt: /* int */
1073 strcpy (p1, "int");
1074 break;
1075
1076 case btUInt: /* unsigned int */
1077 strcpy (p1, "unsigned int");
1078 break;
1079
1080 case btLong: /* long */
1081 strcpy (p1, "long");
1082 break;
1083
1084 case btULong: /* unsigned long */
1085 strcpy (p1, "unsigned long");
1086 break;
1087
1088 case btFloat: /* float (real) */
1089 strcpy (p1, "float");
1090 break;
1091
1092 case btDouble: /* Double (real) */
1093 strcpy (p1, "double");
1094 break;
1095
1096 /* Structures add 1-2 aux words:
1097 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1098 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1099
1100 case btStruct: /* Structure (Record) */
1101 ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1102 ecoff_emit_aggregate (abfd, p1, &rndx,
1103 AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1104 "struct");
1105 indx++; /* skip aux words */
1106 break;
1107
1108 /* Unions add 1-2 aux words:
1109 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1110 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1111
1112 case btUnion: /* Union */
1113 ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1114 ecoff_emit_aggregate (abfd, p1, &rndx,
1115 AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1116 "union");
1117 indx++; /* skip aux words */
1118 break;
1119
1120 /* Enumerations add 1-2 aux words:
1121 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1122 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1123
1124 case btEnum: /* Enumeration */
1125 ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1126 ecoff_emit_aggregate (abfd, p1, &rndx,
1127 AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1128 "enum");
1129 indx++; /* skip aux words */
1130 break;
1131
1132 case btTypedef: /* defined via a typedef, isymRef points */
1133 strcpy (p1, "typedef");
1134 break;
1135
1136 case btRange: /* subrange of int */
1137 strcpy (p1, "subrange");
1138 break;
1139
1140 case btSet: /* pascal sets */
1141 strcpy (p1, "set");
1142 break;
1143
1144 case btComplex: /* fortran complex */
1145 strcpy (p1, "complex");
1146 break;
1147
1148 case btDComplex: /* fortran double complex */
1149 strcpy (p1, "double complex");
1150 break;
1151
1152 case btIndirect: /* forward or unnamed typedef */
1153 strcpy (p1, "forward/unamed typedef");
1154 break;
1155
1156 case btFixedDec: /* Fixed Decimal */
1157 strcpy (p1, "fixed decimal");
1158 break;
1159
1160 case btFloatDec: /* Float Decimal */
1161 strcpy (p1, "float decimal");
1162 break;
1163
1164 case btString: /* Varying Length Character String */
1165 strcpy (p1, "string");
1166 break;
1167
1168 case btBit: /* Aligned Bit String */
1169 strcpy (p1, "bit");
1170 break;
1171
1172 case btPicture: /* Picture */
1173 strcpy (p1, "picture");
1174 break;
1175
1176 case btVoid: /* Void */
1177 strcpy (p1, "void");
1178 break;
1179
1180 default:
1181 sprintf (p1, "Unknown basic type %d", (int) basic_type);
1182 break;
1183 }
1184
1185 p1 += strlen (buffer1);
1186
1187 /*
1188 * If this is a bitfield, get the bitsize.
1189 */
1190 if (u.ti.fBitfield)
1191 {
1192 int bitsize;
1193
1194 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1195 sprintf (p1, " : %d", bitsize);
1196 p1 += strlen (buffer1);
1197 }
1198
1199
1200 /*
1201 * Deal with any qualifiers.
1202 */
1203 if (qualifiers[0].type != tqNil)
1204 {
1205 /*
1206 * Snarf up any array bounds in the correct order. Arrays
1207 * store 5 successive words in the aux. table:
1208 * word 0 RNDXR to type of the bounds (ie, int)
1209 * word 1 Current file descriptor index
1210 * word 2 low bound
1211 * word 3 high bound (or -1 if [])
1212 * word 4 stride size in bits
1213 */
1214 for (i = 0; i < 7; i++)
1215 {
1216 if (qualifiers[i].type == tqArray)
1217 {
1218 qualifiers[i].low_bound =
1219 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1220 qualifiers[i].high_bound =
1221 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1222 qualifiers[i].stride =
1223 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1224 indx += 5;
1225 }
1226 }
1227
1228 /*
1229 * Now print out the qualifiers.
1230 */
1231 for (i = 0; i < 6; i++)
1232 {
1233 switch (qualifiers[i].type)
1234 {
1235 case tqNil:
1236 case tqMax:
1237 break;
1238
1239 case tqPtr:
1240 strcpy (p2, "ptr to ");
1241 p2 += sizeof ("ptr to ")-1;
1242 break;
1243
1244 case tqVol:
1245 strcpy (p2, "volatile ");
1246 p2 += sizeof ("volatile ")-1;
1247 break;
1248
1249 case tqFar:
1250 strcpy (p2, "far ");
1251 p2 += sizeof ("far ")-1;
1252 break;
1253
1254 case tqProc:
1255 strcpy (p2, "func. ret. ");
1256 p2 += sizeof ("func. ret. ");
1257 break;
1258
1259 case tqArray:
1260 {
1261 int first_array = i;
1262 int j;
1263
1264 /* Print array bounds reversed (ie, in the order the C
1265 programmer writes them). C is such a fun language.... */
1266
1267 while (i < 5 && qualifiers[i+1].type == tqArray)
1268 i++;
1269
1270 for (j = i; j >= first_array; j--)
1271 {
1272 strcpy (p2, "array [");
1273 p2 += sizeof ("array [")-1;
1274 if (qualifiers[j].low_bound != 0)
1275 sprintf (p2,
1276 "%ld:%ld {%ld bits}",
1277 (long) qualifiers[j].low_bound,
1278 (long) qualifiers[j].high_bound,
1279 (long) qualifiers[j].stride);
1280
1281 else if (qualifiers[j].high_bound != -1)
1282 sprintf (p2,
1283 "%ld {%ld bits}",
1284 (long) (qualifiers[j].high_bound + 1),
1285 (long) (qualifiers[j].stride));
1286
1287 else
1288 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1289
1290 p2 += strlen (p2);
1291 strcpy (p2, "] of ");
1292 p2 += sizeof ("] of ")-1;
1293 }
1294 }
1295 break;
1296 }
1297 }
1298 }
1299
1300 strcpy (p2, buffer1);
1301 return buffer2;
1302 }
1303
1304 /* Print information about an ECOFF symbol. */
1305
1306 static void
1307 ecoff_print_symbol (abfd, filep, symbol, how)
1308 bfd *abfd;
1309 PTR filep;
1310 asymbol *symbol;
1311 bfd_print_symbol_type how;
1312 {
1313 FILE *file = (FILE *)filep;
1314
1315 switch (how)
1316 {
1317 case bfd_print_symbol_name:
1318 fprintf (file, "%s", symbol->name);
1319 break;
1320 case bfd_print_symbol_more:
1321 if (ecoffsymbol (symbol)->local)
1322 {
1323 SYMR ecoff_sym;
1324
1325 ecoff_swap_sym_in (abfd, ecoffsymbol (symbol)->native.lnative,
1326 &ecoff_sym);
1327 fprintf (file, "ecoff local %lx %x %x",
1328 (unsigned long) ecoff_sym.value,
1329 (unsigned) ecoff_sym.st, (unsigned) ecoff_sym.sc);
1330 }
1331 else
1332 {
1333 EXTR ecoff_ext;
1334
1335 ecoff_swap_ext_in (abfd, ecoffsymbol (symbol)->native.enative,
1336 &ecoff_ext);
1337 fprintf (file, "ecoff extern %lx %x %x",
1338 (unsigned long) ecoff_ext.asym.value,
1339 (unsigned) ecoff_ext.asym.st,
1340 (unsigned) ecoff_ext.asym.sc);
1341 }
1342 break;
1343 case bfd_print_symbol_nm:
1344 {
1345 CONST char *section_name = symbol->section->name;
1346
1347 bfd_print_symbol_vandf ((PTR) file, symbol);
1348 fprintf (file, " %-5s %s %s",
1349 section_name,
1350 ecoffsymbol (symbol)->local ? "l" : "e",
1351 symbol->name);
1352 }
1353 break;
1354 case bfd_print_symbol_all:
1355 /* Print out the symbols in a reasonable way */
1356 {
1357 char type;
1358 int pos;
1359 EXTR ecoff_ext;
1360 char jmptbl;
1361 char cobol_main;
1362 char weakext;
1363
1364 if (ecoffsymbol (symbol)->local)
1365 {
1366 ecoff_swap_sym_in (abfd, ecoffsymbol (symbol)->native.lnative,
1367 &ecoff_ext.asym);
1368 type = 'l';
1369 pos = (ecoffsymbol (symbol)->native.lnative
1370 - ecoff_data (abfd)->external_sym
1371 + ecoff_data (abfd)->symbolic_header.iextMax);
1372 jmptbl = ' ';
1373 cobol_main = ' ';
1374 weakext = ' ';
1375 }
1376 else
1377 {
1378 ecoff_swap_ext_in (abfd, ecoffsymbol (symbol)->native.enative,
1379 &ecoff_ext);
1380 type = 'e';
1381 pos = (ecoffsymbol (symbol)->native.enative
1382 - ecoff_data (abfd)->external_ext);
1383 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1384 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1385 weakext = ecoff_ext.weakext ? 'w' : ' ';
1386 }
1387
1388 fprintf (file, "[%3d] %c %lx st %x sc %x indx %x %c%c%c %s",
1389 pos, type, (unsigned long) ecoff_ext.asym.value,
1390 (unsigned) ecoff_ext.asym.st,
1391 (unsigned) ecoff_ext.asym.sc,
1392 (unsigned) ecoff_ext.asym.index,
1393 jmptbl, cobol_main, weakext,
1394 symbol->name);
1395
1396 if (ecoffsymbol (symbol)->fdr != NULL
1397 && ecoff_ext.asym.index != indexNil)
1398 {
1399 unsigned indx;
1400 int bigendian;
1401 long sym_base;
1402 union aux_ext *aux_base;
1403
1404 indx = ecoff_ext.asym.index;
1405
1406 /* sym_base is used to map the fdr relative indices which
1407 appear in the file to the position number which we are
1408 using. */
1409 sym_base = ecoffsymbol (symbol)->fdr->isymBase;
1410 if (ecoffsymbol (symbol)->local)
1411 sym_base += ecoff_data (abfd)->symbolic_header.iextMax;
1412
1413 /* aux_base is the start of the aux entries for this file;
1414 asym.index is an offset from this. */
1415 aux_base = (ecoff_data (abfd)->external_aux
1416 + ecoffsymbol (symbol)->fdr->iauxBase);
1417
1418 /* The aux entries are stored in host byte order; the
1419 order is indicated by a bit in the fdr. */
1420 bigendian = ecoffsymbol (symbol)->fdr->fBigendian;
1421
1422 /* This switch is basically from gcc/mips-tdump.c */
1423 switch (ecoff_ext.asym.st)
1424 {
1425 case stNil:
1426 case stLabel:
1427 break;
1428
1429 case stFile:
1430 case stBlock:
1431 printf ("\n End+1 symbol: %ld", indx + sym_base);
1432 break;
1433
1434 case stEnd:
1435 if (ecoff_ext.asym.sc == scText
1436 || ecoff_ext.asym.sc == scInfo)
1437 printf ("\n First symbol: %ld", indx + sym_base);
1438 else
1439 printf ("\n First symbol: %ld",
1440 (AUX_GET_ISYM (bigendian,
1441 &aux_base[ecoff_ext.asym.index])
1442 + sym_base));
1443 break;
1444
1445 case stProc:
1446 case stStaticProc:
1447 if (MIPS_IS_STAB (&ecoff_ext.asym))
1448 ;
1449 else if (ecoffsymbol (symbol)->local)
1450 printf ("\n End+1 symbol: %-7ld Type: %s",
1451 (AUX_GET_ISYM (bigendian,
1452 &aux_base[ecoff_ext.asym.index])
1453 + sym_base),
1454 ecoff_type_to_string (abfd, aux_base, indx + 1,
1455 bigendian));
1456 else
1457 printf ("\n Local symbol: %d",
1458 (indx
1459 + sym_base
1460 + ecoff_data (abfd)->symbolic_header.iextMax));
1461 break;
1462
1463 default:
1464 if (!MIPS_IS_STAB (&ecoff_ext.asym))
1465 printf ("\n Type: %s",
1466 ecoff_type_to_string (abfd, aux_base, indx,
1467 bigendian));
1468 break;
1469 }
1470 }
1471 }
1472 break;
1473 }
1474 }
1475 \f
1476 /* Reloc handling. MIPS ECOFF relocs are packed into 8 bytes in
1477 external form. They use a bit which indicates whether the symbol
1478 is external. */
1479
1480 /* Swap a reloc in. */
1481
1482 static void
1483 ecoff_swap_reloc_in (abfd, ext, intern)
1484 bfd *abfd;
1485 RELOC *ext;
1486 struct internal_reloc *intern;
1487 {
1488 intern->r_vaddr = bfd_h_get_32 (abfd, (bfd_byte *) ext->r_vaddr);
1489 if (abfd->xvec->header_byteorder_big_p != false)
1490 {
1491 intern->r_symndx = (((int) ext->r_bits[0]
1492 << RELOC_BITS0_SYMNDX_SH_LEFT_BIG)
1493 | ((int) ext->r_bits[1]
1494 << RELOC_BITS1_SYMNDX_SH_LEFT_BIG)
1495 | ((int) ext->r_bits[2]
1496 << RELOC_BITS2_SYMNDX_SH_LEFT_BIG));
1497 intern->r_type = ((ext->r_bits[3] & RELOC_BITS3_TYPE_BIG)
1498 >> RELOC_BITS3_TYPE_SH_BIG);
1499 intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_BIG) != 0;
1500 }
1501 else
1502 {
1503 intern->r_symndx = (((int) ext->r_bits[0]
1504 << RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE)
1505 | ((int) ext->r_bits[1]
1506 << RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE)
1507 | ((int) ext->r_bits[2]
1508 << RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE));
1509 intern->r_type = ((ext->r_bits[3] & RELOC_BITS3_TYPE_LITTLE)
1510 >> RELOC_BITS3_TYPE_SH_LITTLE);
1511 intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_LITTLE) != 0;
1512 }
1513 }
1514
1515 /* Swap a reloc out. */
1516
1517 static unsigned int
1518 ecoff_swap_reloc_out (abfd, src, dst)
1519 bfd *abfd;
1520 PTR src;
1521 PTR dst;
1522 {
1523 struct internal_reloc *intern = (struct internal_reloc *) src;
1524 RELOC *ext = (RELOC *) dst;
1525
1526 bfd_h_put_32 (abfd, intern->r_vaddr, (bfd_byte *) ext->r_vaddr);
1527 if (abfd->xvec->header_byteorder_big_p != false)
1528 {
1529 ext->r_bits[0] = intern->r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_BIG;
1530 ext->r_bits[1] = intern->r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_BIG;
1531 ext->r_bits[2] = intern->r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_BIG;
1532 ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_BIG)
1533 & RELOC_BITS3_TYPE_BIG)
1534 | (intern->r_extern ? RELOC_BITS3_EXTERN_BIG : 0));
1535 }
1536 else
1537 {
1538 ext->r_bits[0] = intern->r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE;
1539 ext->r_bits[1] = intern->r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE;
1540 ext->r_bits[2] = intern->r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE;
1541 ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_LITTLE)
1542 & RELOC_BITS3_TYPE_LITTLE)
1543 | (intern->r_extern ? RELOC_BITS3_EXTERN_LITTLE : 0));
1544 }
1545
1546 return RELSZ;
1547 }
1548
1549 /* ECOFF relocs are either against external symbols, or against
1550 sections. If we are producing relocateable output, and the reloc
1551 is against an external symbol, the resulting reloc will also be
1552 against the same symbol. In such a case, we don't want to change
1553 anything about the way the reloc is handled, since it will all be
1554 done at final link time. Rather than put special case code into
1555 bfd_perform_relocation, all the reloc types use this howto
1556 function. It just short circuits the reloc if producing
1557 relocateable output against an external symbol. */
1558
1559 static bfd_reloc_status_type
1560 ecoff_generic_reloc (abfd,
1561 reloc_entry,
1562 symbol,
1563 data,
1564 input_section,
1565 output_bfd)
1566 bfd *abfd;
1567 arelent *reloc_entry;
1568 asymbol *symbol;
1569 PTR data;
1570 asection *input_section;
1571 bfd *output_bfd;
1572 {
1573 if (output_bfd != (bfd *) NULL
1574 && (symbol->flags & BSF_SECTION_SYM) == 0)
1575 {
1576 reloc_entry->address += input_section->output_offset;
1577 return bfd_reloc_ok;
1578 }
1579
1580 return bfd_reloc_continue;
1581 }
1582
1583 /* Do a REFHI relocation. The next reloc must be the corresponding
1584 REFLO. This has to be done in a function so that carry is handled
1585 correctly. */
1586
1587 static bfd_reloc_status_type
1588 ecoff_refhi_reloc (abfd,
1589 reloc_entry,
1590 symbol,
1591 data,
1592 input_section,
1593 output_bfd)
1594 bfd *abfd;
1595 arelent *reloc_entry;
1596 asymbol *symbol;
1597 PTR data;
1598 asection *input_section;
1599 bfd *output_bfd;
1600 {
1601 bfd_reloc_status_type ret;
1602 arelent *rello;
1603 bfd_vma relocation;
1604 unsigned long insn;
1605 unsigned long val;
1606 unsigned long vallo;
1607
1608 /* If we're relocating, and this an external symbol, we don't want
1609 to change anything. */
1610 if (output_bfd != (bfd *) NULL
1611 && (symbol->flags & BSF_SECTION_SYM) == 0)
1612 {
1613 reloc_entry->address += input_section->output_offset;
1614 return bfd_reloc_ok;
1615 }
1616
1617 ret = bfd_reloc_ok;
1618 if (symbol->section == &bfd_und_section
1619 && output_bfd == (bfd *) NULL)
1620 ret = bfd_reloc_undefined;
1621
1622 rello = reloc_entry + 1;
1623 BFD_ASSERT (rello->howto->type == ECOFF_R_REFLO
1624 && *rello->sym_ptr_ptr == *reloc_entry->sym_ptr_ptr);
1625
1626 if (bfd_is_com_section (symbol->section))
1627 relocation = 0;
1628 else
1629 relocation = symbol->value;
1630
1631 relocation += symbol->section->output_section->vma;
1632 relocation += symbol->section->output_offset;
1633 relocation += reloc_entry->addend;
1634
1635 if (reloc_entry->address > input_section->_cooked_size)
1636 return bfd_reloc_outofrange;
1637
1638 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1639 vallo = bfd_get_32 (abfd, (bfd_byte *) data + rello->address) & 0xffff;
1640 val = ((insn & 0xffff) << 16) + vallo;
1641 val += relocation;
1642
1643 /* The low order 16 bits are always treated as a signed value.
1644 Therefore, a negative value in the low order bits requires an
1645 adjustment in the high order bits. We need to make this
1646 adjustment in two ways: once for the bits we took from the data,
1647 and once for the bits we are putting back in to the data. */
1648 if ((vallo & 0x8000) != 0)
1649 val -= 0x10000;
1650 if ((val & 0x8000) != 0)
1651 val += 0x10000;
1652
1653 insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
1654 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
1655
1656 if (output_bfd != (bfd *) NULL)
1657 reloc_entry->address += input_section->output_offset;
1658
1659 return ret;
1660 }
1661
1662 /* Do a GPREL relocation. This is a 16 bit value which must become
1663 the offset from the gp register. */
1664
1665 static bfd_reloc_status_type
1666 ecoff_gprel_reloc (abfd,
1667 reloc_entry,
1668 symbol,
1669 data,
1670 input_section,
1671 output_bfd)
1672 bfd *abfd;
1673 arelent *reloc_entry;
1674 asymbol *symbol;
1675 PTR data;
1676 asection *input_section;
1677 bfd *output_bfd;
1678 {
1679 boolean relocateable;
1680 bfd_vma relocation;
1681 unsigned long val;
1682 unsigned long insn;
1683
1684 /* If we're relocating, and this an external symbol, we don't want
1685 to change anything. */
1686 if (output_bfd != (bfd *) NULL
1687 && (symbol->flags & BSF_SECTION_SYM) == 0)
1688 {
1689 reloc_entry->address += input_section->output_offset;
1690 return bfd_reloc_ok;
1691 }
1692
1693 if (output_bfd != (bfd *) NULL)
1694 relocateable = true;
1695 else
1696 {
1697 relocateable = false;
1698 output_bfd = symbol->section->output_section->owner;
1699 }
1700
1701 if (symbol->section == &bfd_und_section
1702 && relocateable == false)
1703 return bfd_reloc_undefined;
1704
1705 /* We have to figure out the gp value, so that we can adjust the
1706 symbol value correctly. We look up the symbol _gp in the output
1707 BFD. If we can't find it, we're stuck. We cache it in the ECOFF
1708 target data. */
1709 if (ecoff_data (output_bfd)->gp == 0)
1710 {
1711 if (relocateable != false)
1712 {
1713 /* Make up a value. */
1714 ecoff_data (output_bfd)->gp =
1715 symbol->section->output_section->vma + 0x4000;
1716 }
1717 else
1718 {
1719 unsigned int count;
1720 asymbol **sym;
1721 unsigned int i;
1722
1723 count = bfd_get_symcount (output_bfd);
1724 sym = bfd_get_outsymbols (output_bfd);
1725
1726 /* We should do something more friendly here, but we don't
1727 have a good reloc status to return. */
1728 if (sym == (asymbol **) NULL)
1729 abort ();
1730
1731 for (i = 0; i < count; i++, sym++)
1732 {
1733 register CONST char *name;
1734
1735 name = bfd_asymbol_name (*sym);
1736 if (*name == '_' && strcmp (name, "_gp") == 0)
1737 {
1738 ecoff_data (output_bfd)->gp = bfd_asymbol_value (*sym);
1739 break;
1740 }
1741 }
1742
1743 /* We should do something more friendly here, but we don't have
1744 a good reloc status to return. */
1745 if (i >= count)
1746 abort ();
1747 }
1748 }
1749
1750 if (bfd_is_com_section (symbol->section))
1751 relocation = 0;
1752 else
1753 relocation = symbol->value;
1754
1755 relocation += symbol->section->output_section->vma;
1756 relocation += symbol->section->output_offset;
1757
1758 if (reloc_entry->address > input_section->_cooked_size)
1759 return bfd_reloc_outofrange;
1760
1761 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1762
1763 /* Set val to the offset into the section (if we are relocating
1764 against an external symbol, insn & 0xffff will be zero and so
1765 will reloc_entry->addend). */
1766 val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff;
1767 if (val & 0x8000)
1768 val -= 0x10000;
1769
1770 /* Adjust val for the final section location and GP value. */
1771 val += (relocation - ecoff_data (output_bfd)->gp);
1772
1773 insn = (insn &~ 0xffff) | (val & 0xffff);
1774 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
1775
1776 if (relocateable != false)
1777 reloc_entry->address += input_section->output_offset;
1778
1779 /* Make sure it fit in 16 bits. */
1780 if (val >= 0x8000 && val < 0xffff8000)
1781 return bfd_reloc_outofrange;
1782
1783 return bfd_reloc_ok;
1784 }
1785
1786 /* How to process the various relocs types. */
1787
1788 static reloc_howto_type ecoff_howto_table[] =
1789 {
1790 /* Reloc type 0 is ignored. The reloc reading code ensures that
1791 this is a reference to the .abs section, which will cause
1792 bfd_perform_relocation to do nothing. */
1793 HOWTO (ECOFF_R_IGNORE, /* type */
1794 0, /* rightshift */
1795 0, /* size (0 = byte, 1 = short, 2 = long) */
1796 8, /* bitsize (obsolete) */
1797 false, /* pc_relative */
1798 0, /* bitpos */
1799 false, /* absolute (obsolete) */
1800 false, /* complain_on_overflow */
1801 0, /* special_function */
1802 "IGNORE", /* name */
1803 false, /* partial_inplace */
1804 0, /* src_mask */
1805 0, /* dst_mask */
1806 false), /* pcrel_offset */
1807
1808 /* A 16 bit reference to a symbol, normally from a data section. */
1809 HOWTO (ECOFF_R_REFHALF, /* type */
1810 0, /* rightshift */
1811 1, /* size (0 = byte, 1 = short, 2 = long) */
1812 16, /* bitsize (obsolete) */
1813 false, /* pc_relative */
1814 0, /* bitpos */
1815 false, /* absolute (obsolete) */
1816 true, /* complain_on_overflow */
1817 ecoff_generic_reloc, /* special_function */
1818 "REFHALF", /* name */
1819 true, /* partial_inplace */
1820 0xffff, /* src_mask */
1821 0xffff, /* dst_mask */
1822 false), /* pcrel_offset */
1823
1824 /* A 32 bit reference to a symbol, normally from a data section. */
1825 HOWTO (ECOFF_R_REFWORD, /* type */
1826 0, /* rightshift */
1827 2, /* size (0 = byte, 1 = short, 2 = long) */
1828 32, /* bitsize (obsolete) */
1829 false, /* pc_relative */
1830 0, /* bitpos */
1831 false, /* absolute (obsolete) */
1832 true, /* complain_on_overflow */
1833 ecoff_generic_reloc, /* special_function */
1834 "REFWORD", /* name */
1835 true, /* partial_inplace */
1836 0xffffffff, /* src_mask */
1837 0xffffffff, /* dst_mask */
1838 false), /* pcrel_offset */
1839
1840 /* A 26 bit absolute jump address. */
1841 HOWTO (ECOFF_R_JMPADDR, /* type */
1842 2, /* rightshift */
1843 2, /* size (0 = byte, 1 = short, 2 = long) */
1844 32, /* bitsize (obsolete) */
1845 false, /* pc_relative */
1846 0, /* bitpos */
1847 false, /* absolute (obsolete) */
1848 true, /* complain_on_overflow */
1849 ecoff_generic_reloc, /* special_function */
1850 "JMPADDR", /* name */
1851 true, /* partial_inplace */
1852 0x3ffffff, /* src_mask */
1853 0x3ffffff, /* dst_mask */
1854 false), /* pcrel_offset */
1855
1856 /* The high 16 bits of a symbol value. Handled by the function
1857 ecoff_refhi_reloc. */
1858 HOWTO (ECOFF_R_REFHI, /* type */
1859 16, /* rightshift */
1860 2, /* size (0 = byte, 1 = short, 2 = long) */
1861 32, /* bitsize (obsolete) */
1862 false, /* pc_relative */
1863 0, /* bitpos */
1864 false, /* absolute (obsolete) */
1865 true, /* complain_on_overflow */
1866 ecoff_refhi_reloc, /* special_function */
1867 "REFHI", /* name */
1868 true, /* partial_inplace */
1869 0xffff, /* src_mask */
1870 0xffff, /* dst_mask */
1871 false), /* pcrel_offset */
1872
1873 /* The low 16 bits of a symbol value. */
1874 HOWTO (ECOFF_R_REFLO, /* type */
1875 0, /* rightshift */
1876 2, /* size (0 = byte, 1 = short, 2 = long) */
1877 32, /* bitsize (obsolete) */
1878 false, /* pc_relative */
1879 0, /* bitpos */
1880 false, /* absolute (obsolete) */
1881 true, /* complain_on_overflow */
1882 ecoff_generic_reloc, /* special_function */
1883 "REFLO", /* name */
1884 true, /* partial_inplace */
1885 0xffff, /* src_mask */
1886 0xffff, /* dst_mask */
1887 false), /* pcrel_offset */
1888
1889 /* A reference to an offset from the gp register. Handled by the
1890 function ecoff_gprel_reloc. */
1891 HOWTO (ECOFF_R_GPREL, /* type */
1892 0, /* rightshift */
1893 2, /* size (0 = byte, 1 = short, 2 = long) */
1894 32, /* bitsize (obsolete) */
1895 false, /* pc_relative */
1896 0, /* bitpos */
1897 false, /* absolute (obsolete) */
1898 true, /* complain_on_overflow */
1899 ecoff_gprel_reloc, /* special_function */
1900 "GPREL", /* name */
1901 true, /* partial_inplace */
1902 0xffff, /* src_mask */
1903 0xffff, /* dst_mask */
1904 false), /* pcrel_offset */
1905
1906 /* A reference to a literal using an offset from the gp register.
1907 Handled by the function ecoff_gprel_reloc. */
1908 HOWTO (ECOFF_R_LITERAL, /* type */
1909 0, /* rightshift */
1910 2, /* size (0 = byte, 1 = short, 2 = long) */
1911 32, /* bitsize (obsolete) */
1912 false, /* pc_relative */
1913 0, /* bitpos */
1914 false, /* absolute (obsolete) */
1915 true, /* complain_on_overflow */
1916 ecoff_gprel_reloc, /* special_function */
1917 "LITERAL", /* name */
1918 true, /* partial_inplace */
1919 0xffff, /* src_mask */
1920 0xffff, /* dst_mask */
1921 false) /* pcrel_offset */
1922 };
1923
1924 /* Read in the relocs for a section. */
1925
1926 static boolean
1927 ecoff_slurp_reloc_table (abfd, section, symbols)
1928 bfd *abfd;
1929 asection *section;
1930 asymbol **symbols;
1931 {
1932 RELOC *external_relocs;
1933 arelent *internal_relocs;
1934 arelent *rptr;
1935 unsigned int i;
1936
1937 if (section->relocation != (arelent *) NULL
1938 || section->reloc_count == 0
1939 || (section->flags & SEC_CONSTRUCTOR) != 0)
1940 return true;
1941
1942 if (ecoff_slurp_symbol_table (abfd) == false)
1943 return false;
1944
1945 internal_relocs = (arelent *) bfd_alloc (abfd,
1946 (sizeof (arelent)
1947 * section->reloc_count));
1948 external_relocs = (RELOC *) bfd_alloc (abfd, RELSZ * section->reloc_count);
1949 if (internal_relocs == (arelent *) NULL
1950 || external_relocs == (RELOC *) NULL)
1951 {
1952 bfd_error = no_memory;
1953 return false;
1954 }
1955 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
1956 return false;
1957 if (bfd_read (external_relocs, 1, RELSZ * section->reloc_count, abfd)
1958 != RELSZ * section->reloc_count)
1959 {
1960 bfd_error = system_call_error;
1961 return false;
1962 }
1963
1964 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
1965 {
1966 struct internal_reloc intern;
1967
1968 ecoff_swap_reloc_in (abfd, external_relocs + i, &intern);
1969
1970 if (intern.r_type > ECOFF_R_LITERAL)
1971 abort ();
1972
1973 if (intern.r_extern)
1974 {
1975 /* r_symndx is an index into the external symbols. */
1976 BFD_ASSERT (intern.r_symndx >= 0
1977 && (intern.r_symndx
1978 < ecoff_data (abfd)->symbolic_header.iextMax));
1979 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
1980 rptr->addend = 0;
1981 }
1982 else
1983 {
1984 CONST char *sec_name;
1985 asection *sec;
1986
1987 /* r_symndx is a section key. */
1988 switch (intern.r_symndx)
1989 {
1990 case RELOC_SECTION_TEXT: sec_name = ".text"; break;
1991 case RELOC_SECTION_RDATA: sec_name = ".rdata"; break;
1992 case RELOC_SECTION_DATA: sec_name = ".data"; break;
1993 case RELOC_SECTION_SDATA: sec_name = ".sdata"; break;
1994 case RELOC_SECTION_SBSS: sec_name = ".sbss"; break;
1995 case RELOC_SECTION_BSS: sec_name = ".bss"; break;
1996 case RELOC_SECTION_INIT: sec_name = ".init"; break;
1997 case RELOC_SECTION_LIT8: sec_name = ".lit8"; break;
1998 case RELOC_SECTION_LIT4: sec_name = ".lit4"; break;
1999 default: abort ();
2000 }
2001
2002 sec = bfd_get_section_by_name (abfd, sec_name);
2003 if (sec == (asection *) NULL)
2004 abort ();
2005 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
2006
2007 rptr->addend = - bfd_get_section_vma (abfd, sec);
2008 if (intern.r_type == ECOFF_R_GPREL
2009 || intern.r_type == ECOFF_R_LITERAL)
2010 rptr->addend += ecoff_data (abfd)->gp;
2011 }
2012
2013 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
2014 rptr->howto = &ecoff_howto_table[intern.r_type];
2015
2016 /* If the type is ECOFF_R_IGNORE, make sure this is a reference
2017 to the absolute section so that the reloc is ignored. */
2018 if (intern.r_type == ECOFF_R_IGNORE)
2019 rptr->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
2020 }
2021
2022 bfd_release (abfd, external_relocs);
2023
2024 section->relocation = internal_relocs;
2025
2026 return true;
2027 }
2028
2029 /* Get a canonical list of relocs. */
2030
2031 static unsigned int
2032 ecoff_canonicalize_reloc (abfd, section, relptr, symbols)
2033 bfd *abfd;
2034 asection *section;
2035 arelent **relptr;
2036 asymbol **symbols;
2037 {
2038 unsigned int count;
2039
2040 if (section->flags & SEC_CONSTRUCTOR)
2041 {
2042 arelent_chain *chain;
2043
2044 /* This section has relocs made up by us, not the file, so take
2045 them out of their chain and place them into the data area
2046 provided. */
2047 for (count = 0, chain = section->constructor_chain;
2048 count < section->reloc_count;
2049 count++, chain = chain->next)
2050 *relptr++ = &chain->relent;
2051 }
2052 else
2053 {
2054 arelent *tblptr;
2055
2056 if (ecoff_slurp_reloc_table (abfd, section, symbols) == false)
2057 return 0;
2058
2059 tblptr = section->relocation;
2060 if (tblptr == (arelent *) NULL)
2061 return 0;
2062
2063 for (count = 0; count < section->reloc_count; count++)
2064 *relptr++ = tblptr++;
2065 }
2066
2067 *relptr = (arelent *) NULL;
2068
2069 return section->reloc_count;
2070 }
2071 \f
2072 /* Provided a BFD, a section and an offset into the section, calculate
2073 and return the name of the source file and the line nearest to the
2074 wanted location. */
2075
2076 static boolean
2077 ecoff_find_nearest_line (abfd,
2078 section,
2079 ignore_symbols,
2080 offset,
2081 filename_ptr,
2082 functionname_ptr,
2083 retline_ptr)
2084 bfd *abfd;
2085 asection *section;
2086 asymbol **ignore_symbols;
2087 bfd_vma offset;
2088 CONST char **filename_ptr;
2089 CONST char **functionname_ptr;
2090 unsigned int *retline_ptr;
2091 {
2092 FDR *fdr_ptr;
2093 FDR *fdr_start;
2094 FDR *fdr_end;
2095 FDR *fdr_hold;
2096 struct pdr_ext *pdr_ptr;
2097 struct pdr_ext *pdr_end;
2098 PDR pdr;
2099 unsigned char *line_ptr;
2100 unsigned char *line_end;
2101 int lineno;
2102
2103 /* If we're not in the .text section, we don't have any line
2104 numbers. */
2105 if (strcmp (section->name, _TEXT) != 0
2106 || offset < ecoff_data (abfd)->text_start
2107 || offset >= ecoff_data (abfd)->text_end)
2108 return false;
2109
2110 /* Make sure we have the FDR's. */
2111 if (ecoff_slurp_symbolic_info (abfd) == false
2112 || bfd_get_symcount (abfd) == 0)
2113 return false;
2114
2115 /* Each file descriptor (FDR) has a memory address. Here we track
2116 down which FDR we want. The FDR's are stored in increasing
2117 memory order. If speed is ever important, this can become a
2118 binary search. We must ignore FDR's with no PDR entries; they
2119 will have the adr of the FDR before or after them. */
2120 fdr_start = ecoff_data (abfd)->fdr;
2121 fdr_end = fdr_start + ecoff_data (abfd)->symbolic_header.ifdMax;
2122 fdr_hold = (FDR *) NULL;
2123 for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++)
2124 {
2125 if (fdr_ptr->cpd == 0)
2126 continue;
2127 if (offset < fdr_ptr->adr)
2128 break;
2129 fdr_hold = fdr_ptr;
2130 }
2131 if (fdr_hold == (FDR *) NULL)
2132 return false;
2133 fdr_ptr = fdr_hold;
2134
2135 /* Each FDR has a list of procedure descriptors (PDR). PDR's also
2136 have an address, which is relative to the FDR address, and are
2137 also stored in increasing memory order. */
2138 offset -= fdr_ptr->adr;
2139 pdr_ptr = ecoff_data (abfd)->external_pdr + fdr_ptr->ipdFirst;
2140 pdr_end = pdr_ptr + fdr_ptr->cpd;
2141 ecoff_swap_pdr_in (abfd, pdr_ptr, &pdr);
2142 if (offset < pdr.adr)
2143 return false;
2144 for (pdr_ptr++; pdr_ptr < pdr_end; pdr_ptr++)
2145 {
2146 ecoff_swap_pdr_in (abfd, pdr_ptr, &pdr);
2147 if (offset < pdr.adr)
2148 break;
2149 }
2150
2151 /* Now we can look for the actual line number. The line numbers are
2152 stored in a very funky format, which I won't try to describe.
2153 Note that right here pdr_ptr and pdr hold the PDR *after* the one
2154 we want; we need this to compute line_end. */
2155 line_end = ecoff_data (abfd)->line;
2156 if (pdr_ptr == pdr_end)
2157 line_end += fdr_ptr->cbLineOffset + fdr_ptr->cbLine;
2158 else
2159 line_end += fdr_ptr->cbLineOffset + pdr.cbLineOffset;
2160
2161 /* Now change pdr and pdr_ptr to the one we want. */
2162 pdr_ptr--;
2163 ecoff_swap_pdr_in (abfd, pdr_ptr, &pdr);
2164
2165 offset -= pdr.adr;
2166 lineno = pdr.lnLow;
2167 line_ptr = (ecoff_data (abfd)->line
2168 + fdr_ptr->cbLineOffset
2169 + pdr.cbLineOffset);
2170 while (line_ptr < line_end)
2171 {
2172 int delta;
2173 int count;
2174
2175 delta = *line_ptr >> 4;
2176 if (delta >= 0x8)
2177 delta -= 0x10;
2178 count = (*line_ptr & 0xf) + 1;
2179 ++line_ptr;
2180 if (delta == -8)
2181 {
2182 delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff);
2183 if (delta >= 0x8000)
2184 delta -= 0x10000;
2185 line_ptr += 2;
2186 }
2187 lineno += delta;
2188 if (offset < count * 4)
2189 break;
2190 offset -= count * 4;
2191 }
2192
2193 /* If fdr_ptr->rss is -1, then this file does not have full symbols,
2194 at least according to gdb/mipsread.c. */
2195 if (fdr_ptr->rss == -1)
2196 {
2197 *filename_ptr = NULL;
2198 if (pdr.isym == -1)
2199 *functionname_ptr = NULL;
2200 else
2201 {
2202 EXTR proc_ext;
2203
2204 ecoff_swap_ext_in (abfd,
2205 (ecoff_data (abfd)->external_ext
2206 + pdr.isym),
2207 &proc_ext);
2208 *functionname_ptr = ecoff_data (abfd)->ssext + proc_ext.asym.iss;
2209 }
2210 }
2211 else
2212 {
2213 SYMR proc_sym;
2214
2215 *filename_ptr = ecoff_data (abfd)->ss + fdr_ptr->issBase + fdr_ptr->rss;
2216 ecoff_swap_sym_in (abfd,
2217 (ecoff_data (abfd)->external_sym
2218 + fdr_ptr->isymBase
2219 + pdr.isym),
2220 &proc_sym);
2221 *functionname_ptr = (ecoff_data (abfd)->ss
2222 + fdr_ptr->issBase
2223 + proc_sym.iss);
2224 }
2225 *retline_ptr = lineno;
2226 return true;
2227 }
2228 \f
2229 /* We can't use the generic linking routines for ECOFF, because we
2230 have to handle all the debugging information. The generic link
2231 routine just works out the section contents and attaches a list of
2232 symbols.
2233
2234 We link by looping over all the seclets. We make two passes. On
2235 the first we set the actual section contents and determine the size
2236 of the debugging information. On the second we accumulate the
2237 debugging information and write it out.
2238
2239 This currently always accumulates the debugging information, which
2240 is incorrect, because it ignores the -s and -S options of the
2241 linker. The linker needs to be modified to give us that
2242 information in a more useful format (currently it just provides a
2243 list of symbols which should appear in the output file). */
2244
2245 /* Clear the output_has_begun flag for all the input BFD's. We use it
2246 to avoid linking in the debugging information for a BFD more than
2247 once. */
2248
2249 static void
2250 ecoff_clear_output_flags (abfd)
2251 bfd *abfd;
2252 {
2253 register asection *o;
2254 register bfd_seclet_type *p;
2255
2256 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
2257 for (p = o->seclets_head;
2258 p != (bfd_seclet_type *) NULL;
2259 p = p->next)
2260 if (p->type == bfd_indirect_seclet)
2261 p->u.indirect.section->owner->output_has_begun = false;
2262 }
2263
2264 /* Handle an indirect seclet on the first pass. Set the contents of
2265 the output section, and accumulate the debugging information if
2266 any. */
2267
2268 static boolean
2269 ecoff_rel (output_bfd, seclet, output_section, data, relocateable)
2270 bfd *output_bfd;
2271 bfd_seclet_type *seclet;
2272 asection *output_section;
2273 PTR data;
2274 boolean relocateable;
2275 {
2276 bfd *input_bfd;
2277 HDRR *output_symhdr;
2278 HDRR *input_symhdr;
2279
2280 if ((output_section->flags & SEC_HAS_CONTENTS)
2281 && !(output_section->flags & SEC_NEVER_LOAD)
2282 && (output_section->flags & SEC_LOAD)
2283 && seclet->size)
2284 {
2285 data = (PTR) bfd_get_relocated_section_contents (output_bfd,
2286 seclet,
2287 data,
2288 relocateable);
2289 if (bfd_set_section_contents (output_bfd,
2290 output_section,
2291 data,
2292 seclet->offset,
2293 seclet->size)
2294 == false)
2295 {
2296 abort();
2297 }
2298 }
2299
2300 input_bfd = seclet->u.indirect.section->owner;
2301
2302 /* We want to figure out how much space will be required to
2303 incorporate all the debugging information from input_bfd. We use
2304 the output_has_begun field to avoid adding it in more than once.
2305 The actual incorporation is done in the second pass, in
2306 ecoff_get_debug. The code has to parallel that code in its
2307 manipulations of output_symhdr. */
2308
2309 if (input_bfd->output_has_begun)
2310 return true;
2311 input_bfd->output_has_begun = true;
2312
2313 output_symhdr = &ecoff_data (output_bfd)->symbolic_header;
2314
2315 if (input_bfd->xvec->flavour != bfd_target_ecoff_flavour)
2316 {
2317 asymbol **symbols;
2318 asymbol **sym_ptr;
2319 asymbol **sym_end;
2320
2321 /* We just accumulate local symbols from a non-ECOFF BFD. The
2322 external symbols are handled separately. */
2323
2324 symbols = (asymbol **) bfd_alloc (output_bfd,
2325 get_symtab_upper_bound (input_bfd));
2326 if (symbols == (asymbol **) NULL)
2327 {
2328 bfd_error = no_memory;
2329 return false;
2330 }
2331 sym_end = symbols + bfd_canonicalize_symtab (input_bfd, symbols);
2332
2333 for (sym_ptr = symbols; sym_ptr < sym_end; sym_ptr++)
2334 {
2335 size_t len;
2336
2337 len = strlen ((*sym_ptr)->name);
2338 if (((*sym_ptr)->flags & BSF_EXPORT) == 0)
2339 {
2340 ++output_symhdr->isymMax;
2341 output_symhdr->issMax += len + 1;
2342 }
2343 }
2344
2345 bfd_release (output_bfd, (PTR) symbols);
2346
2347 ++output_symhdr->ifdMax;
2348
2349 return true;
2350 }
2351
2352 /* We simply add in the information from another ECOFF BFD. First
2353 we make sure we have the symbolic information. */
2354 if (ecoff_slurp_symbol_table (input_bfd) == false)
2355 return false;
2356 if (bfd_get_symcount (input_bfd) == 0)
2357 return true;
2358
2359 input_symhdr = &ecoff_data (input_bfd)->symbolic_header;
2360
2361 /* Figure out how much information we are going to be putting in.
2362 The external symbols are handled separately. */
2363 output_symhdr->ilineMax += input_symhdr->ilineMax;
2364 output_symhdr->cbLine += input_symhdr->cbLine;
2365 output_symhdr->idnMax += input_symhdr->idnMax;
2366 output_symhdr->ipdMax += input_symhdr->ipdMax;
2367 output_symhdr->isymMax += input_symhdr->isymMax;
2368 output_symhdr->ioptMax += input_symhdr->ioptMax;
2369 output_symhdr->iauxMax += input_symhdr->iauxMax;
2370 output_symhdr->issMax += input_symhdr->issMax;
2371 output_symhdr->ifdMax += input_symhdr->ifdMax;
2372
2373 /* The RFD's are special, since we create them if needed. */
2374 if (input_symhdr->crfd > 0)
2375 output_symhdr->crfd += input_symhdr->crfd;
2376 else
2377 output_symhdr->crfd += input_symhdr->ifdMax;
2378
2379 return true;
2380 }
2381
2382 /* Handle an arbitrary seclet on the first pass. */
2383
2384 static boolean
2385 ecoff_dump_seclet (abfd, seclet, section, data, relocateable)
2386 bfd *abfd;
2387 bfd_seclet_type *seclet;
2388 asection *section;
2389 PTR data;
2390 boolean relocateable;
2391 {
2392 switch (seclet->type)
2393 {
2394 case bfd_indirect_seclet:
2395 /* The contents of this section come from another one somewhere
2396 else. */
2397 return ecoff_rel (abfd, seclet, section, data, relocateable);
2398
2399 case bfd_fill_seclet:
2400 /* Fill in the section with fill.value. This is used to pad out
2401 sections, but we must avoid padding the .bss section. */
2402 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2403 {
2404 if (seclet->u.fill.value != 0)
2405 abort ();
2406 }
2407 else
2408 {
2409 char *d = (char *) bfd_alloc (abfd, seclet->size);
2410 unsigned int i;
2411 boolean ret;
2412
2413 for (i = 0; i < seclet->size; i+=2)
2414 d[i] = seclet->u.fill.value >> 8;
2415 for (i = 1; i < seclet->size; i+=2)
2416 d[i] = seclet->u.fill.value;
2417 ret = bfd_set_section_contents (abfd, section, d, seclet->offset,
2418 seclet->size);
2419 bfd_release (abfd, (PTR) d);
2420 return ret;
2421 }
2422 break;
2423
2424 default:
2425 abort();
2426 }
2427
2428 return true;
2429 }
2430
2431 /* Add a string to the debugging information we are accumulating for a
2432 file. Return the offset from the fdr string base or from the
2433 external string base. */
2434
2435 static long
2436 ecoff_add_string (output_bfd, fdr, string, external)
2437 bfd *output_bfd;
2438 FDR *fdr;
2439 CONST char *string;
2440 boolean external;
2441 {
2442 HDRR *symhdr;
2443 size_t len;
2444 long ret;
2445
2446 symhdr = &ecoff_data (output_bfd)->symbolic_header;
2447 len = strlen (string);
2448 if (external)
2449 {
2450 strcpy (ecoff_data (output_bfd)->ssext + symhdr->issExtMax, string);
2451 ret = symhdr->issExtMax;
2452 symhdr->issExtMax += len + 1;
2453 }
2454 else
2455 {
2456 strcpy (ecoff_data (output_bfd)->ss + symhdr->issMax, string);
2457 ret = fdr->cbSs;
2458 symhdr->issMax += len + 1;
2459 fdr->cbSs += len + 1;
2460 }
2461 return ret;
2462 }
2463
2464 /* Accumulate the debugging information from an input section. */
2465
2466 static boolean
2467 ecoff_get_debug (output_bfd, seclet, section, relocateable)
2468 bfd *output_bfd;
2469 bfd_seclet_type *seclet;
2470 asection *section;
2471 boolean relocateable;
2472 {
2473 bfd *input_bfd;
2474 HDRR *output_symhdr;
2475 HDRR *input_symhdr;
2476 ecoff_data_type *output_ecoff;
2477 ecoff_data_type *input_ecoff;
2478 unsigned int count;
2479 struct sym_ext *sym_out;
2480 ecoff_symbol_type *esym_ptr;
2481 ecoff_symbol_type *esym_end;
2482 FDR *fdr_ptr;
2483 FDR *fdr_end;
2484 struct fdr_ext *fdr_out;
2485
2486 input_bfd = seclet->u.indirect.section->owner;
2487
2488 /* Don't get the information more than once. */
2489 if (input_bfd->output_has_begun)
2490 return true;
2491 input_bfd->output_has_begun = true;
2492
2493 output_ecoff = ecoff_data (output_bfd);
2494 output_symhdr = &output_ecoff->symbolic_header;
2495
2496 if (input_bfd->xvec->flavour != bfd_target_ecoff_flavour)
2497 {
2498 FDR fdr;
2499 asymbol **symbols;
2500 asymbol **sym_ptr;
2501 asymbol **sym_end;
2502
2503 /* This is not an ECOFF BFD. Just gather the symbols. */
2504
2505 memset (&fdr, 0, sizeof fdr);
2506
2507 fdr.adr = bfd_get_section_vma (output_bfd, section) + seclet->offset;
2508 fdr.issBase = output_symhdr->issMax;
2509 fdr.cbSs = 0;
2510 fdr.rss = ecoff_add_string (output_bfd,
2511 &fdr,
2512 bfd_get_filename (input_bfd),
2513 false);
2514 fdr.isymBase = output_symhdr->isymMax;
2515
2516 /* Get the local symbols from the input BFD. */
2517 symbols = (asymbol **) bfd_alloc (output_bfd,
2518 get_symtab_upper_bound (input_bfd));
2519 if (symbols == (asymbol **) NULL)
2520 {
2521 bfd_error = no_memory;
2522 return false;
2523 }
2524 sym_end = symbols + bfd_canonicalize_symtab (input_bfd, symbols);
2525
2526 /* Handle the local symbols. Any external symbols are handled
2527 separately. */
2528 fdr.csym = 0;
2529 for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
2530 {
2531 SYMR internal_sym;
2532
2533 if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
2534 continue;
2535 memset (&internal_sym, 0, sizeof internal_sym);
2536 internal_sym.iss = ecoff_add_string (output_bfd,
2537 &fdr,
2538 (*sym_ptr)->name,
2539 false);
2540
2541 if (bfd_is_com_section ((*sym_ptr)->section)
2542 || (*sym_ptr)->section == &bfd_und_section)
2543 internal_sym.value = (*sym_ptr)->value;
2544 else
2545 internal_sym.value = ((*sym_ptr)->value
2546 + (*sym_ptr)->section->output_offset
2547 + (*sym_ptr)->section->output_section->vma);
2548 internal_sym.st = stNil;
2549 internal_sym.sc = scUndefined;
2550 internal_sym.index = indexNil;
2551 ecoff_swap_sym_out (output_bfd, &internal_sym,
2552 (output_ecoff->external_sym
2553 + output_symhdr->isymMax));
2554 ++fdr.csym;
2555 ++output_symhdr->isymMax;
2556 }
2557
2558 bfd_release (output_bfd, (PTR) symbols);
2559
2560 /* Leave everything else in the FDR zeroed out. This will cause
2561 the lang field to be langC. The fBigendian field will
2562 indicate little endian format, but it doesn't matter because
2563 it only applies to aux fields and there are none. */
2564
2565 ecoff_swap_fdr_out (output_bfd, &fdr,
2566 (output_ecoff->external_fdr
2567 + output_symhdr->ifdMax));
2568 ++output_symhdr->ifdMax;
2569 return true;
2570 }
2571
2572 /* This is an ECOFF BFD. We want to grab the information from
2573 input_bfd and attach it to output_bfd. */
2574 count = bfd_get_symcount (input_bfd);
2575 if (count == 0)
2576 return true;
2577 input_ecoff = ecoff_data (input_bfd);
2578 input_symhdr = &input_ecoff->symbolic_header;
2579
2580 /* I think that it is more efficient to simply copy the debugging
2581 information from the input BFD to the output BFD. Because ECOFF
2582 uses relative pointers for most of the debugging information,
2583 only a little of it has to be changed at all. */
2584
2585 /* Swap in the local symbols, adjust their values, and swap them out
2586 again. The external symbols are handled separately. */
2587 sym_out = output_ecoff->external_sym + output_symhdr->isymMax;
2588
2589 esym_ptr = ecoff_data (input_bfd)->canonical_symbols;
2590 esym_end = esym_ptr + count;
2591 for (; esym_ptr < esym_end; esym_ptr++)
2592 {
2593 if (esym_ptr->local)
2594 {
2595 SYMR sym;
2596
2597 ecoff_swap_sym_in (input_bfd, esym_ptr->native.lnative, &sym);
2598
2599 /* If we're producing an executable, move common symbols
2600 into bss. */
2601 if (relocateable == false)
2602 {
2603 if (sym.sc == scCommon)
2604 sym.sc = scBss;
2605 else if (sym.sc == scSCommon)
2606 sym.sc = scSBss;
2607 }
2608
2609 if (! bfd_is_com_section (esym_ptr->symbol.section)
2610 && (esym_ptr->symbol.flags & BSF_DEBUGGING) == 0
2611 && esym_ptr->symbol.section != &bfd_und_section)
2612 sym.value = (esym_ptr->symbol.value
2613 + esym_ptr->symbol.section->output_offset
2614 + esym_ptr->symbol.section->output_section->vma);
2615 ecoff_swap_sym_out (output_bfd, &sym, sym_out);
2616 ++sym_out;
2617 }
2618 }
2619
2620 /* That should have accounted for all the local symbols in
2621 input_bfd. */
2622 BFD_ASSERT ((sym_out - output_ecoff->external_sym) - output_symhdr->isymMax
2623 == input_symhdr->isymMax);
2624
2625 /* Copy the information that does not need swapping. */
2626 memcpy (output_ecoff->line + output_symhdr->cbLine,
2627 input_ecoff->line,
2628 input_symhdr->cbLine * sizeof (unsigned char));
2629 memcpy (output_ecoff->external_aux + output_symhdr->iauxMax,
2630 input_ecoff->external_aux,
2631 input_symhdr->iauxMax * sizeof (union aux_ext));
2632 memcpy (output_ecoff->ss + output_symhdr->issMax,
2633 input_ecoff->ss,
2634 input_symhdr->issMax * sizeof (char));
2635
2636 /* Some of the information may need to be swapped. */
2637 if (output_bfd->xvec->header_byteorder_big_p
2638 == input_bfd->xvec->header_byteorder_big_p)
2639 {
2640 /* The two BFD's have the same endianness, so memcpy will
2641 suffice. */
2642 memcpy (output_ecoff->external_dnr + output_symhdr->idnMax,
2643 input_ecoff->external_dnr,
2644 input_symhdr->idnMax * sizeof (struct dnr_ext));
2645 memcpy (output_ecoff->external_pdr + output_symhdr->ipdMax,
2646 input_ecoff->external_pdr,
2647 input_symhdr->ipdMax * sizeof (struct pdr_ext));
2648 memcpy (output_ecoff->external_opt + output_symhdr->ioptMax,
2649 input_ecoff->external_opt,
2650 input_symhdr->ioptMax * sizeof (struct opt_ext));
2651 }
2652 else
2653 {
2654 struct dnr_ext *dnr_in;
2655 struct dnr_ext *dnr_end;
2656 struct dnr_ext *dnr_out;
2657 struct pdr_ext *pdr_in;
2658 struct pdr_ext *pdr_end;
2659 struct pdr_ext *pdr_out;
2660 struct opt_ext *opt_in;
2661 struct opt_ext *opt_end;
2662 struct opt_ext *opt_out;
2663
2664 /* The two BFD's have different endianness, so we must swap
2665 everything in and out. This code would always work, but it
2666 would be slow in the normal case. */
2667 dnr_in = input_ecoff->external_dnr;
2668 dnr_end = dnr_in + input_symhdr->idnMax;
2669 dnr_out = output_ecoff->external_dnr + output_symhdr->idnMax;
2670 for (; dnr_in < dnr_end; dnr_in++, dnr_out++)
2671 {
2672 DNR dnr;
2673
2674 ecoff_swap_dnr_in (input_bfd, dnr_in, &dnr);
2675 ecoff_swap_dnr_out (output_bfd, &dnr, dnr_out);
2676 }
2677 pdr_in = input_ecoff->external_pdr;
2678 pdr_end = pdr_in + input_symhdr->ipdMax;
2679 pdr_out = output_ecoff->external_pdr + output_symhdr->ipdMax;
2680 for (; pdr_in < pdr_end; pdr_in++, pdr_out++)
2681 {
2682 PDR pdr;
2683
2684 ecoff_swap_pdr_in (input_bfd, pdr_in, &pdr);
2685 ecoff_swap_pdr_out (output_bfd, &pdr, pdr_out);
2686 }
2687 opt_in = input_ecoff->external_opt;
2688 opt_end = opt_in + input_symhdr->ioptMax;
2689 opt_out = output_ecoff->external_opt + output_symhdr->ioptMax;
2690 for (; opt_in < opt_end; opt_in++, opt_out++)
2691 {
2692 OPTR opt;
2693
2694 ecoff_swap_opt_in (input_bfd, opt_in, &opt);
2695 ecoff_swap_opt_out (output_bfd, &opt, opt_out);
2696 }
2697 }
2698
2699 /* Set ifdbase so that the external symbols know how to adjust their
2700 ifd values. */
2701 input_ecoff->ifdbase = output_symhdr->ifdMax;
2702
2703 fdr_ptr = input_ecoff->fdr;
2704 fdr_end = fdr_ptr + input_symhdr->ifdMax;
2705 fdr_out = output_ecoff->external_fdr + output_symhdr->ifdMax;
2706 for (; fdr_ptr < fdr_end; fdr_ptr++, fdr_out++)
2707 {
2708 FDR fdr;
2709
2710 fdr = *fdr_ptr;
2711
2712 /* The memory address for this fdr is the address for the seclet
2713 plus the offset to this fdr within input_bfd. */
2714 fdr.adr = (bfd_get_section_vma (output_bfd, section)
2715 + seclet->offset
2716 + (fdr_ptr->adr - input_ecoff->fdr->adr));
2717
2718 fdr.issBase += output_symhdr->issMax;
2719 fdr.isymBase += output_symhdr->isymMax;
2720 fdr.ilineBase += output_symhdr->ilineMax;
2721 fdr.ioptBase += output_symhdr->ioptMax;
2722 fdr.ipdFirst += output_symhdr->ipdMax;
2723 fdr.iauxBase += output_symhdr->iauxMax;
2724 fdr.rfdBase += output_symhdr->crfd;
2725
2726 /* If there are no RFD's, we are going to add some. We don't
2727 want to adjust irfd for this, so that all the FDR's can share
2728 the RFD's. */
2729 if (input_symhdr->crfd == 0)
2730 fdr.crfd = input_symhdr->ifdMax;
2731
2732 if (fdr.cbLine != 0)
2733 fdr.cbLineOffset += output_symhdr->cbLine;
2734
2735 ecoff_swap_fdr_out (output_bfd, &fdr, fdr_out);
2736 }
2737
2738 if (input_symhdr->crfd > 0)
2739 {
2740 struct rfd_ext *rfd_in;
2741 struct rfd_ext *rfd_end;
2742 struct rfd_ext *rfd_out;
2743
2744 /* Swap and adjust the RFD's. RFD's are only created by the
2745 linker, so this will only be necessary if one of the input
2746 files is the result of a partial link. Presumably all
2747 necessary RFD's are present. */
2748 rfd_in = input_ecoff->external_rfd;
2749 rfd_end = rfd_in + input_symhdr->crfd;
2750 rfd_out = output_ecoff->external_rfd + output_symhdr->crfd;
2751 for (; rfd_in < rfd_end; rfd_in++, rfd_out++)
2752 {
2753 RFDT rfd;
2754
2755 ecoff_swap_rfd_in (input_bfd, rfd_in, &rfd);
2756 rfd += output_symhdr->ifdMax;
2757 ecoff_swap_rfd_out (output_bfd, &rfd, rfd_out);
2758 }
2759 output_symhdr->crfd += input_symhdr->crfd;
2760 }
2761 else
2762 {
2763 struct rfd_ext *rfd_out;
2764 struct rfd_ext *rfd_end;
2765 RFDT rfd;
2766
2767 /* Create RFD's. Some of the debugging information includes
2768 relative file indices. These indices are taken as indices to
2769 the RFD table if there is one, or to the global table if
2770 there is not. If we did not create RFD's, we would have to
2771 parse and adjust all the debugging information which contains
2772 file indices. */
2773 rfd = output_symhdr->ifdMax;
2774 rfd_out = output_ecoff->external_rfd + output_symhdr->crfd;
2775 rfd_end = rfd_out + input_symhdr->ifdMax;
2776 for (; rfd_out < rfd_end; rfd_out++, rfd++)
2777 ecoff_swap_rfd_out (output_bfd, &rfd, rfd_out);
2778 output_symhdr->crfd += input_symhdr->ifdMax;
2779 }
2780
2781 /* Combine the register masks. */
2782 {
2783 int i;
2784
2785 output_ecoff->gprmask |= input_ecoff->gprmask;
2786 for (i = 0; i < 4; i++)
2787 output_ecoff->cprmask[i] |= input_ecoff->cprmask[i];
2788 }
2789
2790 /* Update the counts. */
2791 output_symhdr->ilineMax += input_symhdr->ilineMax;
2792 output_symhdr->cbLine += input_symhdr->cbLine;
2793 output_symhdr->idnMax += input_symhdr->idnMax;
2794 output_symhdr->ipdMax += input_symhdr->ipdMax;
2795 output_symhdr->isymMax += input_symhdr->isymMax;
2796 output_symhdr->ioptMax += input_symhdr->ioptMax;
2797 output_symhdr->iauxMax += input_symhdr->iauxMax;
2798 output_symhdr->issMax += input_symhdr->issMax;
2799 output_symhdr->ifdMax += input_symhdr->ifdMax;
2800
2801 return true;
2802 }
2803
2804 /* This is the actual link routine. It makes two passes over all the
2805 seclets. */
2806
2807 static boolean
2808 ecoff_bfd_seclet_link (abfd, data, relocateable)
2809 bfd *abfd;
2810 PTR data;
2811 boolean relocateable;
2812 {
2813 HDRR *symhdr;
2814 int ipass;
2815 register asection *o;
2816 register bfd_seclet_type *p;
2817 asymbol **sym_ptr_ptr;
2818 bfd_size_type size;
2819 char *raw;
2820
2821 /* We accumulate the debugging information counts in the symbolic
2822 header. */
2823 symhdr = &ecoff_data (abfd)->symbolic_header;
2824 symhdr->magic = magicSym;
2825 /* FIXME: What should the version stamp be? */
2826 symhdr->vstamp = 0;
2827 symhdr->ilineMax = 0;
2828 symhdr->cbLine = 0;
2829 symhdr->idnMax = 0;
2830 symhdr->ipdMax = 0;
2831 symhdr->isymMax = 0;
2832 symhdr->ioptMax = 0;
2833 symhdr->iauxMax = 0;
2834 symhdr->issMax = 0;
2835 symhdr->issExtMax = 0;
2836 symhdr->ifdMax = 0;
2837 symhdr->crfd = 0;
2838 symhdr->iextMax = 0;
2839
2840 /* We need to copy over the debugging symbols from each input BFD.
2841 When we do this copying, we have to adjust the text address in
2842 the FDR structures, so we have to know the text address used for
2843 the input BFD. Since we only want to copy the symbols once per
2844 input BFD, but we are going to look at each input BFD multiple
2845 times (once for each section it provides), we arrange to always
2846 look at the text section first. That means that when we copy the
2847 debugging information, we always know the text address. So we
2848 actually do each pass in two sub passes; first the text sections,
2849 then the non-text sections. We use the output_has_begun flag to
2850 determine whether we have copied over the debugging information
2851 yet. */
2852
2853 /* Do the first pass: set the output section contents and count the
2854 debugging information. */
2855 ecoff_clear_output_flags (abfd);
2856 for (ipass = 0; ipass < 2; ipass++)
2857 {
2858 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
2859 {
2860 /* For SEC_CODE sections, (flags & SEC_CODE) == 0 is false,
2861 so they are done on pass 0. For other sections the
2862 expression is true, so they are done on pass 1. */
2863 if (((o->flags & SEC_CODE) == 0) != ipass)
2864 continue;
2865
2866 for (p = o->seclets_head;
2867 p != (bfd_seclet_type *) NULL;
2868 p = p->next)
2869 {
2870 if (ecoff_dump_seclet (abfd, p, o, data, relocateable)
2871 == false)
2872 return false;
2873 }
2874 }
2875 }
2876
2877 /* We handle the external symbols differently. We use the ones
2878 attached to the output_bfd. The linker will have already
2879 determined which symbols are to be attached. Here we just
2880 determine how much space we will need for them. */
2881 sym_ptr_ptr = bfd_get_outsymbols (abfd);
2882 if (sym_ptr_ptr != NULL)
2883 {
2884 asymbol **sym_end;
2885
2886 sym_end = sym_ptr_ptr + bfd_get_symcount (abfd);
2887 for (; sym_ptr_ptr < sym_end; sym_ptr_ptr++)
2888 {
2889 if (((*sym_ptr_ptr)->flags & BSF_DEBUGGING) == 0
2890 && ((*sym_ptr_ptr)->flags & BSF_LOCAL) == 0)
2891 {
2892 ++symhdr->iextMax;
2893 symhdr->issExtMax += strlen ((*sym_ptr_ptr)->name) + 1;
2894 }
2895 }
2896 }
2897
2898 /* Adjust the counts so that structures are longword aligned. */
2899 symhdr->cbLine = (symhdr->cbLine + 3) &~ 3;
2900 symhdr->issMax = (symhdr->issMax + 3) &~ 3;
2901 symhdr->issExtMax = (symhdr->issExtMax + 3) &~ 3;
2902
2903 /* Now the counts in symhdr are the correct size for the debugging
2904 information. We allocate the right amount of space, and reset
2905 the counts so that the second pass can use them as indices. It
2906 would be possible to output the debugging information directly to
2907 the file in pass 2, rather than to build it in memory and then
2908 write it out. Outputting to the file would require a lot of
2909 seeks and small writes, though, and I think this approach is
2910 faster. */
2911 size = (symhdr->cbLine * sizeof (unsigned char)
2912 + symhdr->idnMax * sizeof (struct dnr_ext)
2913 + symhdr->ipdMax * sizeof (struct pdr_ext)
2914 + symhdr->isymMax * sizeof (struct sym_ext)
2915 + symhdr->ioptMax * sizeof (struct opt_ext)
2916 + symhdr->iauxMax * sizeof (union aux_ext)
2917 + symhdr->issMax * sizeof (char)
2918 + symhdr->issExtMax * sizeof (char)
2919 + symhdr->ifdMax * sizeof (struct fdr_ext)
2920 + symhdr->crfd * sizeof (struct rfd_ext)
2921 + symhdr->iextMax * sizeof (struct ext_ext));
2922 raw = (char *) bfd_alloc (abfd, size);
2923 if (raw == (char *) NULL)
2924 {
2925 bfd_error = no_memory;
2926 return false;
2927 }
2928 ecoff_data (abfd)->raw_size = size;
2929 ecoff_data (abfd)->raw_syments = (PTR) raw;
2930
2931 /* Initialize the raw pointers. */
2932 #define SET(field, count, type) \
2933 ecoff_data (abfd)->field = (type *) raw; \
2934 raw += symhdr->count * sizeof (type)
2935
2936 SET (line, cbLine, unsigned char);
2937 SET (external_dnr, idnMax, struct dnr_ext);
2938 SET (external_pdr, ipdMax, struct pdr_ext);
2939 SET (external_sym, isymMax, struct sym_ext);
2940 SET (external_opt, ioptMax, struct opt_ext);
2941 SET (external_aux, iauxMax, union aux_ext);
2942 SET (ss, issMax, char);
2943 SET (ssext, issExtMax, char);
2944 SET (external_fdr, ifdMax, struct fdr_ext);
2945 SET (external_rfd, crfd, struct rfd_ext);
2946 SET (external_ext, iextMax, struct ext_ext);
2947 #undef SET
2948
2949 /* Reset the counts so the second pass can use them to know how far
2950 it has gotten. */
2951 symhdr->ilineMax = 0;
2952 symhdr->cbLine = 0;
2953 symhdr->idnMax = 0;
2954 symhdr->ipdMax = 0;
2955 symhdr->isymMax = 0;
2956 symhdr->ioptMax = 0;
2957 symhdr->iauxMax = 0;
2958 symhdr->issMax = 0;
2959 symhdr->issExtMax = 0;
2960 symhdr->ifdMax = 0;
2961 symhdr->crfd = 0;
2962 symhdr->iextMax = 0;
2963
2964 /* Do the second pass: accumulate the debugging information. */
2965 ecoff_clear_output_flags (abfd);
2966 for (ipass = 0; ipass < 2; ipass++)
2967 {
2968 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
2969 {
2970 if (((o->flags & SEC_CODE) == 0) != ipass)
2971 continue;
2972 for (p = o->seclets_head;
2973 p != (bfd_seclet_type *) NULL;
2974 p = p->next)
2975 {
2976 if (p->type == bfd_indirect_seclet)
2977 {
2978 if (ecoff_get_debug (abfd, p, o, relocateable) == false)
2979 return false;
2980 }
2981 }
2982 }
2983 }
2984
2985 /* Put in the external symbols. */
2986 sym_ptr_ptr = bfd_get_outsymbols (abfd);
2987 if (sym_ptr_ptr != NULL)
2988 {
2989 char *ssext;
2990 struct ext_ext *external_ext;
2991
2992 ssext = ecoff_data (abfd)->ssext;
2993 external_ext = ecoff_data (abfd)->external_ext;
2994 for (; *sym_ptr_ptr != NULL; sym_ptr_ptr++)
2995 {
2996 asymbol *sym_ptr;
2997 EXTR esym;
2998
2999 sym_ptr = *sym_ptr_ptr;
3000
3001 if ((sym_ptr->flags & BSF_DEBUGGING) != 0
3002 || (sym_ptr->flags & BSF_LOCAL) != 0)
3003 continue;
3004
3005 /* The enative pointer can be NULL for a symbol created by
3006 the linker via ecoff_make_empty_symbol. */
3007 if (bfd_asymbol_flavour (sym_ptr) != bfd_target_ecoff_flavour
3008 || (((ecoff_symbol_type *) sym_ptr)->native.enative
3009 == (struct ext_ext *) NULL))
3010 {
3011 esym.jmptbl = 0;
3012 esym.cobol_main = 0;
3013 esym.weakext = 0;
3014 esym.reserved = 0;
3015 esym.ifd = ifdNil;
3016 /* FIXME: we can do better than this for st and sc. */
3017 esym.asym.st = stGlobal;
3018 esym.asym.sc = scAbs;
3019 esym.asym.reserved = 0;
3020 esym.asym.index = indexNil;
3021 }
3022 else
3023 {
3024 ecoff_symbol_type *ecoff_sym_ptr;
3025
3026 ecoff_sym_ptr = (ecoff_symbol_type *) sym_ptr;
3027 if (ecoff_sym_ptr->local)
3028 abort ();
3029 ecoff_swap_ext_in (abfd, ecoff_sym_ptr->native.enative, &esym);
3030
3031 /* If we're producing an executable, move common symbols
3032 into bss. */
3033 if (relocateable == false)
3034 {
3035 if (esym.asym.sc == scCommon)
3036 esym.asym.sc = scBss;
3037 else if (esym.asym.sc == scSCommon)
3038 esym.asym.sc = scSBss;
3039 }
3040
3041 /* Adjust the FDR index for the symbol by that used for
3042 the input BFD. */
3043 esym.ifd += ecoff_data (bfd_asymbol_bfd (sym_ptr))->ifdbase;
3044 }
3045
3046 esym.asym.iss = symhdr->issExtMax;
3047
3048 if (bfd_is_com_section (sym_ptr->section)
3049 || sym_ptr->section == &bfd_und_section)
3050 esym.asym.value = sym_ptr->value;
3051 else
3052 esym.asym.value = (sym_ptr->value
3053 + sym_ptr->section->output_offset
3054 + sym_ptr->section->output_section->vma);
3055
3056 ecoff_swap_ext_out (abfd, &esym, external_ext + symhdr->iextMax);
3057
3058 ecoff_set_sym_index (sym_ptr, symhdr->iextMax);
3059
3060 ++symhdr->iextMax;
3061
3062 strcpy (ssext + symhdr->issExtMax, sym_ptr->name);
3063 symhdr->issExtMax += strlen (sym_ptr->name) + 1;
3064 }
3065 }
3066
3067 /* Adjust the counts so that structures are longword aligned. */
3068 symhdr->cbLine = (symhdr->cbLine + 3) &~ 3;
3069 symhdr->issMax = (symhdr->issMax + 3) &~ 3;
3070 symhdr->issExtMax = (symhdr->issExtMax + 3) &~ 3;
3071
3072 return true;
3073 }
3074 \f
3075 /* Set the architecture. The only architecture we support here is
3076 mips. We set the architecture anyhow, since many callers ignore
3077 the return value. */
3078
3079 static boolean
3080 ecoff_set_arch_mach (abfd, arch, machine)
3081 bfd *abfd;
3082 enum bfd_architecture arch;
3083 unsigned long machine;
3084 {
3085 bfd_default_set_arch_mach (abfd, arch, machine);
3086 return arch == bfd_arch_mips;
3087 }
3088
3089 /* Get the size of the section headers. We do not output the .scommon
3090 section which we created in ecoff_mkobject. */
3091
3092 static int
3093 ecoff_sizeof_headers (abfd, reloc)
3094 bfd *abfd;
3095 boolean reloc;
3096 {
3097 return FILHSZ + AOUTSZ + (abfd->section_count - 1) * SCNHSZ;
3098 }
3099
3100 /* Calculate the file position for each section, and set
3101 reloc_filepos. */
3102
3103 static void
3104 ecoff_compute_section_file_positions (abfd)
3105 bfd *abfd;
3106 {
3107 asection *current;
3108 file_ptr sofar;
3109 file_ptr old_sofar;
3110 boolean first_data;
3111
3112 if (bfd_get_start_address (abfd))
3113 abfd->flags |= EXEC_P;
3114
3115 sofar = ecoff_sizeof_headers (abfd, false);
3116
3117 first_data = true;
3118 for (current = abfd->sections;
3119 current != (asection *) NULL;
3120 current = current->next)
3121 {
3122 /* Only deal with sections which have contents */
3123 if (! (current->flags & SEC_HAS_CONTENTS)
3124 || strcmp (current->name, SCOMMON) == 0)
3125 continue;
3126
3127 /* On Ultrix, the data sections in an executable file must be
3128 aligned to a page boundary within the file. This does not
3129 affect the section size, though. FIXME: Does this work for
3130 other platforms? */
3131 if ((abfd->flags & EXEC_P) != 0
3132 && first_data != false
3133 && (current->flags & SEC_CODE) == 0)
3134 {
3135 sofar = (sofar + PAGE_SIZE - 1) &~ (PAGE_SIZE - 1);
3136 first_data = false;
3137 }
3138
3139 /* Align the sections in the file to the same boundary on
3140 which they are aligned in virtual memory. */
3141 old_sofar = sofar;
3142 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3143
3144 current->filepos = sofar;
3145
3146 sofar += current->_raw_size;
3147
3148 /* make sure that this section is of the right size too */
3149 old_sofar = sofar;
3150 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3151 current->_raw_size += sofar - old_sofar;
3152 }
3153
3154 ecoff_data (abfd)->reloc_filepos = sofar;
3155 }
3156
3157 /* Set the contents of a section. */
3158
3159 static boolean
3160 ecoff_set_section_contents (abfd, section, location, offset, count)
3161 bfd *abfd;
3162 asection *section;
3163 PTR location;
3164 file_ptr offset;
3165 bfd_size_type count;
3166 {
3167 if (abfd->output_has_begun == false)
3168 ecoff_compute_section_file_positions (abfd);
3169
3170 bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET);
3171
3172 if (count != 0)
3173 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3174
3175 return true;
3176 }
3177
3178 /* Write out an ECOFF file. */
3179
3180 static boolean
3181 ecoff_write_object_contents (abfd)
3182 bfd *abfd;
3183 {
3184 asection *current;
3185 unsigned int count;
3186 file_ptr scn_base;
3187 file_ptr reloc_base;
3188 file_ptr sym_base;
3189 unsigned long reloc_size;
3190 unsigned long text_size;
3191 unsigned long text_start;
3192 unsigned long data_size;
3193 unsigned long data_start;
3194 unsigned long bss_size;
3195 struct internal_filehdr internal_f;
3196 struct internal_aouthdr internal_a;
3197 int i;
3198
3199 bfd_error = system_call_error;
3200
3201 if(abfd->output_has_begun == false)
3202 ecoff_compute_section_file_positions(abfd);
3203
3204 if (abfd->sections != (asection *) NULL)
3205 scn_base = abfd->sections->filepos;
3206 else
3207 scn_base = 0;
3208 reloc_base = ecoff_data (abfd)->reloc_filepos;
3209
3210 count = 1;
3211 reloc_size = 0;
3212 for (current = abfd->sections;
3213 current != (asection *)NULL;
3214 current = current->next)
3215 {
3216 if (strcmp (current->name, SCOMMON) == 0)
3217 continue;
3218 current->target_index = count;
3219 ++count;
3220 if (current->reloc_count != 0)
3221 {
3222 bfd_size_type relsize;
3223
3224 current->rel_filepos = reloc_base;
3225 relsize = current->reloc_count * RELSZ;
3226 reloc_size += relsize;
3227 reloc_base += relsize;
3228 }
3229 else
3230 current->rel_filepos = 0;
3231 }
3232
3233 sym_base = reloc_base + reloc_size;
3234
3235 /* At least on Ultrix, the symbol table of an executable file must
3236 be aligned to a page boundary. FIXME: Is this true on other
3237 platforms? */
3238 if ((abfd->flags & EXEC_P) != 0)
3239 sym_base = (sym_base + PAGE_SIZE - 1) &~ (PAGE_SIZE - 1);
3240
3241 ecoff_data (abfd)->sym_filepos = sym_base;
3242
3243 text_size = ecoff_sizeof_headers (abfd, false);
3244 text_start = 0;
3245 data_size = 0;
3246 data_start = 0;
3247 bss_size = 0;
3248
3249 /* Write section headers to the file. */
3250
3251 internal_f.f_nscns = 0;
3252 if (bfd_seek (abfd, (file_ptr) (FILHSZ + AOUTSZ), SEEK_SET) != 0)
3253 return false;
3254 for (current = abfd->sections;
3255 current != (asection *) NULL;
3256 current = current->next)
3257 {
3258 struct internal_scnhdr section;
3259 bfd_vma vma;
3260
3261 if (strcmp (current->name, SCOMMON) == 0)
3262 {
3263 BFD_ASSERT (bfd_get_section_size_before_reloc (current) == 0
3264 && current->reloc_count == 0);
3265 continue;
3266 }
3267
3268 ++internal_f.f_nscns;
3269
3270 strncpy (section.s_name, current->name, sizeof section.s_name);
3271
3272 /* FIXME: is this correct for shared libraries? I think it is
3273 but I have no platform to check. Ian Lance Taylor. */
3274 vma = bfd_get_section_vma (abfd, current);
3275 if (strcmp (current->name, _LIB) == 0)
3276 section.s_vaddr = 0;
3277 else
3278 section.s_vaddr = vma;
3279
3280 section.s_paddr = vma;
3281 section.s_size = bfd_get_section_size_before_reloc (current);
3282
3283 /* If this section has no size or is unloadable then the scnptr
3284 will be 0 too. */
3285 if (current->_raw_size == 0
3286 || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3287 section.s_scnptr = 0;
3288 else
3289 section.s_scnptr = current->filepos;
3290 section.s_relptr = current->rel_filepos;
3291
3292 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
3293 object file produced by the assembler is supposed to point to
3294 information about how much room is required by objects of
3295 various different sizes. I think this only matters if we
3296 want the linker to compute the best size to use, or
3297 something. I don't know what happens if the information is
3298 not present. */
3299 section.s_lnnoptr = 0;
3300
3301 section.s_nreloc = current->reloc_count;
3302 section.s_nlnno = 0;
3303 section.s_flags = ecoff_sec_to_styp_flags (current->name,
3304 current->flags);
3305
3306 {
3307 SCNHDR buff;
3308
3309 ecoff_swap_scnhdr_out (abfd, (PTR) &section, (PTR) &buff);
3310 if (bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ)
3311 return false;
3312 }
3313
3314 if ((section.s_flags & STYP_TEXT) != 0)
3315 {
3316 text_size += bfd_get_section_size_before_reloc (current);
3317 if (text_start == 0 || text_start > vma)
3318 text_start = vma;
3319 }
3320 else if ((section.s_flags & STYP_RDATA) != 0
3321 || (section.s_flags & STYP_DATA) != 0
3322 || (section.s_flags & STYP_LIT8) != 0
3323 || (section.s_flags & STYP_LIT4) != 0
3324 || (section.s_flags & STYP_SDATA) != 0)
3325 {
3326 data_size += bfd_get_section_size_before_reloc (current);
3327 if (data_start == 0 || data_start > vma)
3328 data_start = vma;
3329 }
3330 else if ((section.s_flags & STYP_BSS) != 0
3331 || (section.s_flags & STYP_SBSS) != 0)
3332 bss_size += bfd_get_section_size_before_reloc (current);
3333 }
3334
3335 /* Set up the file header. */
3336
3337 if (abfd->xvec->header_byteorder_big_p != false)
3338 internal_f.f_magic = MIPS_MAGIC_BIG;
3339 else
3340 internal_f.f_magic = MIPS_MAGIC_LITTLE;
3341
3342 /*
3343 We will NOT put a fucking timestamp in the header here. Every time you
3344 put it back, I will come in and take it out again. I'm sorry. This
3345 field does not belong here. We fill it with a 0 so it compares the
3346 same but is not a reasonable time. -- gnu@cygnus.com
3347 */
3348 internal_f.f_timdat = 0;
3349
3350 if (bfd_get_symcount (abfd) != 0)
3351 {
3352 /* The ECOFF f_nsyms field is not actually the number of
3353 symbols, it's the size of symbolic information header. */
3354 internal_f.f_nsyms = sizeof (struct hdr_ext);
3355 internal_f.f_symptr = sym_base;
3356 }
3357 else
3358 {
3359 internal_f.f_nsyms = 0;
3360 internal_f.f_symptr = 0;
3361 }
3362
3363 internal_f.f_opthdr = AOUTSZ;
3364
3365 internal_f.f_flags = F_LNNO;
3366 if (reloc_size == 0)
3367 internal_f.f_flags |= F_RELFLG;
3368 if (bfd_get_symcount (abfd) == 0)
3369 internal_f.f_flags |= F_LSYMS;
3370 if (abfd->flags & EXEC_P)
3371 internal_f.f_flags |= F_EXEC;
3372
3373 if (! abfd->xvec->byteorder_big_p)
3374 internal_f.f_flags |= F_AR32WR;
3375 else
3376 internal_f.f_flags |= F_AR32W;
3377
3378 /* Set up the ``optional'' header. */
3379 internal_a.magic = ZMAGIC;
3380
3381 /* FIXME: This is what Ultrix puts in, and it makes the Ultrix
3382 linker happy. But, is it right? */
3383 internal_a.vstamp = 0x20a;
3384
3385 /* At least on Ultrix, these have to be rounded to page boundaries.
3386 FIXME: Is this true on other platforms? */
3387 internal_a.tsize = (text_size + PAGE_SIZE - 1) &~ (PAGE_SIZE - 1);
3388 internal_a.text_start = text_start &~ (PAGE_SIZE - 1);
3389 internal_a.dsize = (data_size + PAGE_SIZE - 1) &~ (PAGE_SIZE - 1);
3390 internal_a.data_start = data_start &~ (PAGE_SIZE - 1);
3391
3392 /* On Ultrix, the initial portions of the .sbss and .bss segments
3393 are at the end of the data section. The bsize field in the
3394 optional header records how many bss bytes are required beyond
3395 those in the data section. The value is not rounded to a page
3396 boundary. */
3397 if (bss_size < internal_a.dsize - data_size)
3398 bss_size = 0;
3399 else
3400 bss_size -= internal_a.dsize - data_size;
3401 internal_a.bsize = bss_size;
3402 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
3403
3404 internal_a.entry = bfd_get_start_address (abfd);
3405
3406 internal_a.gp_value = ecoff_data (abfd)->gp;
3407
3408 internal_a.gprmask = ecoff_data (abfd)->gprmask;
3409 for (i = 0; i < 4; i++)
3410 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
3411
3412 /* Write out the file header and the optional header. */
3413
3414 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3415 return false;
3416
3417 {
3418 FILHDR buff;
3419 ecoff_swap_filehdr_out (abfd, (PTR) &internal_f, (PTR) &buff);
3420 if (bfd_write ((PTR) &buff, 1, FILHSZ, abfd) != FILHSZ)
3421 return false;
3422 }
3423
3424 {
3425 AOUTHDR buff;
3426
3427 ecoff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3428 if (bfd_write ((PTR) &buff, 1, AOUTSZ, abfd) != AOUTSZ)
3429 return false;
3430 }
3431
3432 /* Write out the relocs. */
3433 for (current = abfd->sections;
3434 current != (asection *) NULL;
3435 current = current->next)
3436 {
3437 RELOC *buff;
3438 arelent **reloc_ptr_ptr;
3439 arelent **reloc_end;
3440 RELOC *out_ptr;
3441
3442 if (current->reloc_count == 0)
3443 continue;
3444
3445 buff = (RELOC *) bfd_alloc (abfd, current->reloc_count * RELSZ);
3446 if (buff == (RELOC *) NULL)
3447 {
3448 bfd_error = no_memory;
3449 return false;
3450 }
3451
3452 reloc_ptr_ptr = current->orelocation;
3453 reloc_end = reloc_ptr_ptr + current->reloc_count;
3454 out_ptr = buff;
3455 for (; reloc_ptr_ptr < reloc_end; reloc_ptr_ptr++, out_ptr++)
3456 {
3457 arelent *reloc;
3458 asymbol *sym;
3459 struct internal_reloc in;
3460
3461 memset (&in, 0, sizeof in);
3462
3463 reloc = *reloc_ptr_ptr;
3464 sym = *reloc->sym_ptr_ptr;
3465
3466 in.r_vaddr = reloc->address + bfd_get_section_vma (abfd, current);
3467 in.r_type = reloc->howto->type;
3468 if ((sym->flags & BSF_SECTION_SYM) == 0)
3469 {
3470 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
3471 in.r_extern = 1;
3472 }
3473 else
3474 {
3475 CONST char *name;
3476
3477 name = bfd_get_section_name (abfd, bfd_get_section (sym));
3478 if (strcmp (name, ".text") == 0)
3479 in.r_symndx = RELOC_SECTION_TEXT;
3480 else if (strcmp (name, ".rdata") == 0)
3481 in.r_symndx = RELOC_SECTION_RDATA;
3482 else if (strcmp (name, ".data") == 0)
3483 in.r_symndx = RELOC_SECTION_DATA;
3484 else if (strcmp (name, ".sdata") == 0)
3485 in.r_symndx = RELOC_SECTION_SDATA;
3486 else if (strcmp (name, ".sbss") == 0)
3487 in.r_symndx = RELOC_SECTION_SBSS;
3488 else if (strcmp (name, ".bss") == 0)
3489 in.r_symndx = RELOC_SECTION_BSS;
3490 else if (strcmp (name, ".init") == 0)
3491 in.r_symndx = RELOC_SECTION_INIT;
3492 else if (strcmp (name, ".lit8") == 0)
3493 in.r_symndx = RELOC_SECTION_LIT8;
3494 else if (strcmp (name, ".lit4") == 0)
3495 in.r_symndx = RELOC_SECTION_LIT4;
3496 else
3497 abort ();
3498 in.r_extern = 0;
3499 }
3500
3501 ecoff_swap_reloc_out (abfd, (PTR) &in, (PTR) out_ptr);
3502 }
3503
3504 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
3505 return false;
3506 if (bfd_write ((PTR) buff, RELSZ, current->reloc_count, abfd)
3507 != RELSZ * current->reloc_count)
3508 return false;
3509 bfd_release (abfd, (PTR) buff);
3510 }
3511
3512 /* Write out the symbolic debugging information. */
3513 if (bfd_get_symcount (abfd) > 0)
3514 {
3515 HDRR *symhdr;
3516 unsigned long sym_offset;
3517 struct hdr_ext buff;
3518
3519 /* Set up the offsets in the symbolic header. */
3520 symhdr = &ecoff_data (abfd)->symbolic_header;
3521 sym_offset = ecoff_data (abfd)->sym_filepos + sizeof (struct hdr_ext);
3522
3523 #define SET(offset, size, ptr) \
3524 if (symhdr->size == 0) \
3525 symhdr->offset = 0; \
3526 else \
3527 symhdr->offset = (((char *) ecoff_data (abfd)->ptr \
3528 - (char *) ecoff_data (abfd)->raw_syments) \
3529 + sym_offset);
3530
3531 SET (cbLineOffset, cbLine, line);
3532 SET (cbDnOffset, idnMax, external_dnr);
3533 SET (cbPdOffset, ipdMax, external_pdr);
3534 SET (cbSymOffset, isymMax, external_sym);
3535 SET (cbOptOffset, ioptMax, external_opt);
3536 SET (cbAuxOffset, iauxMax, external_aux);
3537 SET (cbSsOffset, issMax, ss);
3538 SET (cbSsExtOffset, issExtMax, ssext);
3539 SET (cbFdOffset, ifdMax, external_fdr);
3540 SET (cbRfdOffset, crfd, external_rfd);
3541 SET (cbExtOffset, iextMax, external_ext);
3542 #undef SET
3543
3544 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos,
3545 SEEK_SET) != 0)
3546 return false;
3547 ecoff_swap_hdr_out (abfd, &ecoff_data (abfd)->symbolic_header, &buff);
3548 if (bfd_write ((PTR) &buff, 1, sizeof buff, abfd) != sizeof buff)
3549 return false;
3550 if (bfd_write ((PTR) ecoff_data (abfd)->raw_syments, 1,
3551 ecoff_data (abfd)->raw_size, abfd)
3552 != ecoff_data (abfd)->raw_size)
3553 return false;
3554 }
3555
3556 return true;
3557 }
3558 \f
3559 /* Archive handling. ECOFF uses what appears to be a unique type of
3560 archive header (which I call an armap). The byte ordering of the
3561 armap and the contents are encoded in the name of the armap itself.
3562 At least for now, we only support archives with the same byte
3563 ordering in the armap and the contents.
3564
3565 The first four bytes in the armap are the number of symbol
3566 definitions. This is always a power of two.
3567
3568 This is followed by the symbol definitions. Each symbol definition
3569 occupies 8 bytes. The first four bytes are the offset from the
3570 start of the armap strings to the null-terminated string naming
3571 this symbol. The second four bytes are the file offset to the
3572 archive member which defines this symbol. If the second four bytes
3573 are 0, then this is not actually a symbol definition, and it should
3574 be ignored.
3575
3576 The symbols are hashed into the armap with a closed hashing scheme.
3577 See the functions below for the details of the algorithm.
3578
3579 We could use the hash table when looking up symbols in a library.
3580 This would require a new BFD target entry point to replace the
3581 bfd_get_next_mapent function used by the linker.
3582
3583 After the symbol definitions comes four bytes holding the size of
3584 the string table, followed by the string table itself. */
3585
3586 /* The name of an archive headers looks like this:
3587 __________E[BL]E[BL]_ (with a trailing space).
3588 The trailing space is changed to an X if the archive is changed to
3589 indicate that the armap is out of date. */
3590
3591 #define ARMAP_BIG_ENDIAN 'B'
3592 #define ARMAP_LITTLE_ENDIAN 'L'
3593 #define ARMAP_MARKER 'E'
3594 #define ARMAP_START "__________"
3595 #define ARMAP_HEADER_MARKER_INDEX 10
3596 #define ARMAP_HEADER_ENDIAN_INDEX 11
3597 #define ARMAP_OBJECT_MARKER_INDEX 12
3598 #define ARMAP_OBJECT_ENDIAN_INDEX 13
3599 #define ARMAP_END_INDEX 14
3600 #define ARMAP_END "_ "
3601
3602 /* This is a magic number used in the hashing algorithm. */
3603 #define ARMAP_HASH_MAGIC 0x9dd68ab5
3604
3605 /* This returns the hash value to use for a string. It also sets
3606 *REHASH to the rehash adjustment if the first slot is taken. SIZE
3607 is the number of entries in the hash table, and HLOG is the log
3608 base 2 of SIZE. */
3609
3610 static unsigned int
3611 ecoff_armap_hash (s, rehash, size, hlog)
3612 CONST char *s;
3613 unsigned int *rehash;
3614 unsigned int size;
3615 unsigned int hlog;
3616 {
3617 unsigned int hash;
3618
3619 hash = *s++;
3620 while (*s != '\0')
3621 hash = ((hash >> 27) | (hash << 5)) + *s++;
3622 hash *= ARMAP_HASH_MAGIC;
3623 *rehash = (hash & (size - 1)) | 1;
3624 return hash >> (32 - hlog);
3625 }
3626
3627 /* Read in the armap. */
3628
3629 static boolean
3630 ecoff_slurp_armap (abfd)
3631 bfd *abfd;
3632 {
3633 char nextname[17];
3634 unsigned int i;
3635 struct areltdata *mapdata;
3636 bfd_size_type parsed_size;
3637 char *raw_armap;
3638 struct artdata *ardata;
3639 unsigned int count;
3640 char *raw_ptr;
3641 struct symdef *symdef_ptr;
3642 char *stringbase;
3643
3644 /* Get the name of the first element. */
3645 i = bfd_read ((PTR) nextname, 1, 16, abfd);
3646 if (i == 0)
3647 return true;
3648 if (i != 16)
3649 return false;
3650
3651 bfd_seek (abfd, (file_ptr) -16, SEEK_CUR);
3652
3653 /* See if the first element is an armap. */
3654 if (strncmp (nextname, ARMAP_START, sizeof ARMAP_START - 1) != 0
3655 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
3656 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3657 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3658 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
3659 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3660 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3661 || strncmp (nextname + ARMAP_END_INDEX,
3662 ARMAP_END, sizeof ARMAP_END - 1) != 0)
3663 {
3664 bfd_has_map (abfd) = false;
3665 return true;
3666 }
3667
3668 /* Make sure we have the right byte ordering. */
3669 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3670 ^ (abfd->xvec->header_byteorder_big_p != false))
3671 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3672 ^ (abfd->xvec->byteorder_big_p != false)))
3673 {
3674 bfd_error = wrong_format;
3675 return false;
3676 }
3677
3678 /* Read in the armap. */
3679 ardata = bfd_ardata (abfd);
3680 mapdata = snarf_ar_hdr (abfd);
3681 if (mapdata == (struct areltdata *) NULL)
3682 return false;
3683 parsed_size = mapdata->parsed_size;
3684 bfd_release (abfd, (PTR) mapdata);
3685
3686 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
3687 if (raw_armap == (char *) NULL)
3688 {
3689 bfd_error = no_memory;
3690 return false;
3691 }
3692
3693 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
3694 {
3695 bfd_error = malformed_archive;
3696 bfd_release (abfd, (PTR) raw_armap);
3697 return false;
3698 }
3699
3700 count = bfd_h_get_32 (abfd, (PTR) raw_armap);
3701
3702 ardata->symdef_count = 0;
3703 ardata->cache = (struct ar_cache *) NULL;
3704
3705 /* Hack: overlay the symdefs on top of the raw archive data. This
3706 is the way do_slurp_bsd_armap works. */
3707 raw_ptr = raw_armap + LONG_SIZE;
3708 symdef_ptr = (struct symdef *) raw_ptr;
3709 ardata->symdefs = (carsym *) symdef_ptr;
3710 stringbase = raw_ptr + count * (2 * LONG_SIZE) + LONG_SIZE;
3711
3712 #ifdef CHECK_ARMAP_HASH
3713 {
3714 unsigned int hlog;
3715
3716 /* Double check that I have the hashing algorithm right by making
3717 sure that every symbol can be looked up successfully. */
3718 hlog = 0;
3719 for (i = 1; i < count; i <<= 1)
3720 hlog++;
3721 BFD_ASSERT (i == count);
3722
3723 for (i = 0; i < count; i++, raw_ptr += 2 * LONG_SIZE)
3724 {
3725 unsigned int name_offset, file_offset;
3726 unsigned int hash, rehash, srch;
3727
3728 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3729 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + LONG_SIZE));
3730 if (file_offset == 0)
3731 continue;
3732 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
3733 hlog);
3734 if (hash == i)
3735 continue;
3736
3737 /* See if we can rehash to this location. */
3738 for (srch = (hash + rehash) & (count - 1);
3739 srch != hash && srch != i;
3740 srch = (srch + rehash) & (count - 1))
3741 BFD_ASSERT (bfd_h_get_32 (abfd,
3742 (PTR) (raw_armap
3743 + LONG_SIZE
3744 + (srch * 2 * LONG_SIZE)
3745 + LONG_SIZE))
3746 != 0);
3747 BFD_ASSERT (srch == i);
3748 }
3749 }
3750
3751 raw_ptr = raw_armap + LONG_SIZE;
3752 #endif /* CHECK_ARMAP_HASH */
3753
3754 for (i = 0; i < count; i++, raw_ptr += 2 * LONG_SIZE)
3755 {
3756 unsigned int name_offset, file_offset;
3757
3758 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3759 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + LONG_SIZE));
3760 if (file_offset == 0)
3761 continue;
3762 symdef_ptr->s.name = stringbase + name_offset;
3763 symdef_ptr->file_offset = file_offset;
3764 ++symdef_ptr;
3765 ++ardata->symdef_count;
3766 }
3767
3768 ardata->first_file_filepos = bfd_tell (abfd);
3769 /* Pad to an even boundary. */
3770 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3771
3772 bfd_has_map (abfd) = true;
3773
3774 return true;
3775 }
3776
3777 /* Write out an armap. */
3778
3779 static boolean
3780 ecoff_write_armap (abfd, elength, map, orl_count, stridx)
3781 bfd *abfd;
3782 unsigned int elength;
3783 struct orl *map;
3784 unsigned int orl_count;
3785 int stridx;
3786 {
3787 unsigned int hashsize, hashlog;
3788 unsigned int symdefsize;
3789 int padit;
3790 unsigned int stringsize;
3791 unsigned int mapsize;
3792 file_ptr firstreal;
3793 struct ar_hdr hdr;
3794 struct stat statbuf;
3795 unsigned int i;
3796 bfd_byte temp[LONG_SIZE];
3797 bfd_byte *hashtable;
3798 bfd *current;
3799 bfd *last_elt;
3800
3801 /* Ultrix appears to use as a hash table size the least power of two
3802 greater than twice the number of entries. */
3803 for (hashlog = 0; (1 << hashlog) <= 2 * orl_count; hashlog++)
3804 ;
3805 hashsize = 1 << hashlog;
3806
3807 symdefsize = hashsize * 2 * LONG_SIZE;
3808 padit = stridx % 2;
3809 stringsize = stridx + padit;
3810
3811 /* Include 8 bytes to store symdefsize and stringsize in output. */
3812 mapsize = LONG_SIZE + symdefsize + stringsize + LONG_SIZE;
3813
3814 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3815
3816 memset ((PTR) &hdr, 0, sizeof hdr);
3817
3818 /* Work out the ECOFF armap name. */
3819 strcpy (hdr.ar_name, ARMAP_START);
3820 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3821 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3822 (abfd->xvec->header_byteorder_big_p
3823 ? ARMAP_BIG_ENDIAN
3824 : ARMAP_LITTLE_ENDIAN);
3825 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3826 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3827 abfd->xvec->byteorder_big_p ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3828 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3829
3830 /* Write the timestamp of the archive header to be just a little bit
3831 later than the timestamp of the file, otherwise the linker will
3832 complain that the index is out of date. Actually, the Ultrix
3833 linker just checks the archive name; the GNU linker may check the
3834 date. */
3835 stat (abfd->filename, &statbuf);
3836 sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60));
3837
3838 /* The DECstation uses zeroes for the uid, gid and mode of the
3839 armap. */
3840 hdr.ar_uid[0] = '0';
3841 hdr.ar_gid[0] = '0';
3842 hdr.ar_mode[0] = '0';
3843
3844 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
3845
3846 hdr.ar_fmag[0] = '`';
3847 hdr.ar_fmag[1] = '\n';
3848
3849 /* Turn all null bytes in the header into spaces. */
3850 for (i = 0; i < sizeof (struct ar_hdr); i++)
3851 if (((char *)(&hdr))[i] == '\0')
3852 (((char *)(&hdr))[i]) = ' ';
3853
3854 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
3855 != sizeof (struct ar_hdr))
3856 return false;
3857
3858 bfd_h_put_32 (abfd, hashsize, temp);
3859 if (bfd_write (temp, 1, LONG_SIZE, abfd) != LONG_SIZE)
3860 return false;
3861
3862 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3863
3864 current = abfd->archive_head;
3865 last_elt = current;
3866 for (i = 0; i < orl_count; i++)
3867 {
3868 unsigned int hash, rehash;
3869
3870 /* Advance firstreal to the file position of this archive
3871 element. */
3872 if (((bfd *) map[i].pos) != last_elt)
3873 {
3874 do
3875 {
3876 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3877 firstreal += firstreal % 2;
3878 current = current->next;
3879 }
3880 while (current != (bfd *) map[i].pos);
3881 }
3882
3883 last_elt = current;
3884
3885 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3886 if (bfd_h_get_32 (abfd, (PTR) (hashtable
3887 + (hash * 2 * LONG_SIZE)
3888 + LONG_SIZE))
3889 != 0)
3890 {
3891 unsigned int srch;
3892
3893 /* The desired slot is already taken. */
3894 for (srch = (hash + rehash) & (hashsize - 1);
3895 srch != hash;
3896 srch = (srch + rehash) & (hashsize - 1))
3897 if (bfd_h_get_32 (abfd, (PTR) (hashtable
3898 + (srch * 2 * LONG_SIZE)
3899 + LONG_SIZE))
3900 == 0)
3901 break;
3902
3903 BFD_ASSERT (srch != hash);
3904
3905 hash = srch;
3906 }
3907
3908 bfd_h_put_32 (abfd, map[i].namidx,
3909 (PTR) (hashtable + hash * 2 * LONG_SIZE));
3910 bfd_h_put_32 (abfd, firstreal,
3911 (PTR) (hashtable + hash * 2 * LONG_SIZE + LONG_SIZE));
3912 }
3913
3914 if (bfd_write (hashtable, 1, symdefsize, abfd) != symdefsize)
3915 return false;
3916
3917 bfd_release (abfd, hashtable);
3918
3919 /* Now write the strings. */
3920 bfd_h_put_32 (abfd, stringsize, temp);
3921 if (bfd_write (temp, 1, LONG_SIZE, abfd) != LONG_SIZE)
3922 return false;
3923 for (i = 0; i < orl_count; i++)
3924 {
3925 bfd_size_type len;
3926
3927 len = strlen (*map[i].name) + 1;
3928 if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len)
3929 return false;
3930 }
3931
3932 /* The spec sez this should be a newline. But in order to be
3933 bug-compatible for DECstation ar we use a null. */
3934 if (padit)
3935 {
3936 if (bfd_write ("\0", 1, 1, abfd) != 1)
3937 return false;
3938 }
3939
3940 return true;
3941 }
3942
3943 /* We just use the generic extended name support. This is a GNU
3944 extension. */
3945 #define ecoff_slurp_extended_name_table _bfd_slurp_extended_name_table
3946
3947 /* See whether this BFD is an archive. If it is, read in the armap
3948 and the extended name table. */
3949
3950 static bfd_target *
3951 ecoff_archive_p (abfd)
3952 bfd *abfd;
3953 {
3954 char armag[SARMAG + 1];
3955
3956 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG
3957 || strncmp (armag, ARMAG, SARMAG) != 0)
3958 {
3959 bfd_error = wrong_format;
3960 return (bfd_target *) NULL;
3961 }
3962
3963 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3964 involves a cast, we can't do it as the left operand of
3965 assignment. */
3966 abfd->tdata.aout_ar_data =
3967 (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata));
3968
3969 if (bfd_ardata (abfd) == (struct artdata *) NULL)
3970 {
3971 bfd_error = no_memory;
3972 return (bfd_target *) NULL;
3973 }
3974
3975 bfd_ardata (abfd)->first_file_filepos = SARMAG;
3976
3977 if (ecoff_slurp_armap (abfd) == false
3978 || ecoff_slurp_extended_name_table (abfd) == false)
3979 {
3980 bfd_release (abfd, bfd_ardata (abfd));
3981 abfd->tdata.aout_ar_data = (struct artdata *) NULL;
3982 return (bfd_target *) NULL;
3983 }
3984
3985 return abfd->xvec;
3986 }
3987 \f
3988 /* This is the COFF backend structure. The backend_data field of the
3989 bfd_target structure is set to this. The section reading code in
3990 coffgen.c uses this structure. */
3991
3992 static CONST bfd_coff_backend_data bfd_ecoff_std_swap_table = {
3993 (void (*) PARAMS ((bfd *,PTR,int,int,PTR))) bfd_void, /* aux_in */
3994 (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_in */
3995 (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_in */
3996 (unsigned (*) PARAMS ((bfd *,PTR,int,int,PTR))) bfd_void, /* aux_out */
3997 (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_out */
3998 (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_out */
3999 ecoff_swap_reloc_out, ecoff_swap_filehdr_out, ecoff_swap_aouthdr_out,
4000 ecoff_swap_scnhdr_out,
4001 FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, true,
4002 ecoff_swap_filehdr_in, ecoff_swap_aouthdr_in, ecoff_swap_scnhdr_in,
4003 ecoff_bad_format_hook, ecoff_set_arch_mach_hook, ecoff_mkobject_hook,
4004 ecoff_styp_to_sec_flags, ecoff_make_section_hook, ecoff_set_alignment_hook,
4005 ecoff_slurp_symbol_table
4006 };
4007
4008 /* get_lineno could be written for ECOFF, but it would currently only
4009 be useful for linking ECOFF and COFF files together, which doesn't
4010 seem too likely. */
4011 #define ecoff_get_lineno \
4012 ((alent *(*) PARAMS ((bfd *, asymbol *))) bfd_nullvoidptr)
4013
4014 /* These bfd_target functions are defined in other files. */
4015
4016 #define ecoff_core_file_failing_command _bfd_dummy_core_file_failing_command
4017 #define ecoff_core_file_failing_signal _bfd_dummy_core_file_failing_signal
4018 #define ecoff_core_file_matches_executable_p \
4019 _bfd_dummy_core_file_matches_executable_p
4020 #define ecoff_truncate_arname bfd_dont_truncate_arname
4021 #define ecoff_openr_next_archived_file bfd_generic_openr_next_archived_file
4022 #define ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt
4023 #define ecoff_get_section_contents bfd_generic_get_section_contents
4024 #define ecoff_get_reloc_upper_bound coff_get_reloc_upper_bound
4025 #define ecoff_close_and_cleanup bfd_generic_close_and_cleanup
4026 #define ecoff_bfd_debug_info_start bfd_void
4027 #define ecoff_bfd_debug_info_end bfd_void
4028 #define ecoff_bfd_debug_info_accumulate \
4029 ((void (*) PARAMS ((bfd *, struct sec *))) bfd_void)
4030 #define ecoff_bfd_get_relocated_section_contents \
4031 bfd_generic_get_relocated_section_contents
4032 #define ecoff_bfd_relax_section bfd_generic_relax_section
4033
4034 bfd_target ecoff_little_vec =
4035 {
4036 "ecoff-littlemips", /* name */
4037 bfd_target_ecoff_flavour,
4038 false, /* data byte order is little */
4039 false, /* header byte order is little */
4040
4041 (HAS_RELOC | EXEC_P | /* object flags */
4042 HAS_LINENO | HAS_DEBUG |
4043 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT),
4044
4045 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* sect
4046 flags */
4047 0, /* leading underscore */
4048 '/', /* ar_pad_char */
4049 15, /* ar_max_namelen */
4050 3, /* minimum alignment power */
4051 _do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16, /* data */
4052 _do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16, /* hdrs */
4053
4054 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
4055 ecoff_archive_p, _bfd_dummy_target},
4056 {bfd_false, ecoff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
4057 bfd_false},
4058 {bfd_false, ecoff_write_object_contents, /* bfd_write_contents */
4059 _bfd_write_archive_contents, bfd_false},
4060 JUMP_TABLE (ecoff),
4061 0, 0,
4062 (PTR) &bfd_ecoff_std_swap_table
4063 };
4064
4065 bfd_target ecoff_big_vec =
4066 {
4067 "ecoff-bigmips", /* name */
4068 bfd_target_ecoff_flavour,
4069 true, /* data byte order is big */
4070 true, /* header byte order is big */
4071
4072 (HAS_RELOC | EXEC_P | /* object flags */
4073 HAS_LINENO | HAS_DEBUG |
4074 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT),
4075
4076 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* sect flags */
4077 0, /* leading underscore */
4078 ' ', /* ar_pad_char */
4079 16, /* ar_max_namelen */
4080 3, /* minimum alignment power */
4081 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16,
4082 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16,
4083 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
4084 ecoff_archive_p, _bfd_dummy_target},
4085 {bfd_false, ecoff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
4086 bfd_false},
4087 {bfd_false, ecoff_write_object_contents, /* bfd_write_contents */
4088 _bfd_write_archive_contents, bfd_false},
4089 JUMP_TABLE(ecoff),
4090 0, 0,
4091 (PTR) &bfd_ecoff_std_swap_table
4092 /* Note that there is another bfd_target just above this one. If
4093 you are adding initializers here, you should be adding them there
4094 as well. */
4095 };
This page took 0.143714 seconds and 4 git commands to generate.