v9, vms changes and some stuff i checked in recently but didn't log
[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 ret->written = 0;
3579 ret->small = 0;
3580 }
3581 memset ((PTR) &ret->esym, 0, sizeof ret->esym);
3582
3583 return (struct bfd_hash_entry *) ret;
3584 }
3585
3586 /* Create an ECOFF link hash table. */
3587
3588 struct bfd_link_hash_table *
3589 ecoff_bfd_link_hash_table_create (abfd)
3590 bfd *abfd;
3591 {
3592 struct ecoff_link_hash_table *ret;
3593
3594 ret = ((struct ecoff_link_hash_table *)
3595 malloc (sizeof (struct ecoff_link_hash_table)));
3596 if (!ret)
3597 {
3598 bfd_set_error (bfd_error_no_memory);
3599 return NULL;
3600 }
3601 if (! _bfd_link_hash_table_init (&ret->root, abfd,
3602 ecoff_link_hash_newfunc))
3603 {
3604 free (ret);
3605 return (struct bfd_link_hash_table *) NULL;
3606 }
3607 return &ret->root;
3608 }
3609
3610 /* Look up an entry in an ECOFF link hash table. */
3611
3612 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3613 ((struct ecoff_link_hash_entry *) \
3614 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3615
3616 /* Traverse an ECOFF link hash table. */
3617
3618 #define ecoff_link_hash_traverse(table, func, info) \
3619 (bfd_link_hash_traverse \
3620 (&(table)->root, \
3621 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3622 (info)))
3623
3624 /* Get the ECOFF link hash table from the info structure. This is
3625 just a cast. */
3626
3627 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3628
3629 /* Given an ECOFF BFD, add symbols to the global hash table as
3630 appropriate. */
3631
3632 boolean
3633 ecoff_bfd_link_add_symbols (abfd, info)
3634 bfd *abfd;
3635 struct bfd_link_info *info;
3636 {
3637 switch (bfd_get_format (abfd))
3638 {
3639 case bfd_object:
3640 return ecoff_link_add_object_symbols (abfd, info);
3641 case bfd_archive:
3642 return ecoff_link_add_archive_symbols (abfd, info);
3643 default:
3644 bfd_set_error (bfd_error_wrong_format);
3645 return false;
3646 }
3647 }
3648
3649 /* Add the symbols from an archive file to the global hash table.
3650 This looks through the undefined symbols, looks each one up in the
3651 archive hash table, and adds any associated object file. We do not
3652 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3653 already have a hash table, so there is no reason to construct
3654 another one. */
3655
3656 static boolean
3657 ecoff_link_add_archive_symbols (abfd, info)
3658 bfd *abfd;
3659 struct bfd_link_info *info;
3660 {
3661 const bfd_byte *raw_armap;
3662 struct bfd_link_hash_entry **pundef;
3663 unsigned int armap_count;
3664 unsigned int armap_log;
3665 unsigned int i;
3666 const bfd_byte *hashtable;
3667 const char *stringbase;
3668
3669 if (! bfd_has_map (abfd))
3670 {
3671 bfd_set_error (bfd_error_no_symbols);
3672 return false;
3673 }
3674
3675 /* If we don't have any raw data for this archive, as can happen on
3676 Irix 4.0.5F, we call the generic routine.
3677 FIXME: We should be more clever about this, since someday tdata
3678 may get to something for a generic archive. */
3679 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3680 if (raw_armap == (bfd_byte *) NULL)
3681 return (_bfd_generic_link_add_archive_symbols
3682 (abfd, info, ecoff_link_check_archive_element));
3683
3684 armap_count = bfd_h_get_32 (abfd, raw_armap);
3685
3686 armap_log = 0;
3687 for (i = 1; i < armap_count; i <<= 1)
3688 armap_log++;
3689 BFD_ASSERT (i == armap_count);
3690
3691 hashtable = raw_armap + 4;
3692 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3693
3694 /* Look through the list of undefined symbols. */
3695 pundef = &info->hash->undefs;
3696 while (*pundef != (struct bfd_link_hash_entry *) NULL)
3697 {
3698 struct bfd_link_hash_entry *h;
3699 unsigned int hash, rehash;
3700 unsigned int file_offset;
3701 const char *name;
3702 bfd *element;
3703
3704 h = *pundef;
3705
3706 /* When a symbol is defined, it is not necessarily removed from
3707 the list. */
3708 if (h->type != bfd_link_hash_undefined
3709 && h->type != bfd_link_hash_common)
3710 {
3711 /* Remove this entry from the list, for general cleanliness
3712 and because we are going to look through the list again
3713 if we search any more libraries. We can't remove the
3714 entry if it is the tail, because that would lose any
3715 entries we add to the list later on. */
3716 if (*pundef != info->hash->undefs_tail)
3717 *pundef = (*pundef)->next;
3718 else
3719 pundef = &(*pundef)->next;
3720 continue;
3721 }
3722
3723 /* Native ECOFF linkers do not pull in archive elements merely
3724 to satisfy common definitions, so neither do we. We leave
3725 them on the list, though, in case we are linking against some
3726 other object format. */
3727 if (h->type != bfd_link_hash_undefined)
3728 {
3729 pundef = &(*pundef)->next;
3730 continue;
3731 }
3732
3733 /* Look for this symbol in the archive hash table. */
3734 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3735 armap_log);
3736
3737 file_offset = bfd_h_get_32 (abfd, hashtable + (hash * 8) + 4);
3738 if (file_offset == 0)
3739 {
3740 /* Nothing in this slot. */
3741 pundef = &(*pundef)->next;
3742 continue;
3743 }
3744
3745 name = stringbase + bfd_h_get_32 (abfd, hashtable + (hash * 8));
3746 if (name[0] != h->root.string[0]
3747 || strcmp (name, h->root.string) != 0)
3748 {
3749 unsigned int srch;
3750 boolean found;
3751
3752 /* That was the wrong symbol. Try rehashing. */
3753 found = false;
3754 for (srch = (hash + rehash) & (armap_count - 1);
3755 srch != hash;
3756 srch = (srch + rehash) & (armap_count - 1))
3757 {
3758 file_offset = bfd_h_get_32 (abfd, hashtable + (srch * 8) + 4);
3759 if (file_offset == 0)
3760 break;
3761 name = stringbase + bfd_h_get_32 (abfd, hashtable + (srch * 8));
3762 if (name[0] == h->root.string[0]
3763 && strcmp (name, h->root.string) == 0)
3764 {
3765 found = true;
3766 break;
3767 }
3768 }
3769
3770 if (! found)
3771 {
3772 pundef = &(*pundef)->next;
3773 continue;
3774 }
3775
3776 hash = srch;
3777 }
3778
3779 element = _bfd_get_elt_at_filepos (abfd, file_offset);
3780 if (element == (bfd *) NULL)
3781 return false;
3782
3783 if (! bfd_check_format (element, bfd_object))
3784 return false;
3785
3786 /* Unlike the generic linker, we know that this element provides
3787 a definition for an undefined symbol and we know that we want
3788 to include it. We don't need to check anything. */
3789 if (! (*info->callbacks->add_archive_element) (info, element, name))
3790 return false;
3791 if (! ecoff_link_add_object_symbols (element, info))
3792 return false;
3793
3794 pundef = &(*pundef)->next;
3795 }
3796
3797 return true;
3798 }
3799
3800 /* This is called if we used _bfd_generic_link_add_archive_symbols
3801 because we were not dealing with an ECOFF archive. */
3802
3803 static boolean
3804 ecoff_link_check_archive_element (abfd, info, pneeded)
3805 bfd *abfd;
3806 struct bfd_link_info *info;
3807 boolean *pneeded;
3808 {
3809 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3810 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
3811 = backend->debug_swap.swap_ext_in;
3812 HDRR *symhdr;
3813 bfd_size_type external_ext_size;
3814 PTR external_ext = NULL;
3815 size_t esize;
3816 char *ssext = NULL;
3817 char *ext_ptr;
3818 char *ext_end;
3819
3820 *pneeded = false;
3821
3822 if (! ecoff_slurp_symbolic_header (abfd))
3823 goto error_return;
3824
3825 /* If there are no symbols, we don't want it. */
3826 if (bfd_get_symcount (abfd) == 0)
3827 goto successful_return;
3828
3829 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3830
3831 /* Read in the external symbols and external strings. */
3832 external_ext_size = backend->debug_swap.external_ext_size;
3833 esize = symhdr->iextMax * external_ext_size;
3834 external_ext = (PTR) malloc (esize);
3835 if (external_ext == NULL && esize != 0)
3836 {
3837 bfd_set_error (bfd_error_no_memory);
3838 goto error_return;
3839 }
3840
3841 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3842 || bfd_read (external_ext, 1, esize, abfd) != esize)
3843 goto error_return;
3844
3845 ssext = (char *) malloc (symhdr->issExtMax);
3846 if (ssext == NULL && symhdr->issExtMax != 0)
3847 {
3848 bfd_set_error (bfd_error_no_memory);
3849 goto error_return;
3850 }
3851
3852 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3853 || bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
3854 goto error_return;
3855
3856 /* Look through the external symbols to see if they define some
3857 symbol that is currently undefined. */
3858 ext_ptr = (char *) external_ext;
3859 ext_end = ext_ptr + esize;
3860 for (; ext_ptr < ext_end; ext_ptr += external_ext_size)
3861 {
3862 EXTR esym;
3863 boolean def;
3864 const char *name;
3865 struct bfd_link_hash_entry *h;
3866
3867 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
3868
3869 /* See if this symbol defines something. */
3870 if (esym.asym.st != stGlobal
3871 && esym.asym.st != stLabel
3872 && esym.asym.st != stProc)
3873 continue;
3874
3875 switch (esym.asym.sc)
3876 {
3877 case scText:
3878 case scData:
3879 case scBss:
3880 case scAbs:
3881 case scSData:
3882 case scSBss:
3883 case scRData:
3884 case scCommon:
3885 case scSCommon:
3886 case scInit:
3887 case scFini:
3888 def = true;
3889 break;
3890 default:
3891 def = false;
3892 break;
3893 }
3894
3895 if (! def)
3896 continue;
3897
3898 name = ssext + esym.asym.iss;
3899 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
3900
3901 /* Unlike the generic linker, we do not pull in elements because
3902 of common symbols. */
3903 if (h == (struct bfd_link_hash_entry *) NULL
3904 || h->type != bfd_link_hash_undefined)
3905 continue;
3906
3907 /* Include this element. */
3908 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
3909 goto error_return;
3910 if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
3911 goto error_return;
3912
3913 *pneeded = true;
3914 goto successful_return;
3915 }
3916
3917 successful_return:
3918 if (external_ext != NULL)
3919 free (external_ext);
3920 if (ssext != NULL)
3921 free (ssext);
3922 return true;
3923 error_return:
3924 if (external_ext != NULL)
3925 free (external_ext);
3926 if (ssext != NULL)
3927 free (ssext);
3928 return false;
3929 }
3930
3931 /* Add symbols from an ECOFF object file to the global linker hash
3932 table. */
3933
3934 static boolean
3935 ecoff_link_add_object_symbols (abfd, info)
3936 bfd *abfd;
3937 struct bfd_link_info *info;
3938 {
3939 HDRR *symhdr;
3940 bfd_size_type external_ext_size;
3941 PTR external_ext = NULL;
3942 size_t esize;
3943 char *ssext = NULL;
3944 boolean result;
3945
3946 if (! ecoff_slurp_symbolic_header (abfd))
3947 return false;
3948
3949 /* If there are no symbols, we don't want it. */
3950 if (bfd_get_symcount (abfd) == 0)
3951 return true;
3952
3953 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3954
3955 /* Read in the external symbols and external strings. */
3956 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3957 esize = symhdr->iextMax * external_ext_size;
3958 external_ext = (PTR) malloc (esize);
3959 if (external_ext == NULL && esize != 0)
3960 {
3961 bfd_set_error (bfd_error_no_memory);
3962 goto error_return;
3963 }
3964
3965 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3966 || bfd_read (external_ext, 1, esize, abfd) != esize)
3967 goto error_return;
3968
3969 ssext = (char *) malloc (symhdr->issExtMax);
3970 if (ssext == NULL && symhdr->issExtMax != 0)
3971 {
3972 bfd_set_error (bfd_error_no_memory);
3973 goto error_return;
3974 }
3975
3976 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3977 || bfd_read (ssext, 1, symhdr->issExtMax, abfd) != symhdr->issExtMax)
3978 goto error_return;
3979
3980 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3981
3982 if (ssext != NULL)
3983 free (ssext);
3984 if (external_ext != NULL)
3985 free (external_ext);
3986 return result;
3987
3988 error_return:
3989 if (ssext != NULL)
3990 free (ssext);
3991 if (external_ext != NULL)
3992 free (external_ext);
3993 return false;
3994 }
3995
3996 /* Add the external symbols of an object file to the global linker
3997 hash table. The external symbols and strings we are passed are
3998 just allocated on the stack, and will be discarded. We must
3999 explicitly save any information we may need later on in the link.
4000 We do not want to read the external symbol information again. */
4001
4002 static boolean
4003 ecoff_link_add_externals (abfd, info, external_ext, ssext)
4004 bfd *abfd;
4005 struct bfd_link_info *info;
4006 PTR external_ext;
4007 char *ssext;
4008 {
4009 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4010 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
4011 = backend->debug_swap.swap_ext_in;
4012 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
4013 unsigned long ext_count;
4014 struct ecoff_link_hash_entry **sym_hash;
4015 char *ext_ptr;
4016 char *ext_end;
4017
4018 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
4019
4020 sym_hash = ((struct ecoff_link_hash_entry **)
4021 bfd_alloc (abfd,
4022 ext_count * sizeof (struct bfd_link_hash_entry *)));
4023 if (!sym_hash)
4024 {
4025 bfd_set_error (bfd_error_no_memory);
4026 return false;
4027 }
4028 ecoff_data (abfd)->sym_hashes = sym_hash;
4029
4030 ext_ptr = (char *) external_ext;
4031 ext_end = ext_ptr + ext_count * external_ext_size;
4032 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
4033 {
4034 EXTR esym;
4035 boolean skip;
4036 bfd_vma value;
4037 asection *section;
4038 const char *name;
4039 struct ecoff_link_hash_entry *h;
4040
4041 *sym_hash = NULL;
4042
4043 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
4044
4045 /* Skip debugging symbols. */
4046 skip = false;
4047 switch (esym.asym.st)
4048 {
4049 case stGlobal:
4050 case stStatic:
4051 case stLabel:
4052 case stProc:
4053 case stStaticProc:
4054 break;
4055 default:
4056 skip = true;
4057 break;
4058 }
4059
4060 if (skip)
4061 continue;
4062
4063 /* Get the information for this symbol. */
4064 value = esym.asym.value;
4065 switch (esym.asym.sc)
4066 {
4067 default:
4068 case scNil:
4069 case scRegister:
4070 case scCdbLocal:
4071 case scBits:
4072 case scCdbSystem:
4073 case scRegImage:
4074 case scInfo:
4075 case scUserStruct:
4076 case scVar:
4077 case scVarRegister:
4078 case scVariant:
4079 case scBasedVar:
4080 case scXData:
4081 case scPData:
4082 section = NULL;
4083 break;
4084 case scText:
4085 section = bfd_make_section_old_way (abfd, ".text");
4086 value -= section->vma;
4087 break;
4088 case scData:
4089 section = bfd_make_section_old_way (abfd, ".data");
4090 value -= section->vma;
4091 break;
4092 case scBss:
4093 section = bfd_make_section_old_way (abfd, ".bss");
4094 value -= section->vma;
4095 break;
4096 case scAbs:
4097 section = &bfd_abs_section;
4098 break;
4099 case scUndefined:
4100 section = &bfd_und_section;
4101 break;
4102 case scSData:
4103 section = bfd_make_section_old_way (abfd, ".sdata");
4104 value -= section->vma;
4105 break;
4106 case scSBss:
4107 section = bfd_make_section_old_way (abfd, ".sbss");
4108 value -= section->vma;
4109 break;
4110 case scRData:
4111 section = bfd_make_section_old_way (abfd, ".rdata");
4112 value -= section->vma;
4113 break;
4114 case scCommon:
4115 if (value > ecoff_data (abfd)->gp_size)
4116 {
4117 section = &bfd_com_section;
4118 break;
4119 }
4120 /* Fall through. */
4121 case scSCommon:
4122 if (ecoff_scom_section.name == NULL)
4123 {
4124 /* Initialize the small common section. */
4125 ecoff_scom_section.name = SCOMMON;
4126 ecoff_scom_section.flags = SEC_IS_COMMON;
4127 ecoff_scom_section.output_section = &ecoff_scom_section;
4128 ecoff_scom_section.symbol = &ecoff_scom_symbol;
4129 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
4130 ecoff_scom_symbol.name = SCOMMON;
4131 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
4132 ecoff_scom_symbol.section = &ecoff_scom_section;
4133 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
4134 }
4135 section = &ecoff_scom_section;
4136 break;
4137 case scSUndefined:
4138 section = &bfd_und_section;
4139 break;
4140 case scInit:
4141 section = bfd_make_section_old_way (abfd, ".init");
4142 value -= section->vma;
4143 break;
4144 case scFini:
4145 section = bfd_make_section_old_way (abfd, ".fini");
4146 value -= section->vma;
4147 break;
4148 }
4149
4150 if (section == (asection *) NULL)
4151 continue;
4152
4153 name = ssext + esym.asym.iss;
4154
4155 h = NULL;
4156 if (! (_bfd_generic_link_add_one_symbol
4157 (info, abfd, name, BSF_GLOBAL, section, value,
4158 (const char *) NULL, true, true,
4159 (struct bfd_link_hash_entry **) &h)))
4160 return false;
4161
4162 *sym_hash = h;
4163
4164 /* If we are building an ECOFF hash table, save the external
4165 symbol information. */
4166 if (info->hash->creator->flavour == bfd_get_flavour (abfd))
4167 {
4168 if (h->abfd == (bfd *) NULL
4169 || (section != &bfd_und_section
4170 && (! bfd_is_com_section (section)
4171 || h->root.type != bfd_link_hash_defined)))
4172 {
4173 h->abfd = abfd;
4174 h->esym = esym;
4175 }
4176
4177 /* Remember whether this symbol was small undefined. */
4178 if (esym.asym.sc == scSUndefined)
4179 h->small = 1;
4180
4181 /* If this symbol was ever small undefined, it needs to wind
4182 up in a GP relative section. We can't control the
4183 section of a defined symbol, but we can control the
4184 section of a common symbol. This case is actually needed
4185 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4186 if (h->small
4187 && h->root.type == bfd_link_hash_common
4188 && strcmp (h->root.u.c.section->name, SCOMMON) != 0)
4189 {
4190 h->root.u.c.section = bfd_make_section_old_way (abfd, SCOMMON);
4191 h->root.u.c.section->flags = SEC_ALLOC;
4192 if (h->esym.asym.sc == scCommon)
4193 h->esym.asym.sc = scSCommon;
4194 }
4195 }
4196 }
4197
4198 return true;
4199 }
4200 \f
4201 /* ECOFF final link routines. */
4202
4203 static boolean ecoff_final_link_debug_accumulate
4204 PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *,
4205 PTR handle));
4206 static boolean ecoff_link_write_external
4207 PARAMS ((struct ecoff_link_hash_entry *, PTR));
4208 static boolean ecoff_indirect_link_order
4209 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4210 struct bfd_link_order *));
4211 static boolean ecoff_reloc_link_order
4212 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4213 struct bfd_link_order *));
4214
4215 /* ECOFF final link routine. This looks through all the input BFDs
4216 and gathers together all the debugging information, and then
4217 processes all the link order information. This may cause it to
4218 close and reopen some input BFDs; I'll see how bad this is. */
4219
4220 boolean
4221 ecoff_bfd_final_link (abfd, info)
4222 bfd *abfd;
4223 struct bfd_link_info *info;
4224 {
4225 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4226 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4227 HDRR *symhdr;
4228 PTR handle;
4229 register bfd *input_bfd;
4230 asection *o;
4231 struct bfd_link_order *p;
4232
4233 /* We accumulate the debugging information counts in the symbolic
4234 header. */
4235 symhdr = &debug->symbolic_header;
4236 symhdr->vstamp = 0;
4237 symhdr->ilineMax = 0;
4238 symhdr->cbLine = 0;
4239 symhdr->idnMax = 0;
4240 symhdr->ipdMax = 0;
4241 symhdr->isymMax = 0;
4242 symhdr->ioptMax = 0;
4243 symhdr->iauxMax = 0;
4244 symhdr->issMax = 0;
4245 symhdr->issExtMax = 0;
4246 symhdr->ifdMax = 0;
4247 symhdr->crfd = 0;
4248 symhdr->iextMax = 0;
4249
4250 /* We accumulate the debugging information itself in the debug_info
4251 structure. */
4252 debug->line = NULL;
4253 debug->external_dnr = NULL;
4254 debug->external_pdr = NULL;
4255 debug->external_sym = NULL;
4256 debug->external_opt = NULL;
4257 debug->external_aux = NULL;
4258 debug->ss = NULL;
4259 debug->ssext = debug->ssext_end = NULL;
4260 debug->external_fdr = NULL;
4261 debug->external_rfd = NULL;
4262 debug->external_ext = debug->external_ext_end = NULL;
4263
4264 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4265 if (handle == (PTR) NULL)
4266 return false;
4267
4268 /* Accumulate the debugging symbols from each input BFD. */
4269 for (input_bfd = info->input_bfds;
4270 input_bfd != (bfd *) NULL;
4271 input_bfd = input_bfd->link_next)
4272 {
4273 boolean ret;
4274
4275 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4276 {
4277 /* Abitrarily set the symbolic header vstamp to the vstamp
4278 of the first object file in the link. */
4279 if (symhdr->vstamp == 0)
4280 symhdr->vstamp
4281 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4282 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4283 handle);
4284 }
4285 else
4286 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4287 debug, &backend->debug_swap,
4288 input_bfd, info);
4289 if (! ret)
4290 return false;
4291
4292 /* Combine the register masks. */
4293 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4294 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4295 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4296 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4297 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4298 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4299 }
4300
4301 /* Write out the external symbols. */
4302 ecoff_link_hash_traverse (ecoff_hash_table (info),
4303 ecoff_link_write_external,
4304 (PTR) abfd);
4305
4306 if (info->relocateable)
4307 {
4308 /* We need to make a pass over the link_orders to count up the
4309 number of relocations we will need to output, so that we know
4310 how much space they will take up. */
4311 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4312 {
4313 o->reloc_count = 0;
4314 for (p = o->link_order_head;
4315 p != (struct bfd_link_order *) NULL;
4316 p = p->next)
4317 if (p->type == bfd_indirect_link_order)
4318 o->reloc_count += p->u.indirect.section->reloc_count;
4319 else if (p->type == bfd_section_reloc_link_order
4320 || p->type == bfd_symbol_reloc_link_order)
4321 ++o->reloc_count;
4322 }
4323 }
4324
4325 /* Compute the reloc and symbol file positions. */
4326 ecoff_compute_reloc_file_positions (abfd);
4327
4328 /* Write out the debugging information. */
4329 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4330 &backend->debug_swap, info,
4331 ecoff_data (abfd)->sym_filepos))
4332 return false;
4333
4334 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4335
4336 if (info->relocateable)
4337 {
4338 /* Now reset the reloc_count field of the sections in the output
4339 BFD to 0, so that we can use them to keep track of how many
4340 relocs we have output thus far. */
4341 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4342 o->reloc_count = 0;
4343 }
4344
4345 /* Get a value for the GP register. */
4346 if (ecoff_data (abfd)->gp == 0)
4347 {
4348 struct bfd_link_hash_entry *h;
4349
4350 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
4351 if (h != (struct bfd_link_hash_entry *) NULL
4352 && h->type == bfd_link_hash_defined)
4353 ecoff_data (abfd)->gp = (h->u.def.value
4354 + h->u.def.section->output_section->vma
4355 + h->u.def.section->output_offset);
4356 else if (info->relocateable)
4357 {
4358 bfd_vma lo;
4359
4360 /* Make up a value. */
4361 lo = (bfd_vma) -1;
4362 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4363 {
4364 if (o->vma < lo
4365 && (strcmp (o->name, _SBSS) == 0
4366 || strcmp (o->name, _SDATA) == 0
4367 || strcmp (o->name, _LIT4) == 0
4368 || strcmp (o->name, _LIT8) == 0
4369 || strcmp (o->name, _LITA) == 0))
4370 lo = o->vma;
4371 }
4372 ecoff_data (abfd)->gp = lo + 0x8000;
4373 }
4374 else
4375 {
4376 /* If the relocate_section function needs to do a reloc
4377 involving the GP value, it should make a reloc_dangerous
4378 callback to warn that GP is not defined. */
4379 }
4380 }
4381
4382 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4383 {
4384 for (p = o->link_order_head;
4385 p != (struct bfd_link_order *) NULL;
4386 p = p->next)
4387 {
4388 if (p->type == bfd_indirect_link_order
4389 && (bfd_get_flavour (p->u.indirect.section->owner)
4390 == bfd_target_ecoff_flavour))
4391 {
4392 if (! ecoff_indirect_link_order (abfd, info, o, p))
4393 return false;
4394 }
4395 else if (p->type == bfd_section_reloc_link_order
4396 || p->type == bfd_symbol_reloc_link_order)
4397 {
4398 if (! ecoff_reloc_link_order (abfd, info, o, p))
4399 return false;
4400 }
4401 else
4402 {
4403 if (! _bfd_default_link_order (abfd, info, o, p))
4404 return false;
4405 }
4406 }
4407 }
4408
4409 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4410
4411 ecoff_data (abfd)->linker = true;
4412
4413 return true;
4414 }
4415
4416 /* Accumulate the debugging information for an input BFD into the
4417 output BFD. This must read in the symbolic information of the
4418 input BFD. */
4419
4420 static boolean
4421 ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle)
4422 bfd *output_bfd;
4423 bfd *input_bfd;
4424 struct bfd_link_info *info;
4425 PTR handle;
4426 {
4427 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
4428 const struct ecoff_debug_swap * const swap =
4429 &ecoff_backend (input_bfd)->debug_swap;
4430 HDRR *symhdr = &debug->symbolic_header;
4431 boolean ret;
4432
4433 #define READ(ptr, offset, count, size, type) \
4434 if (symhdr->count == 0) \
4435 debug->ptr = NULL; \
4436 else \
4437 { \
4438 debug->ptr = (type) malloc (size * symhdr->count); \
4439 if (debug->ptr == NULL) \
4440 { \
4441 bfd_set_error (bfd_error_no_memory); \
4442 ret = false; \
4443 goto return_something; \
4444 } \
4445 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4446 != 0) \
4447 || (bfd_read (debug->ptr, size, symhdr->count, \
4448 input_bfd) != size * symhdr->count)) \
4449 { \
4450 ret = false; \
4451 goto return_something; \
4452 } \
4453 }
4454
4455 /* If raw_syments is not NULL, then the data was already by read by
4456 ecoff_slurp_symbolic_info. */
4457 if (ecoff_data (input_bfd)->raw_syments == NULL)
4458 {
4459 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
4460 unsigned char *);
4461 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
4462 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
4463 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
4464 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
4465 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
4466 union aux_ext *);
4467 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
4468 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
4469 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
4470 }
4471 #undef READ
4472
4473 /* We do not read the external strings or the external symbols. */
4474
4475 ret = (bfd_ecoff_debug_accumulate
4476 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
4477 &ecoff_backend (output_bfd)->debug_swap,
4478 input_bfd, debug, swap, info));
4479
4480 return_something:
4481 if (ecoff_data (input_bfd)->raw_syments == NULL)
4482 {
4483 if (debug->line != NULL)
4484 free (debug->line);
4485 if (debug->external_dnr != NULL)
4486 free (debug->external_dnr);
4487 if (debug->external_pdr != NULL)
4488 free (debug->external_pdr);
4489 if (debug->external_sym != NULL)
4490 free (debug->external_sym);
4491 if (debug->external_opt != NULL)
4492 free (debug->external_opt);
4493 if (debug->external_aux != NULL)
4494 free (debug->external_aux);
4495 if (debug->ss != NULL)
4496 free (debug->ss);
4497 if (debug->external_fdr != NULL)
4498 free (debug->external_fdr);
4499 if (debug->external_rfd != NULL)
4500 free (debug->external_rfd);
4501
4502 /* Make sure we don't accidentally follow one of these pointers
4503 into freed memory. */
4504 debug->line = NULL;
4505 debug->external_dnr = NULL;
4506 debug->external_pdr = NULL;
4507 debug->external_sym = NULL;
4508 debug->external_opt = NULL;
4509 debug->external_aux = NULL;
4510 debug->ss = NULL;
4511 debug->external_fdr = NULL;
4512 debug->external_rfd = NULL;
4513 }
4514
4515 return ret;
4516 }
4517
4518 /* Put out information for an external symbol. These come only from
4519 the hash table. */
4520
4521 static boolean
4522 ecoff_link_write_external (h, data)
4523 struct ecoff_link_hash_entry *h;
4524 PTR data;
4525 {
4526 bfd *output_bfd = (bfd *) data;
4527
4528 /* FIXME: We should check if this symbol is being stripped. */
4529
4530 if (h->written)
4531 return true;
4532
4533 if (h->abfd == (bfd *) NULL)
4534 {
4535 h->esym.jmptbl = 0;
4536 h->esym.cobol_main = 0;
4537 h->esym.weakext = 0;
4538 h->esym.reserved = 0;
4539 h->esym.ifd = ifdNil;
4540 h->esym.asym.value = 0;
4541 h->esym.asym.st = stGlobal;
4542
4543 if (h->root.type != bfd_link_hash_defined)
4544 h->esym.asym.sc = scAbs;
4545 else
4546 {
4547 asection *output_section;
4548 const char *name;
4549
4550 output_section = h->root.u.def.section->output_section;
4551 name = bfd_section_name (output_section->owner, output_section);
4552
4553 if (strcmp (name, _TEXT) == 0)
4554 h->esym.asym.sc = scText;
4555 else if (strcmp (name, _DATA) == 0)
4556 h->esym.asym.sc = scData;
4557 else if (strcmp (name, _SDATA) == 0)
4558 h->esym.asym.sc = scSData;
4559 else if (strcmp (name, _RDATA) == 0)
4560 h->esym.asym.sc = scRData;
4561 else if (strcmp (name, _BSS) == 0)
4562 h->esym.asym.sc = scBss;
4563 else if (strcmp (name, _SBSS) == 0)
4564 h->esym.asym.sc = scSBss;
4565 else if (strcmp (name, _INIT) == 0)
4566 h->esym.asym.sc = scInit;
4567 else if (strcmp (name, _FINI) == 0)
4568 h->esym.asym.sc = scFini;
4569 else if (strcmp (name, _PDATA) == 0)
4570 h->esym.asym.sc = scPData;
4571 else if (strcmp (name, _XDATA) == 0)
4572 h->esym.asym.sc = scXData;
4573 else
4574 h->esym.asym.sc = scAbs;
4575 }
4576
4577 h->esym.asym.reserved = 0;
4578 h->esym.asym.index = indexNil;
4579 }
4580 else if (h->esym.ifd != -1)
4581 {
4582 struct ecoff_debug_info *debug;
4583
4584 /* Adjust the FDR index for the symbol by that used for the
4585 input BFD. */
4586 debug = &ecoff_data (h->abfd)->debug_info;
4587 BFD_ASSERT (h->esym.ifd >= 0
4588 && h->esym.ifd < debug->symbolic_header.ifdMax);
4589 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4590 }
4591
4592 switch (h->root.type)
4593 {
4594 default:
4595 case bfd_link_hash_new:
4596 abort ();
4597 case bfd_link_hash_undefined:
4598 case bfd_link_hash_weak:
4599 if (h->esym.asym.sc != scUndefined
4600 && h->esym.asym.sc != scSUndefined)
4601 h->esym.asym.sc = scUndefined;
4602 break;
4603 case bfd_link_hash_defined:
4604 if (h->esym.asym.sc == scUndefined
4605 || h->esym.asym.sc == scSUndefined)
4606 h->esym.asym.sc = scAbs;
4607 else if (h->esym.asym.sc == scCommon)
4608 h->esym.asym.sc = scBss;
4609 else if (h->esym.asym.sc == scSCommon)
4610 h->esym.asym.sc = scSBss;
4611 h->esym.asym.value = (h->root.u.def.value
4612 + h->root.u.def.section->output_section->vma
4613 + h->root.u.def.section->output_offset);
4614 break;
4615 case bfd_link_hash_common:
4616 if (h->esym.asym.sc != scCommon
4617 && h->esym.asym.sc != scSCommon)
4618 h->esym.asym.sc = scCommon;
4619 h->esym.asym.value = h->root.u.c.size;
4620 break;
4621 case bfd_link_hash_indirect:
4622 case bfd_link_hash_warning:
4623 /* FIXME: Ignore these for now. The circumstances under which
4624 they should be written out are not clear to me. */
4625 return true;
4626 }
4627
4628 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4629 symbol number. */
4630 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4631 h->written = 1;
4632
4633 return (bfd_ecoff_debug_one_external
4634 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4635 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4636 &h->esym));
4637 }
4638
4639 /* Relocate and write an ECOFF section into an ECOFF output file. */
4640
4641 static boolean
4642 ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
4643 bfd *output_bfd;
4644 struct bfd_link_info *info;
4645 asection *output_section;
4646 struct bfd_link_order *link_order;
4647 {
4648 asection *input_section;
4649 bfd *input_bfd;
4650 struct ecoff_section_tdata *section_tdata;
4651 bfd_size_type raw_size;
4652 bfd_size_type cooked_size;
4653 bfd_byte *contents = NULL;
4654 bfd_size_type external_reloc_size;
4655 bfd_size_type external_relocs_size;
4656 PTR external_relocs = NULL;
4657
4658 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
4659
4660 if (link_order->size == 0)
4661 return true;
4662
4663 input_section = link_order->u.indirect.section;
4664 input_bfd = input_section->owner;
4665 section_tdata = ecoff_section_data (input_bfd, input_section);
4666
4667 raw_size = input_section->_raw_size;
4668 cooked_size = input_section->_cooked_size;
4669 if (cooked_size == 0)
4670 cooked_size = raw_size;
4671
4672 BFD_ASSERT (input_section->output_section == output_section);
4673 BFD_ASSERT (input_section->output_offset == link_order->offset);
4674 BFD_ASSERT (cooked_size == link_order->size);
4675
4676 /* Get the section contents. We allocate memory for the larger of
4677 the size before relocating and the size after relocating. */
4678 contents = (bfd_byte *) malloc (raw_size >= cooked_size
4679 ? raw_size
4680 : cooked_size);
4681 if (contents == NULL && raw_size != 0)
4682 {
4683 bfd_set_error (bfd_error_no_memory);
4684 goto error_return;
4685 }
4686
4687 /* If we are relaxing, the contents may have already been read into
4688 memory, in which case we copy them into our new buffer. We don't
4689 simply reuse the old buffer in case cooked_size > raw_size. */
4690 if (section_tdata != (struct ecoff_section_tdata *) NULL
4691 && section_tdata->contents != (bfd_byte *) NULL)
4692 memcpy (contents, section_tdata->contents, raw_size);
4693 else
4694 {
4695 if (! bfd_get_section_contents (input_bfd, input_section,
4696 (PTR) contents,
4697 (file_ptr) 0, raw_size))
4698 goto error_return;
4699 }
4700
4701 /* Get the relocs. If we are relaxing MIPS code, they will already
4702 have been read in. Otherwise, we read them in now. */
4703 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
4704 external_relocs_size = external_reloc_size * input_section->reloc_count;
4705
4706 if (section_tdata != (struct ecoff_section_tdata *) NULL)
4707 external_relocs = section_tdata->external_relocs;
4708 else
4709 {
4710 external_relocs = (PTR) malloc (external_relocs_size);
4711 if (external_relocs == NULL && external_relocs_size != 0)
4712 {
4713 bfd_set_error (bfd_error_no_memory);
4714 goto error_return;
4715 }
4716
4717 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
4718 || (bfd_read (external_relocs, 1, external_relocs_size, input_bfd)
4719 != external_relocs_size))
4720 goto error_return;
4721 }
4722
4723 /* Relocate the section contents. */
4724 if (! ((*ecoff_backend (input_bfd)->relocate_section)
4725 (output_bfd, info, input_bfd, input_section, contents,
4726 external_relocs)))
4727 goto error_return;
4728
4729 /* Write out the relocated section. */
4730 if (! bfd_set_section_contents (output_bfd,
4731 output_section,
4732 (PTR) contents,
4733 input_section->output_offset,
4734 cooked_size))
4735 goto error_return;
4736
4737 /* If we are producing relocateable output, the relocs were
4738 modified, and we write them out now. We use the reloc_count
4739 field of output_section to keep track of the number of relocs we
4740 have output so far. */
4741 if (info->relocateable)
4742 {
4743 if (bfd_seek (output_bfd,
4744 (output_section->rel_filepos +
4745 output_section->reloc_count * external_reloc_size),
4746 SEEK_SET) != 0
4747 || (bfd_write (external_relocs, 1, external_relocs_size, output_bfd)
4748 != external_relocs_size))
4749 goto error_return;
4750 output_section->reloc_count += input_section->reloc_count;
4751 }
4752
4753 if (contents != NULL)
4754 free (contents);
4755 if (external_relocs != NULL && section_tdata == NULL)
4756 free (external_relocs);
4757 return true;
4758
4759 error_return:
4760 if (contents != NULL)
4761 free (contents);
4762 if (external_relocs != NULL && section_tdata == NULL)
4763 free (external_relocs);
4764 return false;
4765 }
4766
4767 /* Generate a reloc when linking an ECOFF file. This is a reloc
4768 requested by the linker, and does come from any input file. This
4769 is used to build constructor and destructor tables when linking
4770 with -Ur. */
4771
4772 static boolean
4773 ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
4774 bfd *output_bfd;
4775 struct bfd_link_info *info;
4776 asection *output_section;
4777 struct bfd_link_order *link_order;
4778 {
4779 arelent rel;
4780 struct internal_reloc in;
4781 bfd_size_type external_reloc_size;
4782 bfd_byte *rbuf;
4783 boolean ok;
4784
4785 /* We set up an arelent to pass to the backend adjust_reloc_out
4786 routine. */
4787 rel.address = link_order->offset;
4788
4789 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4790 if (rel.howto == (const reloc_howto_type *) NULL)
4791 {
4792 bfd_set_error (bfd_error_bad_value);
4793 return false;
4794 }
4795
4796 if (link_order->type == bfd_section_reloc_link_order)
4797 rel.sym_ptr_ptr = link_order->u.reloc.p->u.section->symbol_ptr_ptr;
4798 else
4799 {
4800 /* We can't set up a reloc against a symbol correctly, because
4801 we have no asymbol structure. Currently no adjust_reloc_out
4802 routine cases. */
4803 rel.sym_ptr_ptr = (asymbol **) NULL;
4804 }
4805
4806 /* All ECOFF relocs are in-place. Put the addend into the object
4807 file. */
4808
4809 BFD_ASSERT (rel.howto->partial_inplace);
4810 if (link_order->u.reloc.p->addend != 0)
4811 {
4812 bfd_size_type size;
4813 bfd_reloc_status_type rstat;
4814 bfd_byte *buf;
4815 boolean ok;
4816
4817 size = bfd_get_reloc_size (rel.howto);
4818 buf = (bfd_byte *) bfd_zmalloc (size);
4819 if (buf == (bfd_byte *) NULL)
4820 {
4821 bfd_set_error (bfd_error_no_memory);
4822 return false;
4823 }
4824 rstat = _bfd_relocate_contents (rel.howto, output_bfd,
4825 link_order->u.reloc.p->addend, buf);
4826 switch (rstat)
4827 {
4828 case bfd_reloc_ok:
4829 break;
4830 default:
4831 case bfd_reloc_outofrange:
4832 abort ();
4833 case bfd_reloc_overflow:
4834 if (! ((*info->callbacks->reloc_overflow)
4835 (info,
4836 (link_order->type == bfd_section_reloc_link_order
4837 ? bfd_section_name (output_bfd,
4838 link_order->u.reloc.p->u.section)
4839 : link_order->u.reloc.p->u.name),
4840 rel.howto->name, link_order->u.reloc.p->addend,
4841 (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
4842 {
4843 free (buf);
4844 return false;
4845 }
4846 break;
4847 }
4848 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
4849 (file_ptr) link_order->offset, size);
4850 free (buf);
4851 if (! ok)
4852 return false;
4853 }
4854
4855 rel.addend = 0;
4856
4857 /* Move the information into a internal_reloc structure. */
4858 in.r_vaddr = (rel.address
4859 + bfd_get_section_vma (output_bfd, output_section));
4860 in.r_type = rel.howto->type;
4861
4862 if (link_order->type == bfd_symbol_reloc_link_order)
4863 {
4864 struct ecoff_link_hash_entry *h;
4865
4866 h = ecoff_link_hash_lookup (ecoff_hash_table (info),
4867 link_order->u.reloc.p->u.name,
4868 false, false, true);
4869 if (h != (struct ecoff_link_hash_entry *) NULL
4870 && h->indx != -1)
4871 in.r_symndx = h->indx;
4872 else
4873 {
4874 if (! ((*info->callbacks->unattached_reloc)
4875 (info, link_order->u.reloc.p->u.name, (bfd *) NULL,
4876 (asection *) NULL, (bfd_vma) 0)))
4877 return false;
4878 in.r_symndx = 0;
4879 }
4880 in.r_extern = 1;
4881 }
4882 else
4883 {
4884 CONST char *name;
4885
4886 name = bfd_get_section_name (output_bfd,
4887 link_order->u.reloc.p->u.section);
4888 if (strcmp (name, ".text") == 0)
4889 in.r_symndx = RELOC_SECTION_TEXT;
4890 else if (strcmp (name, ".rdata") == 0)
4891 in.r_symndx = RELOC_SECTION_RDATA;
4892 else if (strcmp (name, ".data") == 0)
4893 in.r_symndx = RELOC_SECTION_DATA;
4894 else if (strcmp (name, ".sdata") == 0)
4895 in.r_symndx = RELOC_SECTION_SDATA;
4896 else if (strcmp (name, ".sbss") == 0)
4897 in.r_symndx = RELOC_SECTION_SBSS;
4898 else if (strcmp (name, ".bss") == 0)
4899 in.r_symndx = RELOC_SECTION_BSS;
4900 else if (strcmp (name, ".init") == 0)
4901 in.r_symndx = RELOC_SECTION_INIT;
4902 else if (strcmp (name, ".lit8") == 0)
4903 in.r_symndx = RELOC_SECTION_LIT8;
4904 else if (strcmp (name, ".lit4") == 0)
4905 in.r_symndx = RELOC_SECTION_LIT4;
4906 else if (strcmp (name, ".xdata") == 0)
4907 in.r_symndx = RELOC_SECTION_XDATA;
4908 else if (strcmp (name, ".pdata") == 0)
4909 in.r_symndx = RELOC_SECTION_PDATA;
4910 else if (strcmp (name, ".fini") == 0)
4911 in.r_symndx = RELOC_SECTION_FINI;
4912 else if (strcmp (name, ".lita") == 0)
4913 in.r_symndx = RELOC_SECTION_LITA;
4914 else if (strcmp (name, "*ABS*") == 0)
4915 in.r_symndx = RELOC_SECTION_ABS;
4916 else
4917 abort ();
4918 in.r_extern = 0;
4919 }
4920
4921 /* Let the BFD backend adjust the reloc. */
4922 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4923
4924 /* Get some memory and swap out the reloc. */
4925 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4926 rbuf = (bfd_byte *) malloc (external_reloc_size);
4927 if (rbuf == (bfd_byte *) NULL)
4928 {
4929 bfd_set_error (bfd_error_no_memory);
4930 return false;
4931 }
4932
4933 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (PTR) rbuf);
4934
4935 ok = (bfd_seek (output_bfd,
4936 (output_section->rel_filepos +
4937 output_section->reloc_count * external_reloc_size),
4938 SEEK_SET) == 0
4939 && (bfd_write ((PTR) rbuf, 1, external_reloc_size, output_bfd)
4940 == external_reloc_size));
4941
4942 if (ok)
4943 ++output_section->reloc_count;
4944
4945 free (rbuf);
4946
4947 return ok;
4948 }