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