1 /* Routines to link ECOFF debugging information.
2 Copyright 1993 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
26 #include "coff/internal.h"
28 #include "coff/symconst.h"
29 #include "coff/ecoff.h"
31 static boolean ecoff_add_bytes PARAMS ((char **buf, char **bufend,
33 static struct bfd_hash_entry *string_hash_newfunc
34 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
36 static void ecoff_align_debug PARAMS ((bfd *abfd,
37 struct ecoff_debug_info *debug,
38 const struct ecoff_debug_swap *swap));
39 static boolean ecoff_write_symhdr PARAMS ((bfd *, struct ecoff_debug_info *,
40 const struct ecoff_debug_swap *,
43 /* Obstack allocation and deallocation routines. */
44 #define obstack_chunk_alloc malloc
45 #define obstack_chunk_free free
47 /* The minimum amount of data to allocate. */
48 #define ALLOC_SIZE (4064)
50 /* Add bytes to a buffer. Return success. */
53 ecoff_add_bytes (buf, bufend, need)
62 have = *bufend - *buf;
68 if (want < ALLOC_SIZE)
72 newbuf = (char *) malloc (have + want);
74 newbuf = (char *) realloc (*buf, have + want);
77 bfd_set_error (bfd_error_no_memory);
81 *bufend = *buf + have + want;
85 /* We keep a hash table which maps strings to numbers. We use it to
86 map FDR names to indices in the output file, and to map local
87 strings when combining stabs debugging information. */
89 struct string_hash_entry
91 struct bfd_hash_entry root;
92 /* FDR index or string table offset. */
94 /* Next entry in string table. */
95 struct string_hash_entry *next;
98 struct string_hash_table
100 struct bfd_hash_table table;
103 /* Routine to create an entry in a string hash table. */
105 static struct bfd_hash_entry *
106 string_hash_newfunc (entry, table, string)
107 struct bfd_hash_entry *entry;
108 struct bfd_hash_table *table;
111 struct string_hash_entry *ret = (struct string_hash_entry *) entry;
113 /* Allocate the structure if it has not already been allocated by a
115 if (ret == (struct string_hash_entry *) NULL)
116 ret = ((struct string_hash_entry *)
117 bfd_hash_allocate (table, sizeof (struct string_hash_entry)));
118 if (ret == (struct string_hash_entry *) NULL)
120 bfd_set_error (bfd_error_no_memory);
124 /* Call the allocation method of the superclass. */
125 ret = ((struct string_hash_entry *)
126 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
130 /* Initialize the local fields. */
135 return (struct bfd_hash_entry *) ret;
138 /* Look up an entry in an string hash table. */
140 #define string_hash_lookup(t, string, create, copy) \
141 ((struct string_hash_entry *) \
142 bfd_hash_lookup (&(t)->table, (string), (create), (copy)))
144 /* We can't afford to read in all the debugging information when we do
145 a link. Instead, we build a list of these structures to show how
146 different parts of the input file map to the output file. */
150 /* The next entry in this linked list. */
151 struct shuffle *next;
152 /* The length of the information. */
154 /* Whether this information comes from a file or not. */
160 /* The BFD the data comes from. */
162 /* The offset within input_bfd. */
165 /* The data to be written out. */
170 /* This structure holds information across calls to
171 bfd_ecoff_debug_accumulate. */
175 /* The FDR hash table. */
176 struct string_hash_table fdr_hash;
177 /* The strings hash table. */
178 struct string_hash_table str_hash;
179 /* Linked lists describing how to shuffle the input debug
180 information into the output file. We keep a pointer to both the
181 head and the tail. */
182 struct shuffle *line;
183 struct shuffle *line_end;
185 struct shuffle *pdr_end;
187 struct shuffle *sym_end;
189 struct shuffle *opt_end;
191 struct shuffle *aux_end;
193 struct shuffle *ss_end;
194 struct string_hash_entry *ss_hash;
195 struct string_hash_entry *ss_hash_end;
197 struct shuffle *fdr_end;
199 struct shuffle *rfd_end;
200 /* The size of the largest file shuffle. */
201 unsigned long largest_file_shuffle;
202 /* An obstack for debugging information. */
203 struct obstack memory;
206 /* Add a file entry to a shuffle list. */
208 static boolean add_file_shuffle PARAMS ((struct accumulate *,
210 struct shuffle **, bfd *, file_ptr,
214 add_file_shuffle (ainfo, head, tail, input_bfd, offset, size)
215 struct accumulate *ainfo;
216 struct shuffle **head;
217 struct shuffle **tail;
224 if (*tail != (struct shuffle *) NULL
226 && (*tail)->u.file.input_bfd == input_bfd
227 && (*tail)->u.file.offset + (*tail)->size == offset)
229 /* Just merge this entry onto the existing one. */
230 (*tail)->size += size;
231 if ((*tail)->size > ainfo->largest_file_shuffle)
232 ainfo->largest_file_shuffle = (*tail)->size;
236 n = (struct shuffle *) obstack_alloc (&ainfo->memory,
237 sizeof (struct shuffle));
240 bfd_set_error (bfd_error_no_memory);
246 n->u.file.input_bfd = input_bfd;
247 n->u.file.offset = offset;
248 if (*head == (struct shuffle *) NULL)
250 if (*tail != (struct shuffle *) NULL)
253 if (size > ainfo->largest_file_shuffle)
254 ainfo->largest_file_shuffle = size;
258 /* Add a memory entry to a shuffle list. */
260 static boolean add_memory_shuffle PARAMS ((struct accumulate *,
261 struct shuffle **head,
262 struct shuffle **tail,
263 bfd_byte *data, unsigned long size));
266 add_memory_shuffle (ainfo, head, tail, data, size)
267 struct accumulate *ainfo;
268 struct shuffle **head;
269 struct shuffle **tail;
275 n = (struct shuffle *) obstack_alloc (&ainfo->memory,
276 sizeof (struct shuffle));
279 bfd_set_error (bfd_error_no_memory);
285 n->u.memory = (PTR) data;
286 if (*head == (struct shuffle *) NULL)
288 if (*tail != (struct shuffle *) NULL)
294 /* Initialize the FDR hash table. This returns a handle which is then
295 passed in to bfd_ecoff_debug_accumulate, et. al. */
299 bfd_ecoff_debug_init (output_bfd, output_debug, output_swap, info)
301 struct ecoff_debug_info *output_debug;
302 const struct ecoff_debug_swap *output_swap;
303 struct bfd_link_info *info;
305 struct accumulate *ainfo;
307 ainfo = (struct accumulate *) malloc (sizeof (struct accumulate));
310 bfd_set_error (bfd_error_no_memory);
313 if (! bfd_hash_table_init_n (&ainfo->fdr_hash.table, string_hash_newfunc,
318 ainfo->line_end = NULL;
320 ainfo->pdr_end = NULL;
322 ainfo->sym_end = NULL;
324 ainfo->opt_end = NULL;
326 ainfo->aux_end = NULL;
328 ainfo->ss_end = NULL;
329 ainfo->ss_hash = NULL;
330 ainfo->ss_hash_end = NULL;
332 ainfo->fdr_end = NULL;
334 ainfo->rfd_end = NULL;
336 ainfo->largest_file_shuffle = 0;
338 if (! info->relocateable)
340 if (! bfd_hash_table_init (&ainfo->str_hash.table, string_hash_newfunc))
343 /* The first entry in the string table is the empty string. */
344 output_debug->symbolic_header.issMax = 1;
347 if (!obstack_begin (&ainfo->memory, 4050))
349 bfd_set_error (bfd_error_no_memory);
356 /* Free the accumulated debugging information. */
360 bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info)
363 struct ecoff_debug_info *output_debug;
364 const struct ecoff_debug_swap *output_swap;
365 struct bfd_link_info *info;
367 struct accumulate *ainfo = (struct accumulate *) handle;
369 bfd_hash_table_free (&ainfo->fdr_hash.table);
371 if (! info->relocateable)
372 bfd_hash_table_free (&ainfo->str_hash.table);
374 obstack_free (&ainfo->memory, (PTR) NULL);
379 /* Accumulate the debugging information from INPUT_BFD into
380 OUTPUT_BFD. The INPUT_DEBUG argument points to some ECOFF
381 debugging information which we want to link into the information
382 pointed to by the OUTPUT_DEBUG argument. OUTPUT_SWAP and
383 INPUT_SWAP point to the swapping information needed. INFO is the
384 linker information structure. HANDLE is returned by
385 bfd_ecoff_debug_init. */
389 bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap,
390 input_bfd, input_debug, input_swap,
394 struct ecoff_debug_info *output_debug;
395 const struct ecoff_debug_swap *output_swap;
397 struct ecoff_debug_info *input_debug;
398 const struct ecoff_debug_swap *input_swap;
399 struct bfd_link_info *info;
401 struct accumulate *ainfo = (struct accumulate *) handle;
402 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
403 = input_swap->swap_sym_in;
404 void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *))
405 = input_swap->swap_rfd_in;
406 void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
407 = output_swap->swap_sym_out;
408 void (* const swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR))
409 = output_swap->swap_fdr_out;
410 void (* const swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR))
411 = output_swap->swap_rfd_out;
412 bfd_size_type external_pdr_size = output_swap->external_pdr_size;
413 bfd_size_type external_sym_size = output_swap->external_sym_size;
414 bfd_size_type external_opt_size = output_swap->external_opt_size;
415 bfd_size_type external_fdr_size = output_swap->external_fdr_size;
416 bfd_size_type external_rfd_size = output_swap->external_rfd_size;
417 HDRR * const output_symhdr = &output_debug->symbolic_header;
418 HDRR * const input_symhdr = &input_debug->symbolic_header;
419 bfd_vma section_adjust[scMax];
424 bfd_size_type fdr_add;
435 /* Use section_adjust to hold the value to add to a symbol in a
436 particular section. */
437 memset ((PTR) section_adjust, 0, sizeof section_adjust);
439 #define SET(name, indx) \
440 sec = bfd_get_section_by_name (input_bfd, name); \
442 section_adjust[indx] = (sec->output_section->vma \
443 + sec->output_offset \
446 SET (".text", scText);
447 SET (".data", scData);
449 SET (".sdata", scSData);
450 SET (".sbss", scSBss);
451 /* scRdata section may be either .rdata or .rodata. */
452 SET (".rdata", scRData);
453 SET (".rodata", scRData);
454 SET (".init", scInit);
455 SET (".fini", scFini);
459 /* Find all the debugging information based on the FDR's. We need
460 to handle them whether they are swapped or not. */
461 if (input_debug->fdr != (FDR *) NULL)
463 fdr_start = (bfd_byte *) input_debug->fdr;
464 fdr_add = sizeof (FDR);
468 fdr_start = (bfd_byte *) input_debug->external_fdr;
469 fdr_add = input_swap->external_fdr_size;
471 fdr_end = fdr_start + input_symhdr->ifdMax * fdr_add;
473 input_debug->ifdmap = (RFDT *) bfd_alloc (input_bfd,
474 (input_symhdr->ifdMax
477 sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size;
478 rfd_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
479 if (!input_debug->ifdmap || !rfd_out)
481 bfd_set_error (bfd_error_no_memory);
484 if (!add_memory_shuffle (ainfo, &ainfo->rfd, &ainfo->rfd_end, rfd_out, sz))
489 /* Look through the FDR's to see which ones we are going to include
490 in the final output. We do not want duplicate FDR information
491 for header files, because ECOFF debugging is often very large.
492 When we find an FDR with no line information which can be merged,
493 we look it up in a hash table to ensure that we only include it
494 once. We keep a table mapping FDR numbers to the final number
495 they get with the BFD, so that we can refer to it when we write
496 out the external symbols. */
497 for (fdr_ptr = fdr_start, i = 0;
499 fdr_ptr += fdr_add, i++, rfd_out += external_rfd_size)
503 if (input_debug->fdr != (FDR *) NULL)
504 fdr = *(FDR *) fdr_ptr;
506 (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
508 /* See if this FDR can be merged with an existing one. */
509 if (fdr.cbLine == 0 && fdr.rss != -1 && fdr.fMerge)
513 struct string_hash_entry *fh;
515 /* We look up a string formed from the file name and the
516 number of symbols. Sometimes an include file will
517 conditionally define a typedef or something based on the
518 order of include files. Using the number of symbols as a
519 hash reduces the chance that we will merge symbol
520 information that should not be merged. */
521 name = input_debug->ss + fdr.issBase + fdr.rss;
523 lookup = (char *) malloc (strlen (name) + 20);
526 bfd_set_error (bfd_error_no_memory);
529 sprintf (lookup, "%s %lx", name, fdr.csym);
531 fh = string_hash_lookup (&ainfo->fdr_hash, lookup, true, true);
533 if (fh == (struct string_hash_entry *) NULL)
538 input_debug->ifdmap[i] = fh->val;
539 (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i,
542 /* Don't copy this FDR. */
546 fh->val = output_symhdr->ifdMax + copied;
549 input_debug->ifdmap[i] = output_symhdr->ifdMax + copied;
550 (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, (PTR) rfd_out);
554 newrfdbase = output_symhdr->crfd;
555 output_symhdr->crfd += input_symhdr->ifdMax;
557 /* Copy over any existing RFD's. RFD's are only created by the
558 linker, so this will only happen for input files which are the
559 result of a partial link. */
560 rfd_in = (bfd_byte *) input_debug->external_rfd;
561 rfd_end = rfd_in + input_symhdr->crfd * input_swap->external_rfd_size;
564 rfd_in += input_swap->external_rfd_size)
568 (*swap_rfd_in) (input_bfd, (PTR) rfd_in, &rfd);
569 BFD_ASSERT (rfd >= 0 && rfd < input_symhdr->ifdMax);
570 rfd = input_debug->ifdmap[rfd];
571 (*swap_rfd_out) (output_bfd, &rfd, (PTR) rfd_out);
572 rfd_out += external_rfd_size;
575 oldrfdbase = output_symhdr->crfd;
576 output_symhdr->crfd += input_symhdr->crfd;
578 /* Look through the FDR's and copy over all associated debugging
580 sz = copied * external_fdr_size;
581 fdr_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
584 bfd_set_error (bfd_error_no_memory);
587 if (!add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, fdr_out, sz))
589 for (fdr_ptr = fdr_start, i = 0;
591 fdr_ptr += fdr_add, i++)
598 boolean fgotfilename;
600 if (input_debug->ifdmap[i] < output_symhdr->ifdMax)
602 /* We are not copying this FDR. */
606 if (input_debug->fdr != (FDR *) NULL)
607 fdr = *(FDR *) fdr_ptr;
609 (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
613 /* Adjust the FDR address for any changes that may have been
615 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
617 struct ecoff_value_adjust *adjust;
619 for (adjust = input_debug->adjust;
620 adjust != (struct ecoff_value_adjust *) NULL;
621 adjust = adjust->next)
622 if (fdr_adr >= adjust->start
623 && fdr_adr < adjust->end)
624 fdr.adr += adjust->adjust;
627 /* FIXME: It is conceivable that this FDR points to the .init or
628 .fini section, in which case this will not do the right
630 fdr.adr += section_adjust[scText];
632 /* Swap in the local symbols, adjust their values, and swap them
634 fgotfilename = false;
635 sz = fdr.csym * external_sym_size;
636 sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
639 bfd_set_error (bfd_error_no_memory);
642 if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out,
645 lraw_src = ((bfd_byte *) input_debug->external_sym
646 + fdr.isymBase * input_swap->external_sym_size);
647 lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size;
648 for (; lraw_src < lraw_end; lraw_src += input_swap->external_sym_size)
652 (*swap_sym_in) (input_bfd, (PTR) lraw_src, &internal_sym);
654 BFD_ASSERT (internal_sym.sc != scCommon
655 && internal_sym.sc != scSCommon);
657 /* Adjust the symbol value if appropriate. */
658 switch (internal_sym.st)
661 if (ECOFF_IS_STAB (&internal_sym))
669 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
672 struct ecoff_value_adjust *adjust;
674 value = internal_sym.value;
675 for (adjust = input_debug->adjust;
676 adjust != (struct ecoff_value_adjust *) NULL;
677 adjust = adjust->next)
678 if (value >= adjust->start
679 && value < adjust->end)
680 internal_sym.value += adjust->adjust;
682 internal_sym.value += section_adjust[internal_sym.sc];
689 /* If we are doing a final link, we hash all the strings in
690 the local symbol table together. This reduces the amount
691 of space required by debugging information. We don't do
692 this when performing a relocateable link because it would
693 prevent us from easily merging different FDR's. */
694 if (! info->relocateable)
699 if (! fgotfilename && internal_sym.iss == fdr.rss)
704 /* Hash the name into the string table. */
705 name = input_debug->ss + fdr.issBase + internal_sym.iss;
707 internal_sym.iss = 0;
710 struct string_hash_entry *sh;
712 sh = string_hash_lookup (&ainfo->str_hash, name, true, true);
713 if (sh == (struct string_hash_entry *) NULL)
717 sh->val = output_symhdr->issMax;
718 output_symhdr->issMax += strlen (name) + 1;
719 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
721 if (ainfo->ss_hash_end
722 != (struct string_hash_entry *) NULL)
723 ainfo->ss_hash_end->next = sh;
724 ainfo->ss_hash_end = sh;
726 internal_sym.iss = sh->val;
731 fdr.rss = internal_sym.iss;
736 (*swap_sym_out) (output_bfd, &internal_sym, sym_out);
737 sym_out += external_sym_size;
740 fdr.isymBase = output_symhdr->isymMax;
741 output_symhdr->isymMax += fdr.csym;
743 /* Copy the information that does not need swapping. */
745 /* FIXME: If we are relaxing, we need to adjust the line
746 numbers. Frankly, forget it. Anybody using stabs debugging
747 information will not use this line number information, and
748 stabs are adjusted correctly. */
751 if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end,
753 input_symhdr->cbLineOffset + fdr.cbLineOffset,
756 fdr.ilineBase = output_symhdr->ilineMax;
757 fdr.cbLineOffset = output_symhdr->cbLine;
758 output_symhdr->ilineMax += fdr.cline;
759 output_symhdr->cbLine += fdr.cbLine;
763 if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end,
765 (input_symhdr->cbAuxOffset
766 + fdr.iauxBase * sizeof (union aux_ext)),
767 fdr.caux * sizeof (union aux_ext)))
769 fdr.iauxBase = output_symhdr->iauxMax;
770 output_symhdr->iauxMax += fdr.caux;
772 if (! info->relocateable)
775 /* When are are hashing strings, we lie about the number of
776 strings attached to each FDR. We need to set cbSs
777 because some versions of dbx apparently use it to decide
778 how much of the string table to read in. */
780 fdr.cbSs = output_symhdr->issMax;
782 else if (fdr.cbSs > 0)
784 if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
786 input_symhdr->cbSsOffset + fdr.issBase,
789 fdr.issBase = output_symhdr->issMax;
790 output_symhdr->issMax += fdr.cbSs;
793 if ((output_bfd->xvec->header_byteorder_big_p
794 == input_bfd->xvec->header_byteorder_big_p)
795 && input_debug->adjust == (struct ecoff_value_adjust *) NULL)
797 /* The two BFD's have the same endianness, and we don't have
798 to adjust the PDR addresses, so simply copying the
799 information will suffice. */
800 BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size);
803 if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end,
805 (input_symhdr->cbPdOffset
806 + fdr.ipdFirst * external_pdr_size),
807 fdr.cpd * external_pdr_size))
810 BFD_ASSERT (external_opt_size == input_swap->external_opt_size);
813 if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end,
815 (input_symhdr->cbOptOffset
816 + fdr.ioptBase * external_opt_size),
817 fdr.copt * external_opt_size))
823 bfd_size_type outsz, insz;
828 /* The two BFD's have different endianness, so we must swap
829 everything in and out. This code would always work, but
830 it would be unnecessarily slow in the normal case. */
831 outsz = external_pdr_size;
832 insz = input_swap->external_pdr_size;
833 in = ((bfd_byte *) input_debug->external_pdr
834 + fdr.ipdFirst * insz);
835 end = in + fdr.cpd * insz;
836 sz = fdr.cpd * outsz;
837 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
840 bfd_set_error (bfd_error_no_memory);
843 if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out,
846 for (; in < end; in += insz, out += outsz)
850 (*input_swap->swap_pdr_in) (input_bfd, (PTR) in, &pdr);
852 /* If we have been relaxing, we may have to adjust the
854 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
857 struct ecoff_value_adjust *adjust;
859 adr = fdr_adr + pdr.adr;
860 for (adjust = input_debug->adjust;
861 adjust != (struct ecoff_value_adjust *) NULL;
862 adjust = adjust->next)
863 if (adr >= adjust->start
864 && adr < adjust->end)
865 pdr.adr += adjust->adjust;
868 (*output_swap->swap_pdr_out) (output_bfd, &pdr, (PTR) out);
871 /* Swap over the optimization information. */
872 outsz = external_opt_size;
873 insz = input_swap->external_opt_size;
874 in = ((bfd_byte *) input_debug->external_opt
875 + fdr.ioptBase * insz);
876 end = in + fdr.copt * insz;
877 sz = fdr.copt * outsz;
878 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
881 bfd_set_error (bfd_error_no_memory);
884 if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out,
887 for (; in < end; in += insz, out += outsz)
891 (*input_swap->swap_opt_in) (input_bfd, (PTR) in, &opt);
892 (*output_swap->swap_opt_out) (output_bfd, &opt, (PTR) out);
896 fdr.ipdFirst = output_symhdr->ipdMax;
897 output_symhdr->ipdMax += fdr.cpd;
898 fdr.ioptBase = output_symhdr->ioptMax;
899 output_symhdr->ioptMax += fdr.copt;
903 /* Point this FDR at the table of RFD's we created. */
904 fdr.rfdBase = newrfdbase;
905 fdr.crfd = input_symhdr->ifdMax;
909 /* Point this FDR at the remapped RFD's. */
910 fdr.rfdBase += oldrfdbase;
913 (*swap_fdr_out) (output_bfd, &fdr, fdr_out);
914 fdr_out += external_fdr_size;
915 ++output_symhdr->ifdMax;
921 /* Add a string to the debugging information we are accumulating.
922 Return the offset from the fdr string base. */
924 static long ecoff_add_string PARAMS ((struct accumulate *,
925 struct bfd_link_info *,
926 struct ecoff_debug_info *,
927 FDR *fdr, const char *string));
930 ecoff_add_string (ainfo, info, debug, fdr, string)
931 struct accumulate *ainfo;
932 struct bfd_link_info *info;
933 struct ecoff_debug_info *debug;
941 symhdr = &debug->symbolic_header;
942 len = strlen (string);
943 if (info->relocateable)
945 if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, (PTR) string,
948 ret = symhdr->issMax;
949 symhdr->issMax += len + 1;
950 fdr->cbSs += len + 1;
954 struct string_hash_entry *sh;
956 sh = string_hash_lookup (&ainfo->str_hash, string, true, true);
957 if (sh == (struct string_hash_entry *) NULL)
961 sh->val = symhdr->issMax;
962 symhdr->issMax += len + 1;
963 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
965 if (ainfo->ss_hash_end
966 != (struct string_hash_entry *) NULL)
967 ainfo->ss_hash_end->next = sh;
968 ainfo->ss_hash_end = sh;
976 /* Add debugging information from a non-ECOFF file. */
979 bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
980 output_swap, input_bfd, info)
983 struct ecoff_debug_info *output_debug;
984 const struct ecoff_debug_swap *output_swap;
986 struct bfd_link_info *info;
988 struct accumulate *ainfo = (struct accumulate *) handle;
989 void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
990 = output_swap->swap_sym_out;
991 HDRR *output_symhdr = &output_debug->symbolic_header;
1001 memset ((PTR) &fdr, 0, sizeof fdr);
1003 sec = bfd_get_section_by_name (input_bfd, ".text");
1005 fdr.adr = sec->output_section->vma + sec->output_offset;
1008 /* FIXME: What about .init or .fini? */
1012 fdr.issBase = output_symhdr->issMax;
1014 fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1015 bfd_get_filename (input_bfd));
1018 fdr.isymBase = output_symhdr->isymMax;
1020 /* Get the local symbols from the input BFD. */
1021 symsize = bfd_get_symtab_upper_bound (input_bfd);
1024 symbols = (asymbol **) bfd_alloc (output_bfd, symsize);
1025 if (symbols == (asymbol **) NULL)
1027 bfd_set_error (bfd_error_no_memory);
1030 symcount = bfd_canonicalize_symtab (input_bfd, symbols);
1033 sym_end = symbols + symcount;
1035 /* Handle the local symbols. Any external symbols are handled
1038 for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
1043 if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
1045 memset ((PTR) &internal_sym, 0, sizeof internal_sym);
1046 internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1049 if (internal_sym.iss == -1)
1051 if (bfd_is_com_section ((*sym_ptr)->section)
1052 || (*sym_ptr)->section == &bfd_und_section)
1053 internal_sym.value = (*sym_ptr)->value;
1055 internal_sym.value = ((*sym_ptr)->value
1056 + (*sym_ptr)->section->output_offset
1057 + (*sym_ptr)->section->output_section->vma);
1058 internal_sym.st = stNil;
1059 internal_sym.sc = scUndefined;
1060 internal_sym.index = indexNil;
1062 external_sym = (PTR) obstack_alloc (&ainfo->memory,
1063 output_swap->external_sym_size);
1066 bfd_set_error (bfd_error_no_memory);
1069 (*swap_sym_out) (output_bfd, &internal_sym, external_sym);
1070 add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end,
1071 external_sym, output_swap->external_sym_size);
1073 ++output_symhdr->isymMax;
1076 bfd_release (output_bfd, (PTR) symbols);
1078 /* Leave everything else in the FDR zeroed out. This will cause
1079 the lang field to be langC. The fBigendian field will
1080 indicate little endian format, but it doesn't matter because
1081 it only applies to aux fields and there are none. */
1082 external_fdr = (PTR) obstack_alloc (&ainfo->memory,
1083 output_swap->external_fdr_size);
1086 bfd_set_error (bfd_error_no_memory);
1089 (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr);
1090 add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end,
1091 external_fdr, output_swap->external_fdr_size);
1093 ++output_symhdr->ifdMax;
1098 /* Set up ECOFF debugging information for the external symbols.
1099 FIXME: This is done using a memory buffer, but it should be
1100 probably be changed to use a shuffle structure. The assembler uses
1101 this interface, so that must be changed to do something else. */
1104 bfd_ecoff_debug_externals (abfd, debug, swap, relocateable, get_extr,
1107 struct ecoff_debug_info *debug;
1108 const struct ecoff_debug_swap *swap;
1109 boolean relocateable;
1110 boolean (*get_extr) PARAMS ((asymbol *, EXTR *));
1111 void (*set_index) PARAMS ((asymbol *, bfd_size_type));
1113 HDRR * const symhdr = &debug->symbolic_header;
1114 asymbol **sym_ptr_ptr;
1117 sym_ptr_ptr = bfd_get_outsymbols (abfd);
1118 if (sym_ptr_ptr == NULL)
1121 for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++)
1126 sym_ptr = *sym_ptr_ptr;
1128 /* Get the external symbol information. */
1129 if ((*get_extr) (sym_ptr, &esym) == false)
1132 /* If we're producing an executable, move common symbols into
1134 if (relocateable == false)
1136 if (esym.asym.sc == scCommon)
1137 esym.asym.sc = scBss;
1138 else if (esym.asym.sc == scSCommon)
1139 esym.asym.sc = scSBss;
1142 if (bfd_is_com_section (sym_ptr->section)
1143 || sym_ptr->section == &bfd_und_section)
1145 /* FIXME: gas does not keep the value of a small undefined
1146 symbol in the symbol itself, because of relocation
1148 if (esym.asym.sc != scSUndefined
1149 || esym.asym.value == 0
1150 || sym_ptr->value != 0)
1151 esym.asym.value = sym_ptr->value;
1154 esym.asym.value = (sym_ptr->value
1155 + sym_ptr->section->output_offset
1156 + sym_ptr->section->output_section->vma);
1159 (*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax);
1161 if (! bfd_ecoff_debug_one_external (abfd, debug, swap,
1162 sym_ptr->name, &esym))
1169 /* Add a single external symbol to the debugging information. */
1172 bfd_ecoff_debug_one_external (abfd, debug, swap, name, esym)
1174 struct ecoff_debug_info *debug;
1175 const struct ecoff_debug_swap *swap;
1179 const bfd_size_type external_ext_size = swap->external_ext_size;
1180 void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
1181 = swap->swap_ext_out;
1182 HDRR * const symhdr = &debug->symbolic_header;
1185 namelen = strlen (name);
1187 if (debug->ssext_end - debug->ssext
1188 < symhdr->issExtMax + namelen + 1)
1190 if (ecoff_add_bytes ((char **) &debug->ssext,
1191 (char **) &debug->ssext_end,
1192 symhdr->issExtMax + namelen + 1)
1196 if ((char *) debug->external_ext_end - (char *) debug->external_ext
1197 < (symhdr->iextMax + 1) * external_ext_size)
1199 if (ecoff_add_bytes ((char **) &debug->external_ext,
1200 (char **) &debug->external_ext_end,
1201 (symhdr->iextMax + 1) * external_ext_size)
1206 esym->asym.iss = symhdr->issExtMax;
1208 (*swap_ext_out) (abfd, esym,
1209 ((char *) debug->external_ext
1210 + symhdr->iextMax * swap->external_ext_size));
1214 strcpy (debug->ssext + symhdr->issExtMax, name);
1215 symhdr->issExtMax += namelen + 1;
1220 /* Align the ECOFF debugging information. */
1224 ecoff_align_debug (abfd, debug, swap)
1226 struct ecoff_debug_info *debug;
1227 const struct ecoff_debug_swap *swap;
1229 HDRR * const symhdr = &debug->symbolic_header;
1230 bfd_size_type debug_align, aux_align, rfd_align;
1233 /* Adjust the counts so that structures are aligned. */
1234 debug_align = swap->debug_align;
1235 aux_align = debug_align / sizeof (union aux_ext);
1236 rfd_align = debug_align / swap->external_rfd_size;
1238 add = debug_align - (symhdr->cbLine & (debug_align - 1));
1239 if (add != debug_align)
1241 if (debug->line != (unsigned char *) NULL)
1242 memset ((PTR) (debug->line + symhdr->cbLine), 0, add);
1243 symhdr->cbLine += add;
1246 add = debug_align - (symhdr->issMax & (debug_align - 1));
1247 if (add != debug_align)
1249 if (debug->ss != (char *) NULL)
1250 memset ((PTR) (debug->ss + symhdr->issMax), 0, add);
1251 symhdr->issMax += add;
1254 add = debug_align - (symhdr->issExtMax & (debug_align - 1));
1255 if (add != debug_align)
1257 if (debug->ssext != (char *) NULL)
1258 memset ((PTR) (debug->ssext + symhdr->issExtMax), 0, add);
1259 symhdr->issExtMax += add;
1262 add = aux_align - (symhdr->iauxMax & (aux_align - 1));
1263 if (add != aux_align)
1265 if (debug->external_aux != (union aux_ext *) NULL)
1266 memset ((PTR) (debug->external_aux + symhdr->iauxMax), 0,
1267 add * sizeof (union aux_ext));
1268 symhdr->iauxMax += add;
1271 add = rfd_align - (symhdr->crfd & (rfd_align - 1));
1272 if (add != rfd_align)
1274 if (debug->external_rfd != (PTR) NULL)
1275 memset ((PTR) ((char *) debug->external_rfd
1276 + symhdr->crfd * swap->external_rfd_size),
1277 0, add * swap->external_rfd_size);
1278 symhdr->crfd += add;
1282 /* Return the size required by the ECOFF debugging information. */
1285 bfd_ecoff_debug_size (abfd, debug, swap)
1287 struct ecoff_debug_info *debug;
1288 const struct ecoff_debug_swap *swap;
1292 ecoff_align_debug (abfd, debug, swap);
1293 tot = swap->external_hdr_size;
1295 #define ADD(count, size) \
1296 tot += debug->symbolic_header.count * size
1298 ADD (cbLine, sizeof (unsigned char));
1299 ADD (idnMax, swap->external_dnr_size);
1300 ADD (ipdMax, swap->external_pdr_size);
1301 ADD (isymMax, swap->external_sym_size);
1302 ADD (ioptMax, swap->external_opt_size);
1303 ADD (iauxMax, sizeof (union aux_ext));
1304 ADD (issMax, sizeof (char));
1305 ADD (issExtMax, sizeof (char));
1306 ADD (ifdMax, swap->external_fdr_size);
1307 ADD (crfd, swap->external_rfd_size);
1308 ADD (iextMax, swap->external_ext_size);
1315 /* Write out the ECOFF symbolic header, given the file position it is
1316 going to be placed at. This assumes that the counts are set
1320 ecoff_write_symhdr (abfd, debug, swap, where)
1322 struct ecoff_debug_info *debug;
1323 const struct ecoff_debug_swap *swap;
1326 HDRR * const symhdr = &debug->symbolic_header;
1329 ecoff_align_debug (abfd, debug, swap);
1331 /* Go to the right location in the file. */
1332 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1335 where += swap->external_hdr_size;
1337 symhdr->magic = swap->sym_magic;
1339 /* Fill in the file offsets. */
1340 #define SET(offset, count, size) \
1341 if (symhdr->count == 0) \
1342 symhdr->offset = 0; \
1345 symhdr->offset = where; \
1346 where += symhdr->count * size; \
1349 SET (cbLineOffset, cbLine, sizeof (unsigned char));
1350 SET (cbDnOffset, idnMax, swap->external_dnr_size);
1351 SET (cbPdOffset, ipdMax, swap->external_pdr_size);
1352 SET (cbSymOffset, isymMax, swap->external_sym_size);
1353 SET (cbOptOffset, ioptMax, swap->external_opt_size);
1354 SET (cbAuxOffset, iauxMax, sizeof (union aux_ext));
1355 SET (cbSsOffset, issMax, sizeof (char));
1356 SET (cbSsExtOffset, issExtMax, sizeof (char));
1357 SET (cbFdOffset, ifdMax, swap->external_fdr_size);
1358 SET (cbRfdOffset, crfd, swap->external_rfd_size);
1359 SET (cbExtOffset, iextMax, swap->external_ext_size);
1362 buff = (PTR) malloc (swap->external_hdr_size);
1363 if (buff == NULL && swap->external_hdr_size != 0)
1365 bfd_set_error (bfd_error_no_memory);
1369 (*swap->swap_hdr_out) (abfd, symhdr, buff);
1370 if (bfd_write (buff, 1, swap->external_hdr_size, abfd)
1371 != swap->external_hdr_size)
1383 /* Write out the ECOFF debugging information. This function assumes
1384 that the information (the pointers and counts) in *DEBUG have been
1385 set correctly. WHERE is the position in the file to write the
1386 information to. This function fills in the file offsets in the
1390 bfd_ecoff_write_debug (abfd, debug, swap, where)
1392 struct ecoff_debug_info *debug;
1393 const struct ecoff_debug_swap *swap;
1396 HDRR * const symhdr = &debug->symbolic_header;
1398 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1401 #define WRITE(ptr, count, size, offset) \
1402 BFD_ASSERT (symhdr->offset == 0 || bfd_tell (abfd) == symhdr->offset); \
1403 if (bfd_write ((PTR) debug->ptr, size, symhdr->count, abfd) \
1404 != size * symhdr->count) \
1407 WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset);
1408 WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset);
1409 WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset);
1410 WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset);
1411 WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset);
1412 WRITE (external_aux, iauxMax, sizeof (union aux_ext), cbAuxOffset);
1413 WRITE (ss, issMax, sizeof (char), cbSsOffset);
1414 WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset);
1415 WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset);
1416 WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset);
1417 WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset);
1423 /* Write out a shuffle list. */
1425 static boolean ecoff_write_shuffle PARAMS ((bfd *,
1426 const struct ecoff_debug_swap *,
1427 struct shuffle *, PTR space));
1430 ecoff_write_shuffle (abfd, swap, shuffle, space)
1432 const struct ecoff_debug_swap *swap;
1433 struct shuffle *shuffle;
1436 register struct shuffle *l;
1437 unsigned long total;
1440 for (l = shuffle; l != (struct shuffle *) NULL; l = l->next)
1444 if (bfd_write (l->u.memory, 1, l->size, abfd) != l->size)
1449 if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
1450 || bfd_read (space, 1, l->size, l->u.file.input_bfd) != l->size
1451 || bfd_write (space, 1, l->size, abfd) != l->size)
1457 if ((total & (swap->debug_align - 1)) != 0)
1462 i = swap->debug_align - (total & (swap->debug_align - 1));
1463 s = (bfd_byte *) malloc (i);
1464 if (s == NULL && i != 0)
1466 bfd_set_error (bfd_error_no_memory);
1470 memset ((PTR) s, 0, i);
1471 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1482 /* Write out debugging information using accumulated linker
1486 bfd_ecoff_write_accumulated_debug (handle, abfd, debug, swap, info, where)
1489 struct ecoff_debug_info *debug;
1490 const struct ecoff_debug_swap *swap;
1491 struct bfd_link_info *info;
1494 struct accumulate *ainfo = (struct accumulate *) handle;
1497 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1500 space = (PTR) malloc (ainfo->largest_file_shuffle);
1501 if (space == NULL && ainfo->largest_file_shuffle != 0)
1503 bfd_set_error (bfd_error_no_memory);
1507 if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space)
1508 || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space)
1509 || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space)
1510 || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space)
1511 || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space))
1514 /* The string table is written out from the hash table if this is a
1516 if (info->relocateable)
1518 BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL);
1519 if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space))
1524 unsigned long total;
1526 struct string_hash_entry *sh;
1528 BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
1530 if (bfd_write ((PTR) &null, 1, 1, abfd) != 1)
1533 BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
1534 for (sh = ainfo->ss_hash;
1535 sh != (struct string_hash_entry *) NULL;
1540 len = strlen (sh->root.string);
1541 if (bfd_write ((PTR) sh->root.string, 1, len + 1, abfd) != len + 1)
1546 if ((total & (swap->debug_align - 1)) != 0)
1551 i = swap->debug_align - (total & (swap->debug_align - 1));
1552 s = (bfd_byte *) malloc (i);
1553 if (s == NULL && i != 0)
1555 bfd_set_error (bfd_error_no_memory);
1558 memset ((PTR) s, 0, i);
1559 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1568 /* The external strings and symbol are not converted over to using
1569 shuffles. FIXME: They probably should be. */
1570 if (bfd_write (debug->ssext, 1, debug->symbolic_header.issExtMax, abfd)
1571 != debug->symbolic_header.issExtMax)
1573 if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0)
1578 i = (swap->debug_align
1579 - (debug->symbolic_header.issExtMax & (swap->debug_align - 1)));
1580 s = (bfd_byte *) malloc (i);
1581 if (s == NULL && i != 0)
1583 bfd_set_error (bfd_error_no_memory);
1586 memset ((PTR) s, 0, i);
1587 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1595 if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space)
1596 || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space))
1599 BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0
1600 || debug->symbolic_header.cbExtOffset == bfd_tell (abfd));
1602 if (bfd_write (debug->external_ext, swap->external_ext_size,
1603 debug->symbolic_header.iextMax, abfd)
1604 != debug->symbolic_header.iextMax * swap->external_ext_size)