* scripttempl/alpha.sc: Define _ftext, _etext and _fdata insted of
[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. We
2922 don't do this if this BFD was created by the backend linker,
2923 since it will have already handled the symbols and relocs. */
2924 if (! ecoff_data (abfd)->linker)
2925 {
2926 symhdr->iextMax = 0;
2927 symhdr->issExtMax = 0;
2928 debug->external_ext = debug->external_ext_end = NULL;
2929 debug->ssext = debug->ssext_end = NULL;
2930 if (bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2931 (((abfd->flags & EXEC_P) == 0)
2932 ? true : false),
2933 ecoff_get_extr, ecoff_set_index)
2934 == false)
2935 goto error_return;
2936
2937 /* Write out the relocs. */
2938 for (current = abfd->sections;
2939 current != (asection *) NULL;
2940 current = current->next)
2941 {
2942 arelent **reloc_ptr_ptr;
2943 arelent **reloc_end;
2944 char *out_ptr;
2945
2946 if (current->reloc_count == 0)
2947 continue;
2948
2949 reloc_buff =
2950 bfd_alloc (abfd, current->reloc_count * external_reloc_size);
2951 if (reloc_buff == NULL)
2952 {
2953 bfd_set_error (bfd_error_no_memory);
2954 goto error_return;
2955 }
2956
2957 reloc_ptr_ptr = current->orelocation;
2958 reloc_end = reloc_ptr_ptr + current->reloc_count;
2959 out_ptr = (char *) reloc_buff;
2960 for (;
2961 reloc_ptr_ptr < reloc_end;
2962 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2963 {
2964 arelent *reloc;
2965 asymbol *sym;
2966 struct internal_reloc in;
2967
2968 memset ((PTR) &in, 0, sizeof in);
2969
2970 reloc = *reloc_ptr_ptr;
2971 sym = *reloc->sym_ptr_ptr;
2972
2973 in.r_vaddr = (reloc->address
2974 + bfd_get_section_vma (abfd, current));
2975 in.r_type = reloc->howto->type;
2976
2977 if ((sym->flags & BSF_SECTION_SYM) == 0)
2978 {
2979 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2980 in.r_extern = 1;
2981 }
2982 else
2983 {
2984 CONST char *name;
2985
2986 name = bfd_get_section_name (abfd, bfd_get_section (sym));
2987 if (strcmp (name, ".text") == 0)
2988 in.r_symndx = RELOC_SECTION_TEXT;
2989 else if (strcmp (name, ".rdata") == 0)
2990 in.r_symndx = RELOC_SECTION_RDATA;
2991 else if (strcmp (name, ".data") == 0)
2992 in.r_symndx = RELOC_SECTION_DATA;
2993 else if (strcmp (name, ".sdata") == 0)
2994 in.r_symndx = RELOC_SECTION_SDATA;
2995 else if (strcmp (name, ".sbss") == 0)
2996 in.r_symndx = RELOC_SECTION_SBSS;
2997 else if (strcmp (name, ".bss") == 0)
2998 in.r_symndx = RELOC_SECTION_BSS;
2999 else if (strcmp (name, ".init") == 0)
3000 in.r_symndx = RELOC_SECTION_INIT;
3001 else if (strcmp (name, ".lit8") == 0)
3002 in.r_symndx = RELOC_SECTION_LIT8;
3003 else if (strcmp (name, ".lit4") == 0)
3004 in.r_symndx = RELOC_SECTION_LIT4;
3005 else if (strcmp (name, ".xdata") == 0)
3006 in.r_symndx = RELOC_SECTION_XDATA;
3007 else if (strcmp (name, ".pdata") == 0)
3008 in.r_symndx = RELOC_SECTION_PDATA;
3009 else if (strcmp (name, ".fini") == 0)
3010 in.r_symndx = RELOC_SECTION_FINI;
3011 else if (strcmp (name, ".lita") == 0)
3012 in.r_symndx = RELOC_SECTION_LITA;
3013 else if (strcmp (name, "*ABS*") == 0)
3014 in.r_symndx = RELOC_SECTION_ABS;
3015 else
3016 abort ();
3017 in.r_extern = 0;
3018 }
3019
3020 (*adjust_reloc_out) (abfd, reloc, &in);
3021
3022 (*swap_reloc_out) (abfd, &in, (PTR) out_ptr);
3023 }
3024
3025 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
3026 goto error_return;
3027 if (bfd_write (reloc_buff,
3028 external_reloc_size, current->reloc_count, abfd)
3029 != external_reloc_size * current->reloc_count)
3030 goto error_return;
3031 bfd_release (abfd, reloc_buff);
3032 reloc_buff = NULL;
3033 }
3034
3035 /* Write out the symbolic debugging information. */
3036 if (bfd_get_symcount (abfd) > 0)
3037 {
3038 /* Write out the debugging information. */
3039 if (bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
3040 ecoff_data (abfd)->sym_filepos)
3041 == false)
3042 goto error_return;
3043 }
3044 }
3045
3046 /* The .bss section of a demand paged executable must receive an
3047 entire page. If there are symbols, the symbols will start on the
3048 next page. If there are no symbols, we must fill out the page by
3049 hand. */
3050 if (bfd_get_symcount (abfd) == 0
3051 && (abfd->flags & EXEC_P) != 0
3052 && (abfd->flags & D_PAGED) != 0)
3053 {
3054 char c;
3055
3056 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
3057 SEEK_SET) != 0)
3058 goto error_return;
3059 if (bfd_read (&c, 1, 1, abfd) == 0)
3060 c = 0;
3061 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
3062 SEEK_SET) != 0)
3063 goto error_return;
3064 if (bfd_write (&c, 1, 1, abfd) != 1)
3065 goto error_return;
3066 }
3067
3068 if (reloc_buff != NULL)
3069 bfd_release (abfd, reloc_buff);
3070 if (buff != NULL)
3071 free (buff);
3072 return true;
3073 error_return:
3074 if (reloc_buff != NULL)
3075 bfd_release (abfd, reloc_buff);
3076 if (buff != NULL)
3077 free (buff);
3078 return false;
3079 }
3080 \f
3081 /* Archive handling. ECOFF uses what appears to be a unique type of
3082 archive header (armap). The byte ordering of the armap and the
3083 contents are encoded in the name of the armap itself. At least for
3084 now, we only support archives with the same byte ordering in the
3085 armap and the contents.
3086
3087 The first four bytes in the armap are the number of symbol
3088 definitions. This is always a power of two.
3089
3090 This is followed by the symbol definitions. Each symbol definition
3091 occupies 8 bytes. The first four bytes are the offset from the
3092 start of the armap strings to the null-terminated string naming
3093 this symbol. The second four bytes are the file offset to the
3094 archive member which defines this symbol. If the second four bytes
3095 are 0, then this is not actually a symbol definition, and it should
3096 be ignored.
3097
3098 The symbols are hashed into the armap with a closed hashing scheme.
3099 See the functions below for the details of the algorithm.
3100
3101 After the symbol definitions comes four bytes holding the size of
3102 the string table, followed by the string table itself. */
3103
3104 /* The name of an archive headers looks like this:
3105 __________E[BL]E[BL]_ (with a trailing space).
3106 The trailing space is changed to an X if the archive is changed to
3107 indicate that the armap is out of date.
3108
3109 The Alpha seems to use ________64E[BL]E[BL]_. */
3110
3111 #define ARMAP_BIG_ENDIAN 'B'
3112 #define ARMAP_LITTLE_ENDIAN 'L'
3113 #define ARMAP_MARKER 'E'
3114 #define ARMAP_START_LENGTH 10
3115 #define ARMAP_HEADER_MARKER_INDEX 10
3116 #define ARMAP_HEADER_ENDIAN_INDEX 11
3117 #define ARMAP_OBJECT_MARKER_INDEX 12
3118 #define ARMAP_OBJECT_ENDIAN_INDEX 13
3119 #define ARMAP_END_INDEX 14
3120 #define ARMAP_END "_ "
3121
3122 /* This is a magic number used in the hashing algorithm. */
3123 #define ARMAP_HASH_MAGIC 0x9dd68ab5
3124
3125 /* This returns the hash value to use for a string. It also sets
3126 *REHASH to the rehash adjustment if the first slot is taken. SIZE
3127 is the number of entries in the hash table, and HLOG is the log
3128 base 2 of SIZE. */
3129
3130 static unsigned int
3131 ecoff_armap_hash (s, rehash, size, hlog)
3132 CONST char *s;
3133 unsigned int *rehash;
3134 unsigned int size;
3135 unsigned int hlog;
3136 {
3137 unsigned int hash;
3138
3139 hash = *s++;
3140 while (*s != '\0')
3141 hash = ((hash >> 27) | (hash << 5)) + *s++;
3142 hash *= ARMAP_HASH_MAGIC;
3143 *rehash = (hash & (size - 1)) | 1;
3144 return hash >> (32 - hlog);
3145 }
3146
3147 /* Read in the armap. */
3148
3149 boolean
3150 ecoff_slurp_armap (abfd)
3151 bfd *abfd;
3152 {
3153 char nextname[17];
3154 unsigned int i;
3155 struct areltdata *mapdata;
3156 bfd_size_type parsed_size;
3157 char *raw_armap;
3158 struct artdata *ardata;
3159 unsigned int count;
3160 char *raw_ptr;
3161 struct symdef *symdef_ptr;
3162 char *stringbase;
3163
3164 /* Get the name of the first element. */
3165 i = bfd_read ((PTR) nextname, 1, 16, abfd);
3166 if (i == 0)
3167 return true;
3168 if (i != 16)
3169 return false;
3170
3171 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
3172 return false;
3173
3174 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
3175 standard COFF armap. We could move the ECOFF armap stuff into
3176 bfd_slurp_armap, but that seems inappropriate since no other
3177 target uses this format. Instead, we check directly for a COFF
3178 armap. */
3179 if (strncmp (nextname, "/ ", 16) == 0)
3180 return bfd_slurp_armap (abfd);
3181
3182 /* See if the first element is an armap. */
3183 if (strncmp (nextname, ecoff_backend (abfd)->armap_start,
3184 ARMAP_START_LENGTH) != 0
3185 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
3186 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3187 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3188 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
3189 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3190 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3191 || strncmp (nextname + ARMAP_END_INDEX,
3192 ARMAP_END, sizeof ARMAP_END - 1) != 0)
3193 {
3194 bfd_has_map (abfd) = false;
3195 return true;
3196 }
3197
3198 /* Make sure we have the right byte ordering. */
3199 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3200 ^ (abfd->xvec->header_byteorder_big_p != false))
3201 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3202 ^ (abfd->xvec->byteorder_big_p != false)))
3203 {
3204 bfd_set_error (bfd_error_wrong_format);
3205 return false;
3206 }
3207
3208 /* Read in the armap. */
3209 ardata = bfd_ardata (abfd);
3210 mapdata = _bfd_snarf_ar_hdr (abfd);
3211 if (mapdata == (struct areltdata *) NULL)
3212 return false;
3213 parsed_size = mapdata->parsed_size;
3214 bfd_release (abfd, (PTR) mapdata);
3215
3216 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
3217 if (raw_armap == (char *) NULL)
3218 {
3219 bfd_set_error (bfd_error_no_memory);
3220 return false;
3221 }
3222
3223 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
3224 {
3225 if (bfd_get_error () != bfd_error_system_call)
3226 bfd_set_error (bfd_error_malformed_archive);
3227 bfd_release (abfd, (PTR) raw_armap);
3228 return false;
3229 }
3230
3231 ardata->tdata = (PTR) raw_armap;
3232
3233 count = bfd_h_get_32 (abfd, (PTR) raw_armap);
3234
3235 ardata->symdef_count = 0;
3236 ardata->cache = (struct ar_cache *) NULL;
3237
3238 /* This code used to overlay the symdefs over the raw archive data,
3239 but that doesn't work on a 64 bit host. */
3240
3241 stringbase = raw_armap + count * 8 + 8;
3242
3243 #ifdef CHECK_ARMAP_HASH
3244 {
3245 unsigned int hlog;
3246
3247 /* Double check that I have the hashing algorithm right by making
3248 sure that every symbol can be looked up successfully. */
3249 hlog = 0;
3250 for (i = 1; i < count; i <<= 1)
3251 hlog++;
3252 BFD_ASSERT (i == count);
3253
3254 raw_ptr = raw_armap + 4;
3255 for (i = 0; i < count; i++, raw_ptr += 8)
3256 {
3257 unsigned int name_offset, file_offset;
3258 unsigned int hash, rehash, srch;
3259
3260 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3261 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3262 if (file_offset == 0)
3263 continue;
3264 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
3265 hlog);
3266 if (hash == i)
3267 continue;
3268
3269 /* See if we can rehash to this location. */
3270 for (srch = (hash + rehash) & (count - 1);
3271 srch != hash && srch != i;
3272 srch = (srch + rehash) & (count - 1))
3273 BFD_ASSERT (bfd_h_get_32 (abfd, (PTR) (raw_armap + 8 + srch * 8))
3274 != 0);
3275 BFD_ASSERT (srch == i);
3276 }
3277 }
3278
3279 #endif /* CHECK_ARMAP_HASH */
3280
3281 raw_ptr = raw_armap + 4;
3282 for (i = 0; i < count; i++, raw_ptr += 8)
3283 if (bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)) != 0)
3284 ++ardata->symdef_count;
3285
3286 symdef_ptr = ((struct symdef *)
3287 bfd_alloc (abfd,
3288 ardata->symdef_count * sizeof (struct symdef)));
3289 if (!symdef_ptr)
3290 {
3291 bfd_set_error (bfd_error_no_memory);
3292 return false;
3293 }
3294
3295 ardata->symdefs = (carsym *) symdef_ptr;
3296
3297 raw_ptr = raw_armap + 4;
3298 for (i = 0; i < count; i++, raw_ptr += 8)
3299 {
3300 unsigned int name_offset, file_offset;
3301
3302 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3303 if (file_offset == 0)
3304 continue;
3305 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3306 symdef_ptr->s.name = stringbase + name_offset;
3307 symdef_ptr->file_offset = file_offset;
3308 ++symdef_ptr;
3309 }
3310
3311 ardata->first_file_filepos = bfd_tell (abfd);
3312 /* Pad to an even boundary. */
3313 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3314
3315 bfd_has_map (abfd) = true;
3316
3317 return true;
3318 }
3319
3320 /* Write out an armap. */
3321
3322 boolean
3323 ecoff_write_armap (abfd, elength, map, orl_count, stridx)
3324 bfd *abfd;
3325 unsigned int elength;
3326 struct orl *map;
3327 unsigned int orl_count;
3328 int stridx;
3329 {
3330 unsigned int hashsize, hashlog;
3331 unsigned int symdefsize;
3332 int padit;
3333 unsigned int stringsize;
3334 unsigned int mapsize;
3335 file_ptr firstreal;
3336 struct ar_hdr hdr;
3337 struct stat statbuf;
3338 unsigned int i;
3339 bfd_byte temp[4];
3340 bfd_byte *hashtable;
3341 bfd *current;
3342 bfd *last_elt;
3343
3344 /* Ultrix appears to use as a hash table size the least power of two
3345 greater than twice the number of entries. */
3346 for (hashlog = 0; (1 << hashlog) <= 2 * orl_count; hashlog++)
3347 ;
3348 hashsize = 1 << hashlog;
3349
3350 symdefsize = hashsize * 8;
3351 padit = stridx % 2;
3352 stringsize = stridx + padit;
3353
3354 /* Include 8 bytes to store symdefsize and stringsize in output. */
3355 mapsize = symdefsize + stringsize + 8;
3356
3357 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3358
3359 memset ((PTR) &hdr, 0, sizeof hdr);
3360
3361 /* Work out the ECOFF armap name. */
3362 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3363 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3364 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3365 (abfd->xvec->header_byteorder_big_p
3366 ? ARMAP_BIG_ENDIAN
3367 : ARMAP_LITTLE_ENDIAN);
3368 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3369 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3370 abfd->xvec->byteorder_big_p ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3371 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3372
3373 /* Write the timestamp of the archive header to be just a little bit
3374 later than the timestamp of the file, otherwise the linker will
3375 complain that the index is out of date. Actually, the Ultrix
3376 linker just checks the archive name; the GNU linker may check the
3377 date. */
3378 stat (abfd->filename, &statbuf);
3379 sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60));
3380
3381 /* The DECstation uses zeroes for the uid, gid and mode of the
3382 armap. */
3383 hdr.ar_uid[0] = '0';
3384 hdr.ar_gid[0] = '0';
3385 hdr.ar_mode[0] = '0';
3386
3387 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
3388
3389 hdr.ar_fmag[0] = '`';
3390 hdr.ar_fmag[1] = '\012';
3391
3392 /* Turn all null bytes in the header into spaces. */
3393 for (i = 0; i < sizeof (struct ar_hdr); i++)
3394 if (((char *)(&hdr))[i] == '\0')
3395 (((char *)(&hdr))[i]) = ' ';
3396
3397 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
3398 != sizeof (struct ar_hdr))
3399 return false;
3400
3401 bfd_h_put_32 (abfd, (bfd_vma) hashsize, temp);
3402 if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3403 return false;
3404
3405 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3406 if (!hashtable)
3407 {
3408 bfd_set_error (bfd_error_no_memory);
3409 return false;
3410 }
3411
3412 current = abfd->archive_head;
3413 last_elt = current;
3414 for (i = 0; i < orl_count; i++)
3415 {
3416 unsigned int hash, rehash;
3417
3418 /* Advance firstreal to the file position of this archive
3419 element. */
3420 if (((bfd *) map[i].pos) != last_elt)
3421 {
3422 do
3423 {
3424 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3425 firstreal += firstreal % 2;
3426 current = current->next;
3427 }
3428 while (current != (bfd *) map[i].pos);
3429 }
3430
3431 last_elt = current;
3432
3433 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3434 if (bfd_h_get_32 (abfd, (PTR) (hashtable + (hash * 8) + 4)) != 0)
3435 {
3436 unsigned int srch;
3437
3438 /* The desired slot is already taken. */
3439 for (srch = (hash + rehash) & (hashsize - 1);
3440 srch != hash;
3441 srch = (srch + rehash) & (hashsize - 1))
3442 if (bfd_h_get_32 (abfd, (PTR) (hashtable + (srch * 8) + 4)) == 0)
3443 break;
3444
3445 BFD_ASSERT (srch != hash);
3446
3447 hash = srch;
3448 }
3449
3450 bfd_h_put_32 (abfd, (bfd_vma) map[i].namidx,
3451 (PTR) (hashtable + hash * 8));
3452 bfd_h_put_32 (abfd, (bfd_vma) firstreal,
3453 (PTR) (hashtable + hash * 8 + 4));
3454 }
3455
3456 if (bfd_write ((PTR) hashtable, 1, symdefsize, abfd) != symdefsize)
3457 return false;
3458
3459 bfd_release (abfd, hashtable);
3460
3461 /* Now write the strings. */
3462 bfd_h_put_32 (abfd, (bfd_vma) stringsize, temp);
3463 if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3464 return false;
3465 for (i = 0; i < orl_count; i++)
3466 {
3467 bfd_size_type len;
3468
3469 len = strlen (*map[i].name) + 1;
3470 if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len)
3471 return false;
3472 }
3473
3474 /* The spec sez this should be a newline. But in order to be
3475 bug-compatible for DECstation ar we use a null. */
3476 if (padit)
3477 {
3478 if (bfd_write ("", 1, 1, abfd) != 1)
3479 return false;
3480 }
3481
3482 return true;
3483 }
3484
3485 /* See whether this BFD is an archive. If it is, read in the armap
3486 and the extended name table. */
3487
3488 bfd_target *
3489 ecoff_archive_p (abfd)
3490 bfd *abfd;
3491 {
3492 char armag[SARMAG + 1];
3493
3494 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG
3495 || strncmp (armag, ARMAG, SARMAG) != 0)
3496 {
3497 if (bfd_get_error () != bfd_error_system_call)
3498 bfd_set_error (bfd_error_wrong_format);
3499 return (bfd_target *) NULL;
3500 }
3501
3502 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3503 involves a cast, we can't do it as the left operand of
3504 assignment. */
3505 abfd->tdata.aout_ar_data =
3506 (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata));
3507
3508 if (bfd_ardata (abfd) == (struct artdata *) NULL)
3509 {
3510 bfd_set_error (bfd_error_no_memory);
3511 return (bfd_target *) NULL;
3512 }
3513
3514 bfd_ardata (abfd)->first_file_filepos = SARMAG;
3515 bfd_ardata (abfd)->cache = NULL;
3516 bfd_ardata (abfd)->archive_head = NULL;
3517 bfd_ardata (abfd)->symdefs = NULL;
3518 bfd_ardata (abfd)->extended_names = NULL;
3519 bfd_ardata (abfd)->tdata = NULL;
3520
3521 if (ecoff_slurp_armap (abfd) == false
3522 || ecoff_slurp_extended_name_table (abfd) == false)
3523 {
3524 bfd_release (abfd, bfd_ardata (abfd));
3525 abfd->tdata.aout_ar_data = (struct artdata *) NULL;
3526 return (bfd_target *) NULL;
3527 }
3528
3529 return abfd->xvec;
3530 }
3531 \f
3532 /* ECOFF linker code. */
3533
3534 static struct bfd_hash_entry *ecoff_link_hash_newfunc
3535 PARAMS ((struct bfd_hash_entry *entry,
3536 struct bfd_hash_table *table,
3537 const char *string));
3538 static boolean ecoff_link_add_archive_symbols
3539 PARAMS ((bfd *, struct bfd_link_info *));
3540 static boolean ecoff_link_check_archive_element
3541 PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded));
3542 static boolean ecoff_link_add_object_symbols
3543 PARAMS ((bfd *, struct bfd_link_info *));
3544 static boolean ecoff_link_add_externals
3545 PARAMS ((bfd *, struct bfd_link_info *, PTR, char *));
3546
3547 /* Routine to create an entry in an ECOFF link hash table. */
3548
3549 static struct bfd_hash_entry *
3550 ecoff_link_hash_newfunc (entry, table, string)
3551 struct bfd_hash_entry *entry;
3552 struct bfd_hash_table *table;
3553 const char *string;
3554 {
3555 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3556
3557 /* Allocate the structure if it has not already been allocated by a
3558 subclass. */
3559 if (ret == (struct ecoff_link_hash_entry *) NULL)
3560 ret = ((struct ecoff_link_hash_entry *)
3561 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3562 if (ret == (struct ecoff_link_hash_entry *) NULL)
3563 {
3564 bfd_set_error (bfd_error_no_memory);
3565 return NULL;
3566 }
3567
3568 /* Call the allocation method of the superclass. */
3569 ret = ((struct ecoff_link_hash_entry *)
3570 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3571 table, string));
3572
3573 if (ret)
3574 {
3575 /* Set local fields. */
3576 ret->indx = -1;
3577 ret->abfd = NULL;
3578 }
3579 memset ((PTR) &ret->esym, 0, sizeof ret->esym);
3580
3581 return (struct bfd_hash_entry *) ret;
3582 }
3583
3584 /* Create an ECOFF link hash table. */
3585
3586 struct bfd_link_hash_table *
3587 ecoff_bfd_link_hash_table_create (abfd)
3588 bfd *abfd;
3589 {
3590 struct ecoff_link_hash_table *ret;
3591
3592 ret = ((struct ecoff_link_hash_table *)
3593 malloc (sizeof (struct ecoff_link_hash_table)));
3594 if (!ret)
3595 {
3596 bfd_set_error (bfd_error_no_memory);
3597 return NULL;
3598 }
3599 if (! _bfd_link_hash_table_init (&ret->root, abfd,
3600 ecoff_link_hash_newfunc))
3601 {
3602 free (ret);
3603 return (struct bfd_link_hash_table *) NULL;
3604 }
3605 return &ret->root;
3606 }
3607
3608 /* Look up an entry in an ECOFF link hash table. */
3609
3610 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3611 ((struct ecoff_link_hash_entry *) \
3612 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3613
3614 /* Traverse an ECOFF link hash table. */
3615
3616 #define ecoff_link_hash_traverse(table, func, info) \
3617 (bfd_link_hash_traverse \
3618 (&(table)->root, \
3619 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3620 (info)))
3621
3622 /* Get the ECOFF link hash table from the info structure. This is
3623 just a cast. */
3624
3625 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3626
3627 /* Given an ECOFF BFD, add symbols to the global hash table as
3628 appropriate. */
3629
3630 boolean
3631 ecoff_bfd_link_add_symbols (abfd, info)
3632 bfd *abfd;
3633 struct bfd_link_info *info;
3634 {
3635 switch (bfd_get_format (abfd))
3636 {
3637 case bfd_object:
3638 return ecoff_link_add_object_symbols (abfd, info);
3639 case bfd_archive:
3640 return ecoff_link_add_archive_symbols (abfd, info);
3641 default:
3642 bfd_set_error (bfd_error_wrong_format);
3643 return false;
3644 }
3645 }
3646
3647 /* Add the symbols from an archive file to the global hash table.
3648 This looks through the undefined symbols, looks each one up in the
3649 archive hash table, and adds any associated object file. We do not
3650 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3651 already have a hash table, so there is no reason to construct
3652 another one. */
3653
3654 static boolean
3655 ecoff_link_add_archive_symbols (abfd, info)
3656 bfd *abfd;
3657 struct bfd_link_info *info;
3658 {
3659 const bfd_byte *raw_armap;
3660 struct bfd_link_hash_entry **pundef;
3661 unsigned int armap_count;
3662 unsigned int armap_log;
3663 unsigned int i;
3664 const bfd_byte *hashtable;
3665 const char *stringbase;
3666
3667 if (! bfd_has_map (abfd))
3668 {
3669 bfd_set_error (bfd_error_no_symbols);
3670 return false;
3671 }
3672
3673 /* If we don't have any raw data for this archive, as can happen on
3674 Irix 4.0.5F, we call the generic routine.
3675 FIXME: We should be more clever about this, since someday tdata
3676 may get to something for a generic archive. */
3677 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3678 if (raw_armap == (bfd_byte *) NULL)
3679 return (_bfd_generic_link_add_archive_symbols
3680 (abfd, info, ecoff_link_check_archive_element));
3681
3682 armap_count = bfd_h_get_32 (abfd, raw_armap);
3683
3684 armap_log = 0;
3685 for (i = 1; i < armap_count; i <<= 1)
3686 armap_log++;
3687 BFD_ASSERT (i == armap_count);
3688
3689 hashtable = raw_armap + 4;
3690 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3691
3692 /* Look through the list of undefined symbols. */
3693 pundef = &info->hash->undefs;
3694 while (*pundef != (struct bfd_link_hash_entry *) NULL)
3695 {
3696 struct bfd_link_hash_entry *h;
3697 unsigned int hash, rehash;
3698 unsigned int file_offset;
3699 const char *name;
3700 bfd *element;
3701
3702 h = *pundef;
3703
3704 /* When a symbol is defined, it is not necessarily removed from
3705 the list. */
3706 if (h->type != bfd_link_hash_undefined
3707 && h->type != bfd_link_hash_common)
3708 {
3709 /* Remove this entry from the list, for general cleanliness
3710 and because we are going to look through the list again
3711 if we search any more libraries. We can't remove the
3712 entry if it is the tail, because that would lose any
3713 entries we add to the list later on. */
3714 if (*pundef != info->hash->undefs_tail)
3715 *pundef = (*pundef)->next;
3716 else
3717 pundef = &(*pundef)->next;
3718 continue;
3719 }
3720
3721 /* Native ECOFF linkers do not pull in archive elements merely
3722 to satisfy common definitions, so neither do we. We leave
3723 them on the list, though, in case we are linking against some
3724 other object format. */
3725 if (h->type != bfd_link_hash_undefined)
3726 {
3727 pundef = &(*pundef)->next;
3728 continue;
3729 }
3730
3731 /* Look for this symbol in the archive hash table. */
3732 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3733 armap_log);
3734
3735 file_offset = bfd_h_get_32 (abfd, hashtable + (hash * 8) + 4);
3736 if (file_offset == 0)
3737 {
3738 /* Nothing in this slot. */
3739 pundef = &(*pundef)->next;
3740 continue;
3741 }
3742
3743 name = stringbase + bfd_h_get_32 (abfd, hashtable + (hash * 8));
3744 if (name[0] != h->root.string[0]
3745 || strcmp (name, h->root.string) != 0)
3746 {
3747 unsigned int srch;
3748 boolean found;
3749
3750 /* That was the wrong symbol. Try rehashing. */
3751 found = false;
3752 for (srch = (hash + rehash) & (armap_count - 1);
3753 srch != hash;
3754 srch = (srch + rehash) & (armap_count - 1))
3755 {
3756 file_offset = bfd_h_get_32 (abfd, hashtable + (srch * 8) + 4);
3757 if (file_offset == 0)
3758 break;
3759 name = stringbase + bfd_h_get_32 (abfd, hashtable + (srch * 8));
3760 if (name[0] == h->root.string[0]
3761 && strcmp (name, h->root.string) == 0)
3762 {
3763 found = true;
3764 break;
3765 }
3766 }
3767
3768 if (! found)
3769 {
3770 pundef = &(*pundef)->next;
3771 continue;
3772 }
3773
3774 hash = srch;
3775 }
3776
3777 element = _bfd_get_elt_at_filepos (abfd, file_offset);
3778 if (element == (bfd *) NULL)
3779 return false;
3780
3781 if (! bfd_check_format (element, bfd_object))
3782 return false;
3783
3784 /* Unlike the generic linker, we know that this element provides
3785 a definition for an undefined symbol and we know that we want
3786 to include it. We don't need to check anything. */
3787 if (! (*info->callbacks->add_archive_element) (info, element, name))
3788 return false;
3789 if (! ecoff_link_add_object_symbols (element, info))
3790 return false;
3791
3792 pundef = &(*pundef)->next;
3793 }
3794
3795 return true;
3796 }
3797
3798 /* This is called if we used _bfd_generic_link_add_archive_symbols
3799 because we were not dealing with an ECOFF archive. */
3800
3801 static boolean
3802 ecoff_link_check_archive_element (abfd, info, pneeded)
3803 bfd *abfd;
3804 struct bfd_link_info *info;
3805 boolean *pneeded;
3806 {
3807 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3808 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
3809 = backend->debug_swap.swap_ext_in;
3810 HDRR *symhdr;
3811 bfd_size_type external_ext_size;
3812 PTR external_ext = NULL;
3813 size_t esize;
3814 char *ssext = NULL;
3815 char *ext_ptr;
3816 char *ext_end;
3817
3818 *pneeded = false;
3819
3820 if (! ecoff_slurp_symbolic_header (abfd))
3821 goto error_return;
3822
3823 /* If there are no symbols, we don't want it. */
3824 if (bfd_get_symcount (abfd) == 0)
3825 goto successful_return;
3826
3827 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3828
3829 /* Read in the external symbols and external strings. */
3830 external_ext_size = backend->debug_swap.external_ext_size;
3831 esize = symhdr->iextMax * external_ext_size;
3832 external_ext = (PTR) malloc (esize);
3833 if (external_ext == NULL && esize != 0)
3834 {
3835 bfd_set_error (bfd_error_no_memory);
3836 goto error_return;
3837 }
3838
3839 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3840 || bfd_read (external_ext, 1, esize, abfd) != esize)
3841 goto error_return;
3842
3843 ssext = (char *) malloc (symhdr->issExtMax);
3844 if (ssext == NULL && symhdr->issExtMax != 0)
3845 {
3846 bfd_set_error (bfd_error_no_memory);
3847 goto error_return;
3848 }
3849
3850 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3851 || bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
3852 goto error_return;
3853
3854 /* Look through the external symbols to see if they define some
3855 symbol that is currently undefined. */
3856 ext_ptr = (char *) external_ext;
3857 ext_end = ext_ptr + esize;
3858 for (; ext_ptr < ext_end; ext_ptr += external_ext_size)
3859 {
3860 EXTR esym;
3861 boolean def;
3862 const char *name;
3863 struct bfd_link_hash_entry *h;
3864
3865 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
3866
3867 /* See if this symbol defines something. */
3868 if (esym.asym.st != stGlobal
3869 && esym.asym.st != stLabel
3870 && esym.asym.st != stProc)
3871 continue;
3872
3873 switch (esym.asym.sc)
3874 {
3875 case scText:
3876 case scData:
3877 case scBss:
3878 case scAbs:
3879 case scSData:
3880 case scSBss:
3881 case scRData:
3882 case scCommon:
3883 case scSCommon:
3884 case scInit:
3885 case scFini:
3886 def = true;
3887 break;
3888 default:
3889 def = false;
3890 break;
3891 }
3892
3893 if (! def)
3894 continue;
3895
3896 name = ssext + esym.asym.iss;
3897 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
3898
3899 /* Unlike the generic linker, we do not pull in elements because
3900 of common symbols. */
3901 if (h == (struct bfd_link_hash_entry *) NULL
3902 || h->type != bfd_link_hash_undefined)
3903 continue;
3904
3905 /* Include this element. */
3906 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
3907 goto error_return;
3908 if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
3909 goto error_return;
3910
3911 *pneeded = true;
3912 goto successful_return;
3913 }
3914
3915 successful_return:
3916 if (external_ext != NULL)
3917 free (external_ext);
3918 if (ssext != NULL)
3919 free (ssext);
3920 return true;
3921 error_return:
3922 if (external_ext != NULL)
3923 free (external_ext);
3924 if (ssext != NULL)
3925 free (ssext);
3926 return false;
3927 }
3928
3929 /* Add symbols from an ECOFF object file to the global linker hash
3930 table. */
3931
3932 static boolean
3933 ecoff_link_add_object_symbols (abfd, info)
3934 bfd *abfd;
3935 struct bfd_link_info *info;
3936 {
3937 HDRR *symhdr;
3938 bfd_size_type external_ext_size;
3939 PTR external_ext = NULL;
3940 size_t esize;
3941 char *ssext = NULL;
3942 boolean result;
3943
3944 if (! ecoff_slurp_symbolic_header (abfd))
3945 return false;
3946
3947 /* If there are no symbols, we don't want it. */
3948 if (bfd_get_symcount (abfd) == 0)
3949 return true;
3950
3951 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3952
3953 /* Read in the external symbols and external strings. */
3954 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3955 esize = symhdr->iextMax * external_ext_size;
3956 external_ext = (PTR) malloc (esize);
3957 if (external_ext == NULL && esize != 0)
3958 {
3959 bfd_set_error (bfd_error_no_memory);
3960 goto error_return;
3961 }
3962
3963 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3964 || bfd_read (external_ext, 1, esize, abfd) != esize)
3965 goto error_return;
3966
3967 ssext = (char *) malloc (symhdr->issExtMax);
3968 if (ssext == NULL && symhdr->issExtMax != 0)
3969 {
3970 bfd_set_error (bfd_error_no_memory);
3971 goto error_return;
3972 }
3973
3974 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3975 || bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
3976 goto error_return;
3977
3978 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3979
3980 if (ssext != NULL)
3981 free (ssext);
3982 if (external_ext != NULL)
3983 free (external_ext);
3984 return result;
3985
3986 error_return:
3987 if (ssext != NULL)
3988 free (ssext);
3989 if (external_ext != NULL)
3990 free (external_ext);
3991 return false;
3992 }
3993
3994 /* Add the external symbols of an object file to the global linker
3995 hash table. The external symbols and strings we are passed are
3996 just allocated on the stack, and will be discarded. We must
3997 explicitly save any information we may need later on in the link.
3998 We do not want to read the external symbol information again. */
3999
4000 static boolean
4001 ecoff_link_add_externals (abfd, info, external_ext, ssext)
4002 bfd *abfd;
4003 struct bfd_link_info *info;
4004 PTR external_ext;
4005 char *ssext;
4006 {
4007 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4008 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
4009 = backend->debug_swap.swap_ext_in;
4010 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
4011 unsigned long ext_count;
4012 struct ecoff_link_hash_entry **sym_hash;
4013 char *ext_ptr;
4014 char *ext_end;
4015
4016 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
4017
4018 sym_hash = ((struct ecoff_link_hash_entry **)
4019 bfd_alloc (abfd,
4020 ext_count * sizeof (struct bfd_link_hash_entry *)));
4021 if (!sym_hash)
4022 {
4023 bfd_set_error (bfd_error_no_memory);
4024 return false;
4025 }
4026 ecoff_data (abfd)->sym_hashes = sym_hash;
4027
4028 ext_ptr = (char *) external_ext;
4029 ext_end = ext_ptr + ext_count * external_ext_size;
4030 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
4031 {
4032 EXTR esym;
4033 boolean skip;
4034 bfd_vma value;
4035 asection *section;
4036 const char *name;
4037 struct ecoff_link_hash_entry *h;
4038
4039 *sym_hash = NULL;
4040
4041 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
4042
4043 /* Skip debugging symbols. */
4044 skip = false;
4045 switch (esym.asym.st)
4046 {
4047 case stGlobal:
4048 case stStatic:
4049 case stLabel:
4050 case stProc:
4051 case stStaticProc:
4052 break;
4053 default:
4054 skip = true;
4055 break;
4056 }
4057
4058 if (skip)
4059 continue;
4060
4061 /* Get the information for this symbol. */
4062 value = esym.asym.value;
4063 switch (esym.asym.sc)
4064 {
4065 default:
4066 case scNil:
4067 case scRegister:
4068 case scCdbLocal:
4069 case scBits:
4070 case scCdbSystem:
4071 case scRegImage:
4072 case scInfo:
4073 case scUserStruct:
4074 case scVar:
4075 case scVarRegister:
4076 case scVariant:
4077 case scBasedVar:
4078 case scXData:
4079 case scPData:
4080 section = NULL;
4081 break;
4082 case scText:
4083 section = bfd_make_section_old_way (abfd, ".text");
4084 value -= section->vma;
4085 break;
4086 case scData:
4087 section = bfd_make_section_old_way (abfd, ".data");
4088 value -= section->vma;
4089 break;
4090 case scBss:
4091 section = bfd_make_section_old_way (abfd, ".bss");
4092 value -= section->vma;
4093 break;
4094 case scAbs:
4095 section = &bfd_abs_section;
4096 break;
4097 case scUndefined:
4098 section = &bfd_und_section;
4099 break;
4100 case scSData:
4101 section = bfd_make_section_old_way (abfd, ".sdata");
4102 value -= section->vma;
4103 break;
4104 case scSBss:
4105 section = bfd_make_section_old_way (abfd, ".sbss");
4106 value -= section->vma;
4107 break;
4108 case scRData:
4109 section = bfd_make_section_old_way (abfd, ".rdata");
4110 value -= section->vma;
4111 break;
4112 case scCommon:
4113 if (value > ecoff_data (abfd)->gp_size)
4114 {
4115 section = &bfd_com_section;
4116 break;
4117 }
4118 /* Fall through. */
4119 case scSCommon:
4120 if (ecoff_scom_section.name == NULL)
4121 {
4122 /* Initialize the small common section. */
4123 ecoff_scom_section.name = SCOMMON;
4124 ecoff_scom_section.flags = SEC_IS_COMMON;
4125 ecoff_scom_section.output_section = &ecoff_scom_section;
4126 ecoff_scom_section.symbol = &ecoff_scom_symbol;
4127 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
4128 ecoff_scom_symbol.name = SCOMMON;
4129 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
4130 ecoff_scom_symbol.section = &ecoff_scom_section;
4131 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
4132 }
4133 section = &ecoff_scom_section;
4134 break;
4135 case scSUndefined:
4136 section = &bfd_und_section;
4137 break;
4138 case scInit:
4139 section = bfd_make_section_old_way (abfd, ".init");
4140 value -= section->vma;
4141 break;
4142 case scFini:
4143 section = bfd_make_section_old_way (abfd, ".fini");
4144 value -= section->vma;
4145 break;
4146 }
4147
4148 if (section == (asection *) NULL)
4149 continue;
4150
4151 name = ssext + esym.asym.iss;
4152
4153 h = NULL;
4154 if (! (_bfd_generic_link_add_one_symbol
4155 (info, abfd, name, BSF_GLOBAL, section, value,
4156 (const char *) NULL, true, true,
4157 (struct bfd_link_hash_entry **) &h)))
4158 return false;
4159
4160 *sym_hash = h;
4161
4162 /* If we are building an ECOFF hash table, save the external
4163 symbol information. */
4164 if (info->hash->creator->flavour == bfd_get_flavour (abfd))
4165 {
4166 if (h->abfd == (bfd *) NULL
4167 || (section != &bfd_und_section
4168 && (! bfd_is_com_section (section)
4169 || h->root.type != bfd_link_hash_defined)))
4170 {
4171 h->abfd = abfd;
4172 h->esym = esym;
4173 }
4174 }
4175 }
4176
4177 return true;
4178 }
4179 \f
4180 /* ECOFF final link routines. */
4181
4182 static boolean ecoff_final_link_debug_accumulate
4183 PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *,
4184 PTR handle));
4185 static boolean ecoff_link_write_external
4186 PARAMS ((struct ecoff_link_hash_entry *, PTR));
4187 static boolean ecoff_indirect_link_order
4188 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4189 struct bfd_link_order *));
4190 static boolean ecoff_reloc_link_order
4191 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4192 struct bfd_link_order *));
4193
4194 /* ECOFF final link routine. This looks through all the input BFDs
4195 and gathers together all the debugging information, and then
4196 processes all the link order information. This may cause it to
4197 close and reopen some input BFDs; I'll see how bad this is. */
4198
4199 boolean
4200 ecoff_bfd_final_link (abfd, info)
4201 bfd *abfd;
4202 struct bfd_link_info *info;
4203 {
4204 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4205 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4206 HDRR *symhdr;
4207 PTR handle;
4208 register bfd *input_bfd;
4209 asection *o;
4210 struct bfd_link_order *p;
4211
4212 /* We accumulate the debugging information counts in the symbolic
4213 header. */
4214 symhdr = &debug->symbolic_header;
4215 symhdr->vstamp = 0;
4216 symhdr->ilineMax = 0;
4217 symhdr->cbLine = 0;
4218 symhdr->idnMax = 0;
4219 symhdr->ipdMax = 0;
4220 symhdr->isymMax = 0;
4221 symhdr->ioptMax = 0;
4222 symhdr->iauxMax = 0;
4223 symhdr->issMax = 0;
4224 symhdr->issExtMax = 0;
4225 symhdr->ifdMax = 0;
4226 symhdr->crfd = 0;
4227 symhdr->iextMax = 0;
4228
4229 /* We accumulate the debugging information itself in the debug_info
4230 structure. */
4231 debug->line = NULL;
4232 debug->external_dnr = NULL;
4233 debug->external_pdr = NULL;
4234 debug->external_sym = NULL;
4235 debug->external_opt = NULL;
4236 debug->external_aux = NULL;
4237 debug->ss = NULL;
4238 debug->ssext = debug->ssext_end = NULL;
4239 debug->external_fdr = NULL;
4240 debug->external_rfd = NULL;
4241 debug->external_ext = debug->external_ext_end = NULL;
4242
4243 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4244 if (handle == (PTR) NULL)
4245 return false;
4246
4247 /* Accumulate the debugging symbols from each input BFD. */
4248 for (input_bfd = info->input_bfds;
4249 input_bfd != (bfd *) NULL;
4250 input_bfd = input_bfd->link_next)
4251 {
4252 boolean ret;
4253
4254 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4255 {
4256 /* Abitrarily set the symbolic header vstamp to the vstamp
4257 of the first object file in the link. */
4258 if (symhdr->vstamp == 0)
4259 symhdr->vstamp
4260 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4261 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4262 handle);
4263 }
4264 else
4265 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4266 debug, &backend->debug_swap,
4267 input_bfd, info);
4268 if (! ret)
4269 return false;
4270
4271 /* Combine the register masks. */
4272 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4273 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4274 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4275 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4276 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4277 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4278 }
4279
4280 /* Write out the external symbols. */
4281 ecoff_link_hash_traverse (ecoff_hash_table (info),
4282 ecoff_link_write_external,
4283 (PTR) abfd);
4284
4285 if (info->relocateable)
4286 {
4287 /* We need to make a pass over the link_orders to count up the
4288 number of relocations we will need to output, so that we know
4289 how much space they will take up. */
4290 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4291 {
4292 o->reloc_count = 0;
4293 for (p = o->link_order_head;
4294 p != (struct bfd_link_order *) NULL;
4295 p = p->next)
4296 if (p->type == bfd_indirect_link_order)
4297 o->reloc_count += p->u.indirect.section->reloc_count;
4298 else if (p->type == bfd_section_reloc_link_order
4299 || p->type == bfd_symbol_reloc_link_order)
4300 ++o->reloc_count;
4301 }
4302 }
4303
4304 /* Compute the reloc and symbol file positions. */
4305 ecoff_compute_reloc_file_positions (abfd);
4306
4307 /* Write out the debugging information. */
4308 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4309 &backend->debug_swap, info,
4310 ecoff_data (abfd)->sym_filepos))
4311 return false;
4312
4313 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4314
4315 if (info->relocateable)
4316 {
4317 /* Now reset the reloc_count field of the sections in the output
4318 BFD to 0, so that we can use them to keep track of how many
4319 relocs we have output thus far. */
4320 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4321 o->reloc_count = 0;
4322 }
4323
4324 /* Get a value for the GP register. */
4325 if (ecoff_data (abfd)->gp == 0)
4326 {
4327 struct bfd_link_hash_entry *h;
4328
4329 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
4330 if (h != (struct bfd_link_hash_entry *) NULL
4331 && h->type == bfd_link_hash_defined)
4332 ecoff_data (abfd)->gp = (h->u.def.value
4333 + h->u.def.section->output_section->vma
4334 + h->u.def.section->output_offset);
4335 else if (info->relocateable)
4336 {
4337 bfd_vma lo;
4338
4339 /* Make up a value. */
4340 lo = (bfd_vma) -1;
4341 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4342 {
4343 if (o->vma < lo
4344 && (strcmp (o->name, _SBSS) == 0
4345 || strcmp (o->name, _SDATA) == 0
4346 || strcmp (o->name, _LIT4) == 0
4347 || strcmp (o->name, _LIT8) == 0
4348 || strcmp (o->name, _LITA) == 0))
4349 lo = o->vma;
4350 }
4351 ecoff_data (abfd)->gp = lo + 0x8000;
4352 }
4353 else
4354 {
4355 /* If the relocate_section function needs to do a reloc
4356 involving the GP value, it should make a reloc_dangerous
4357 callback to warn that GP is not defined. */
4358 }
4359 }
4360
4361 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4362 {
4363 for (p = o->link_order_head;
4364 p != (struct bfd_link_order *) NULL;
4365 p = p->next)
4366 {
4367 if (p->type == bfd_indirect_link_order
4368 && (bfd_get_flavour (p->u.indirect.section->owner)
4369 == bfd_target_ecoff_flavour))
4370 {
4371 if (! ecoff_indirect_link_order (abfd, info, o, p))
4372 return false;
4373 }
4374 else if (p->type == bfd_section_reloc_link_order
4375 || p->type == bfd_symbol_reloc_link_order)
4376 {
4377 if (! ecoff_reloc_link_order (abfd, info, o, p))
4378 return false;
4379 }
4380 else
4381 {
4382 if (! _bfd_default_link_order (abfd, info, o, p))
4383 return false;
4384 }
4385 }
4386 }
4387
4388 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4389
4390 ecoff_data (abfd)->linker = true;
4391
4392 return true;
4393 }
4394
4395 /* Accumulate the debugging information for an input BFD into the
4396 output BFD. This must read in the symbolic information of the
4397 input BFD. */
4398
4399 static boolean
4400 ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle)
4401 bfd *output_bfd;
4402 bfd *input_bfd;
4403 struct bfd_link_info *info;
4404 PTR handle;
4405 {
4406 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
4407 const struct ecoff_debug_swap * const swap =
4408 &ecoff_backend (input_bfd)->debug_swap;
4409 HDRR *symhdr = &debug->symbolic_header;
4410 boolean ret;
4411
4412 #define READ(ptr, offset, count, size, type) \
4413 if (symhdr->count == 0) \
4414 debug->ptr = NULL; \
4415 else \
4416 { \
4417 debug->ptr = (type) malloc (size * symhdr->count); \
4418 if (debug->ptr == NULL) \
4419 { \
4420 bfd_set_error (bfd_error_no_memory); \
4421 ret = false; \
4422 goto return_something; \
4423 } \
4424 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4425 != 0) \
4426 || (bfd_read (debug->ptr, size, symhdr->count, \
4427 input_bfd) != size * symhdr->count)) \
4428 { \
4429 ret = false; \
4430 goto return_something; \
4431 } \
4432 }
4433
4434 /* If raw_syments is not NULL, then the data was already by read by
4435 ecoff_slurp_symbolic_info. */
4436 if (ecoff_data (input_bfd)->raw_syments == NULL)
4437 {
4438 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
4439 unsigned char *);
4440 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
4441 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
4442 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
4443 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
4444 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
4445 union aux_ext *);
4446 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
4447 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
4448 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
4449 }
4450 #undef READ
4451
4452 /* We do not read the external strings or the external symbols. */
4453
4454 ret = (bfd_ecoff_debug_accumulate
4455 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
4456 &ecoff_backend (output_bfd)->debug_swap,
4457 input_bfd, debug, swap, info));
4458
4459 return_something:
4460 if (ecoff_data (input_bfd)->raw_syments == NULL)
4461 {
4462 if (debug->line != NULL)
4463 free (debug->line);
4464 if (debug->external_dnr != NULL)
4465 free (debug->external_dnr);
4466 if (debug->external_pdr != NULL)
4467 free (debug->external_pdr);
4468 if (debug->external_sym != NULL)
4469 free (debug->external_sym);
4470 if (debug->external_opt != NULL)
4471 free (debug->external_opt);
4472 if (debug->external_aux != NULL)
4473 free (debug->external_aux);
4474 if (debug->ss != NULL)
4475 free (debug->ss);
4476 if (debug->external_fdr != NULL)
4477 free (debug->external_fdr);
4478 if (debug->external_rfd != NULL)
4479 free (debug->external_rfd);
4480
4481 /* Make sure we don't accidentally follow one of these pointers
4482 into freed memory. */
4483 debug->line = NULL;
4484 debug->external_dnr = NULL;
4485 debug->external_pdr = NULL;
4486 debug->external_sym = NULL;
4487 debug->external_opt = NULL;
4488 debug->external_aux = NULL;
4489 debug->ss = NULL;
4490 debug->external_fdr = NULL;
4491 debug->external_rfd = NULL;
4492 }
4493
4494 return ret;
4495 }
4496
4497 /* Put out information for an external symbol. These come only from
4498 the hash table. */
4499
4500 static boolean
4501 ecoff_link_write_external (h, data)
4502 struct ecoff_link_hash_entry *h;
4503 PTR data;
4504 {
4505 bfd *output_bfd = (bfd *) data;
4506
4507 /* FIXME: We should check if this symbol is being stripped. */
4508
4509 if (h->root.written)
4510 return true;
4511
4512 if (h->abfd == (bfd *) NULL)
4513 {
4514 h->esym.jmptbl = 0;
4515 h->esym.cobol_main = 0;
4516 h->esym.weakext = 0;
4517 h->esym.reserved = 0;
4518 h->esym.ifd = ifdNil;
4519 h->esym.asym.value = 0;
4520 h->esym.asym.st = stGlobal;
4521
4522 if (h->root.type != bfd_link_hash_defined)
4523 h->esym.asym.sc = scAbs;
4524 else
4525 {
4526 asection *output_section;
4527 const char *name;
4528
4529 output_section = h->root.u.def.section->output_section;
4530 name = bfd_section_name (output_section->owner, output_section);
4531
4532 if (strcmp (name, _TEXT) == 0)
4533 h->esym.asym.sc = scText;
4534 else if (strcmp (name, _DATA) == 0)
4535 h->esym.asym.sc = scData;
4536 else if (strcmp (name, _SDATA) == 0)
4537 h->esym.asym.sc = scSData;
4538 else if (strcmp (name, _RDATA) == 0)
4539 h->esym.asym.sc = scRData;
4540 else if (strcmp (name, _BSS) == 0)
4541 h->esym.asym.sc = scBss;
4542 else if (strcmp (name, _SBSS) == 0)
4543 h->esym.asym.sc = scSBss;
4544 else if (strcmp (name, _INIT) == 0)
4545 h->esym.asym.sc = scInit;
4546 else if (strcmp (name, _FINI) == 0)
4547 h->esym.asym.sc = scFini;
4548 else if (strcmp (name, _PDATA) == 0)
4549 h->esym.asym.sc = scPData;
4550 else if (strcmp (name, _XDATA) == 0)
4551 h->esym.asym.sc = scXData;
4552 else
4553 h->esym.asym.sc = scAbs;
4554 }
4555
4556 h->esym.asym.reserved = 0;
4557 h->esym.asym.index = indexNil;
4558 }
4559 else if (h->esym.ifd != -1)
4560 {
4561 struct ecoff_debug_info *debug;
4562
4563 /* Adjust the FDR index for the symbol by that used for the
4564 input BFD. */
4565 debug = &ecoff_data (h->abfd)->debug_info;
4566 BFD_ASSERT (h->esym.ifd >= 0
4567 && h->esym.ifd < debug->symbolic_header.ifdMax);
4568 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4569 }
4570
4571 switch (h->root.type)
4572 {
4573 default:
4574 case bfd_link_hash_new:
4575 abort ();
4576 case bfd_link_hash_undefined:
4577 case bfd_link_hash_weak:
4578 if (h->esym.asym.sc != scUndefined
4579 && h->esym.asym.sc != scSUndefined)
4580 h->esym.asym.sc = scUndefined;
4581 break;
4582 case bfd_link_hash_defined:
4583 if (h->esym.asym.sc == scUndefined
4584 || h->esym.asym.sc == scSUndefined)
4585 h->esym.asym.sc = scAbs;
4586 else if (h->esym.asym.sc == scCommon)
4587 h->esym.asym.sc = scBss;
4588 else if (h->esym.asym.sc == scSCommon)
4589 h->esym.asym.sc = scSBss;
4590 h->esym.asym.value = (h->root.u.def.value
4591 + h->root.u.def.section->output_section->vma
4592 + h->root.u.def.section->output_offset);
4593 break;
4594 case bfd_link_hash_common:
4595 if (h->esym.asym.sc != scCommon
4596 && h->esym.asym.sc != scSCommon)
4597 h->esym.asym.sc = scCommon;
4598 h->esym.asym.value = h->root.u.c.size;
4599 break;
4600 case bfd_link_hash_indirect:
4601 case bfd_link_hash_warning:
4602 /* FIXME: Ignore these for now. The circumstances under which
4603 they should be written out are not clear to me. */
4604 return true;
4605 }
4606
4607 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4608 symbol number. */
4609 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4610 h->root.written = true;
4611
4612 return (bfd_ecoff_debug_one_external
4613 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4614 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4615 &h->esym));
4616 }
4617
4618 /* Relocate and write an ECOFF section into an ECOFF output file. */
4619
4620 static boolean
4621 ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
4622 bfd *output_bfd;
4623 struct bfd_link_info *info;
4624 asection *output_section;
4625 struct bfd_link_order *link_order;
4626 {
4627 asection *input_section;
4628 bfd *input_bfd;
4629 struct ecoff_section_tdata *section_tdata;
4630 bfd_size_type raw_size;
4631 bfd_size_type cooked_size;
4632 bfd_byte *contents = NULL;
4633 bfd_size_type external_reloc_size;
4634 bfd_size_type external_relocs_size;
4635 PTR external_relocs = NULL;
4636
4637 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
4638
4639 if (link_order->size == 0)
4640 return true;
4641
4642 input_section = link_order->u.indirect.section;
4643 input_bfd = input_section->owner;
4644 section_tdata = ecoff_section_data (input_bfd, input_section);
4645
4646 raw_size = input_section->_raw_size;
4647 cooked_size = input_section->_cooked_size;
4648 if (cooked_size == 0)
4649 cooked_size = raw_size;
4650
4651 BFD_ASSERT (input_section->output_section == output_section);
4652 BFD_ASSERT (input_section->output_offset == link_order->offset);
4653 BFD_ASSERT (cooked_size == link_order->size);
4654
4655 /* Get the section contents. We allocate memory for the larger of
4656 the size before relocating and the size after relocating. */
4657 contents = (bfd_byte *) malloc (raw_size >= cooked_size
4658 ? raw_size
4659 : cooked_size);
4660 if (contents == NULL && raw_size != 0)
4661 {
4662 bfd_set_error (bfd_error_no_memory);
4663 goto error_return;
4664 }
4665
4666 /* If we are relaxing, the contents may have already been read into
4667 memory, in which case we copy them into our new buffer. We don't
4668 simply reuse the old buffer in case cooked_size > raw_size. */
4669 if (section_tdata != (struct ecoff_section_tdata *) NULL
4670 && section_tdata->contents != (bfd_byte *) NULL)
4671 memcpy (contents, section_tdata->contents, raw_size);
4672 else
4673 {
4674 if (! bfd_get_section_contents (input_bfd, input_section,
4675 (PTR) contents,
4676 (file_ptr) 0, raw_size))
4677 goto error_return;
4678 }
4679
4680 /* Get the relocs. If we are relaxing MIPS code, they will already
4681 have been read in. Otherwise, we read them in now. */
4682 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
4683 external_relocs_size = external_reloc_size * input_section->reloc_count;
4684
4685 if (section_tdata != (struct ecoff_section_tdata *) NULL)
4686 external_relocs = section_tdata->external_relocs;
4687 else
4688 {
4689 external_relocs = (PTR) malloc (external_relocs_size);
4690 if (external_relocs == NULL && external_relocs_size != 0)
4691 {
4692 bfd_set_error (bfd_error_no_memory);
4693 goto error_return;
4694 }
4695
4696 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
4697 || (bfd_read (external_relocs, 1, external_relocs_size, input_bfd)
4698 != external_relocs_size))
4699 goto error_return;
4700 }
4701
4702 /* Relocate the section contents. */
4703 if (! ((*ecoff_backend (input_bfd)->relocate_section)
4704 (output_bfd, info, input_bfd, input_section, contents,
4705 external_relocs)))
4706 goto error_return;
4707
4708 /* Write out the relocated section. */
4709 if (! bfd_set_section_contents (output_bfd,
4710 output_section,
4711 (PTR) contents,
4712 input_section->output_offset,
4713 cooked_size))
4714 goto error_return;
4715
4716 /* If we are producing relocateable output, the relocs were
4717 modified, and we write them out now. We use the reloc_count
4718 field of output_section to keep track of the number of relocs we
4719 have output so far. */
4720 if (info->relocateable)
4721 {
4722 if (bfd_seek (output_bfd,
4723 (output_section->rel_filepos +
4724 output_section->reloc_count * external_reloc_size),
4725 SEEK_SET) != 0
4726 || (bfd_write (external_relocs, 1, external_relocs_size, output_bfd)
4727 != external_relocs_size))
4728 goto error_return;
4729 output_section->reloc_count += input_section->reloc_count;
4730 }
4731
4732 if (contents != NULL)
4733 free (contents);
4734 if (external_relocs != NULL && section_tdata == NULL)
4735 free (external_relocs);
4736 return true;
4737
4738 error_return:
4739 if (contents != NULL)
4740 free (contents);
4741 if (external_relocs != NULL && section_tdata == NULL)
4742 free (external_relocs);
4743 return false;
4744 }
4745
4746 /* Generate a reloc when linking an ECOFF file. This is a reloc
4747 requested by the linker, and does come from any input file. This
4748 is used to build constructor and destructor tables when linking
4749 with -Ur. */
4750
4751 static boolean
4752 ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
4753 bfd *output_bfd;
4754 struct bfd_link_info *info;
4755 asection *output_section;
4756 struct bfd_link_order *link_order;
4757 {
4758 arelent rel;
4759 struct internal_reloc in;
4760 bfd_size_type external_reloc_size;
4761 bfd_byte *rbuf;
4762 boolean ok;
4763
4764 /* We set up an arelent to pass to the backend adjust_reloc_out
4765 routine. */
4766 rel.address = link_order->offset;
4767
4768 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4769 if (rel.howto == (const reloc_howto_type *) NULL)
4770 {
4771 bfd_set_error (bfd_error_bad_value);
4772 return false;
4773 }
4774
4775 if (link_order->type == bfd_section_reloc_link_order)
4776 rel.sym_ptr_ptr = link_order->u.reloc.p->u.section->symbol_ptr_ptr;
4777 else
4778 {
4779 /* We can't set up a reloc against a symbol correctly, because
4780 we have no asymbol structure. Currently no adjust_reloc_out
4781 routine cases. */
4782 rel.sym_ptr_ptr = (asymbol **) NULL;
4783 }
4784
4785 /* All ECOFF relocs are in-place. Put the addend into the object
4786 file. */
4787
4788 BFD_ASSERT (rel.howto->partial_inplace);
4789 if (link_order->u.reloc.p->addend != 0)
4790 {
4791 bfd_size_type size;
4792 bfd_reloc_status_type rstat;
4793 bfd_byte *buf;
4794 boolean ok;
4795
4796 size = bfd_get_reloc_size (rel.howto);
4797 buf = (bfd_byte *) bfd_zmalloc (size);
4798 if (buf == (bfd_byte *) NULL)
4799 {
4800 bfd_set_error (bfd_error_no_memory);
4801 return false;
4802 }
4803 rstat = _bfd_relocate_contents (rel.howto, output_bfd,
4804 link_order->u.reloc.p->addend, buf);
4805 switch (rstat)
4806 {
4807 case bfd_reloc_ok:
4808 break;
4809 default:
4810 case bfd_reloc_outofrange:
4811 abort ();
4812 case bfd_reloc_overflow:
4813 if (! ((*info->callbacks->reloc_overflow)
4814 (info,
4815 (link_order->type == bfd_section_reloc_link_order
4816 ? bfd_section_name (output_bfd,
4817 link_order->u.reloc.p->u.section)
4818 : link_order->u.reloc.p->u.name),
4819 rel.howto->name, link_order->u.reloc.p->addend,
4820 (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
4821 {
4822 free (buf);
4823 return false;
4824 }
4825 break;
4826 }
4827 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
4828 (file_ptr) link_order->offset, size);
4829 free (buf);
4830 if (! ok)
4831 return false;
4832 }
4833
4834 rel.addend = 0;
4835
4836 /* Move the information into a internal_reloc structure. */
4837 in.r_vaddr = (rel.address
4838 + bfd_get_section_vma (output_bfd, output_section));
4839 in.r_type = rel.howto->type;
4840
4841 if (link_order->type == bfd_symbol_reloc_link_order)
4842 {
4843 struct ecoff_link_hash_entry *h;
4844
4845 h = ecoff_link_hash_lookup (ecoff_hash_table (info),
4846 link_order->u.reloc.p->u.name,
4847 false, false, true);
4848 if (h != (struct ecoff_link_hash_entry *) NULL
4849 && h->indx != -1)
4850 in.r_symndx = h->indx;
4851 else
4852 {
4853 if (! ((*info->callbacks->unattached_reloc)
4854 (info, link_order->u.reloc.p->u.name, (bfd *) NULL,
4855 (asection *) NULL, (bfd_vma) 0)))
4856 return false;
4857 in.r_symndx = 0;
4858 }
4859 in.r_extern = 1;
4860 }
4861 else
4862 {
4863 CONST char *name;
4864
4865 name = bfd_get_section_name (output_bfd,
4866 link_order->u.reloc.p->u.section);
4867 if (strcmp (name, ".text") == 0)
4868 in.r_symndx = RELOC_SECTION_TEXT;
4869 else if (strcmp (name, ".rdata") == 0)
4870 in.r_symndx = RELOC_SECTION_RDATA;
4871 else if (strcmp (name, ".data") == 0)
4872 in.r_symndx = RELOC_SECTION_DATA;
4873 else if (strcmp (name, ".sdata") == 0)
4874 in.r_symndx = RELOC_SECTION_SDATA;
4875 else if (strcmp (name, ".sbss") == 0)
4876 in.r_symndx = RELOC_SECTION_SBSS;
4877 else if (strcmp (name, ".bss") == 0)
4878 in.r_symndx = RELOC_SECTION_BSS;
4879 else if (strcmp (name, ".init") == 0)
4880 in.r_symndx = RELOC_SECTION_INIT;
4881 else if (strcmp (name, ".lit8") == 0)
4882 in.r_symndx = RELOC_SECTION_LIT8;
4883 else if (strcmp (name, ".lit4") == 0)
4884 in.r_symndx = RELOC_SECTION_LIT4;
4885 else if (strcmp (name, ".xdata") == 0)
4886 in.r_symndx = RELOC_SECTION_XDATA;
4887 else if (strcmp (name, ".pdata") == 0)
4888 in.r_symndx = RELOC_SECTION_PDATA;
4889 else if (strcmp (name, ".fini") == 0)
4890 in.r_symndx = RELOC_SECTION_FINI;
4891 else if (strcmp (name, ".lita") == 0)
4892 in.r_symndx = RELOC_SECTION_LITA;
4893 else if (strcmp (name, "*ABS*") == 0)
4894 in.r_symndx = RELOC_SECTION_ABS;
4895 else
4896 abort ();
4897 in.r_extern = 0;
4898 }
4899
4900 /* Let the BFD backend adjust the reloc. */
4901 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4902
4903 /* Get some memory and swap out the reloc. */
4904 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4905 rbuf = (bfd_byte *) malloc (external_reloc_size);
4906 if (rbuf == (bfd_byte *) NULL)
4907 {
4908 bfd_set_error (bfd_error_no_memory);
4909 return false;
4910 }
4911
4912 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (PTR) rbuf);
4913
4914 ok = (bfd_seek (output_bfd,
4915 (output_section->rel_filepos +
4916 output_section->reloc_count * external_reloc_size),
4917 SEEK_SET) == 0
4918 && (bfd_write ((PTR) rbuf, 1, external_reloc_size, output_bfd)
4919 == external_reloc_size));
4920
4921 if (ok)
4922 ++output_section->reloc_count;
4923
4924 free (rbuf);
4925
4926 return ok;
4927 }