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