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