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