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