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