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