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