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