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