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