1 /* Routines to link ECOFF debugging information.
2 Copyright 1993 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>.
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++)
597 boolean fgotfilename;
599 if (input_debug->ifdmap[i] < output_symhdr->ifdMax)
601 /* We are not copying this FDR. */
605 if (input_debug->fdr != (FDR *) NULL)
606 fdr = *(FDR *) fdr_ptr;
608 (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr);
610 /* Adjust the FDR address for any changes that may have been
612 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
615 struct ecoff_value_adjust *adjust;
618 for (adjust = input_debug->adjust;
619 adjust != (struct ecoff_value_adjust *) NULL;
620 adjust = adjust->next)
621 if (adr >= adjust->start
622 && adr < adjust->end)
623 fdr.adr += adjust->adjust;
626 /* FIXME: It is conceivable that this FDR points to the .init or
627 .fini section, in which case this will not do the right
629 fdr.adr += section_adjust[scText];
631 /* Swap in the local symbols, adjust their values, and swap them
633 fgotfilename = false;
634 sz = fdr.csym * external_sym_size;
635 sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
638 bfd_set_error (bfd_error_no_memory);
641 if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out, sz))
643 lraw_src = ((bfd_byte *) input_debug->external_sym
644 + fdr.isymBase * input_swap->external_sym_size);
645 lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size;
646 for (; lraw_src < lraw_end; lraw_src += input_swap->external_sym_size)
650 (*swap_sym_in) (input_bfd, (PTR) lraw_src, &internal_sym);
652 BFD_ASSERT (internal_sym.sc != scCommon
653 && internal_sym.sc != scSCommon);
655 /* Adjust the symbol value if appropriate. */
656 switch (internal_sym.st)
659 if (ECOFF_IS_STAB (&internal_sym))
667 if (input_debug->adjust != (struct ecoff_value_adjust *) NULL)
670 struct ecoff_value_adjust *adjust;
672 value = internal_sym.value;
673 for (adjust = input_debug->adjust;
674 adjust != (struct ecoff_value_adjust *) NULL;
675 adjust = adjust->next)
676 if (value >= adjust->start
677 && value < adjust->end)
678 internal_sym.value += adjust->adjust;
680 internal_sym.value += section_adjust[internal_sym.sc];
687 /* If we are doing a final link, we hash all the strings in
688 the local symbol table together. This reduces the amount
689 of space required by debugging information. We don't do
690 this when performing a relocateable link because it would
691 prevent us from easily merging different FDR's. */
692 if (! info->relocateable)
697 if (! fgotfilename && internal_sym.iss == fdr.rss)
702 /* Hash the name into the string table. */
703 name = input_debug->ss + fdr.issBase + internal_sym.iss;
705 internal_sym.iss = 0;
708 struct string_hash_entry *sh;
710 sh = string_hash_lookup (&ainfo->str_hash, name, true, true);
711 if (sh == (struct string_hash_entry *) NULL)
715 sh->val = output_symhdr->issMax;
716 output_symhdr->issMax += strlen (name) + 1;
717 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
719 if (ainfo->ss_hash_end
720 != (struct string_hash_entry *) NULL)
721 ainfo->ss_hash_end->next = sh;
722 ainfo->ss_hash_end = sh;
724 internal_sym.iss = sh->val;
729 fdr.rss = internal_sym.iss;
734 (*swap_sym_out) (output_bfd, &internal_sym, sym_out);
735 sym_out += external_sym_size;
738 fdr.isymBase = output_symhdr->isymMax;
739 output_symhdr->isymMax += fdr.csym;
741 /* Copy the information that does not need swapping. */
744 if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end,
746 input_symhdr->cbLineOffset + fdr.cbLineOffset,
749 fdr.ilineBase = output_symhdr->ilineMax;
750 fdr.cbLineOffset = output_symhdr->cbLine;
751 output_symhdr->ilineMax += fdr.cline;
752 output_symhdr->cbLine += fdr.cbLine;
756 if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end,
758 (input_symhdr->cbAuxOffset
759 + fdr.iauxBase * sizeof (union aux_ext)),
760 fdr.caux * sizeof (union aux_ext)))
762 fdr.iauxBase = output_symhdr->iauxMax;
763 output_symhdr->iauxMax += fdr.caux;
765 if (! info->relocateable)
768 /* When are are hashing strings, we lie about the number of
769 strings attached to each FDR. We need to set cbSs
770 because some versions of dbx apparently use it to decide
771 how much of the string table to read in. */
773 fdr.cbSs = output_symhdr->issMax;
775 else if (fdr.cbSs > 0)
777 if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end,
779 input_symhdr->cbSsOffset + fdr.issBase,
782 fdr.issBase = output_symhdr->issMax;
783 output_symhdr->issMax += fdr.cbSs;
786 if (output_bfd->xvec->header_byteorder_big_p
787 == input_bfd->xvec->header_byteorder_big_p)
789 /* The two BFD's have the same endianness, so simply copying
790 the information will suffice. */
791 BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size);
794 if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end,
796 (input_symhdr->cbPdOffset
797 + fdr.ipdFirst * external_pdr_size),
798 fdr.cpd * external_pdr_size))
801 BFD_ASSERT (external_opt_size == input_swap->external_opt_size);
804 if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end,
806 (input_symhdr->cbOptOffset
807 + fdr.ioptBase * external_opt_size),
808 fdr.copt * external_opt_size))
814 bfd_size_type outsz, insz;
819 /* The two BFD's have different endianness, so we must swap
820 everything in and out. This code would always work, but
821 it would be unnecessarily slow in the normal case. */
822 outsz = external_pdr_size;
823 insz = input_swap->external_pdr_size;
824 in = ((bfd_byte *) input_debug->external_pdr
825 + fdr.ipdFirst * insz);
826 end = in + fdr.cpd * insz;
827 sz = fdr.cpd * outsz;
828 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
831 bfd_set_error (bfd_error_no_memory);
834 if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out, sz))
836 for (; in < end; in += insz, out += outsz)
840 (*input_swap->swap_pdr_in) (input_bfd, (PTR) in, &pdr);
841 (*output_swap->swap_pdr_out) (output_bfd, &pdr, (PTR) out);
844 /* Swap over the optimization information. */
845 outsz = external_opt_size;
846 insz = input_swap->external_opt_size;
847 in = ((bfd_byte *) input_debug->external_opt
848 + fdr.ioptBase * insz);
849 end = in + fdr.copt * insz;
850 sz = fdr.copt * outsz;
851 out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz);
854 bfd_set_error (bfd_error_no_memory);
857 if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out, sz))
859 for (; in < end; in += insz, out += outsz)
863 (*input_swap->swap_opt_in) (input_bfd, (PTR) in, &opt);
864 (*output_swap->swap_opt_out) (output_bfd, &opt, (PTR) out);
868 fdr.ipdFirst = output_symhdr->ipdMax;
869 output_symhdr->ipdMax += fdr.cpd;
870 fdr.ioptBase = output_symhdr->ioptMax;
871 output_symhdr->ioptMax += fdr.copt;
875 /* Point this FDR at the table of RFD's we created. */
876 fdr.rfdBase = newrfdbase;
877 fdr.crfd = input_symhdr->ifdMax;
881 /* Point this FDR at the remapped RFD's. */
882 fdr.rfdBase += oldrfdbase;
885 (*swap_fdr_out) (output_bfd, &fdr, fdr_out);
886 fdr_out += external_fdr_size;
887 ++output_symhdr->ifdMax;
893 /* Add a string to the debugging information we are accumulating.
894 Return the offset from the fdr string base. */
896 static long ecoff_add_string PARAMS ((struct accumulate *,
897 struct bfd_link_info *,
898 struct ecoff_debug_info *,
899 FDR *fdr, const char *string));
902 ecoff_add_string (ainfo, info, debug, fdr, string)
903 struct accumulate *ainfo;
904 struct bfd_link_info *info;
905 struct ecoff_debug_info *debug;
913 symhdr = &debug->symbolic_header;
914 len = strlen (string);
915 if (info->relocateable)
917 if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, (PTR) string,
920 ret = symhdr->issMax;
921 symhdr->issMax += len + 1;
922 fdr->cbSs += len + 1;
926 struct string_hash_entry *sh;
928 sh = string_hash_lookup (&ainfo->str_hash, string, true, true);
929 if (sh == (struct string_hash_entry *) NULL)
933 sh->val = symhdr->issMax;
934 symhdr->issMax += len + 1;
935 if (ainfo->ss_hash == (struct string_hash_entry *) NULL)
937 if (ainfo->ss_hash_end
938 != (struct string_hash_entry *) NULL)
939 ainfo->ss_hash_end->next = sh;
940 ainfo->ss_hash_end = sh;
948 /* Add debugging information from a non-ECOFF file. */
951 bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug,
952 output_swap, input_bfd, info)
955 struct ecoff_debug_info *output_debug;
956 const struct ecoff_debug_swap *output_swap;
958 struct bfd_link_info *info;
960 struct accumulate *ainfo = (struct accumulate *) handle;
961 void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
962 = output_swap->swap_sym_out;
963 HDRR *output_symhdr = &output_debug->symbolic_header;
973 memset ((PTR) &fdr, 0, sizeof fdr);
975 sec = bfd_get_section_by_name (input_bfd, ".text");
977 fdr.adr = sec->output_section->vma + sec->output_offset;
980 /* FIXME: What about .init or .fini? */
984 fdr.issBase = output_symhdr->issMax;
986 fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr,
987 bfd_get_filename (input_bfd));
990 fdr.isymBase = output_symhdr->isymMax;
992 /* Get the local symbols from the input BFD. */
993 symsize = bfd_get_symtab_upper_bound (input_bfd);
996 symbols = (asymbol **) bfd_alloc (output_bfd, symsize);
997 if (symbols == (asymbol **) NULL)
999 bfd_set_error (bfd_error_no_memory);
1002 symcount = bfd_canonicalize_symtab (input_bfd, symbols);
1005 sym_end = symbols + symcount;
1007 /* Handle the local symbols. Any external symbols are handled
1010 for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++)
1015 if (((*sym_ptr)->flags & BSF_EXPORT) != 0)
1017 memset ((PTR) &internal_sym, 0, sizeof internal_sym);
1018 internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr,
1021 if (internal_sym.iss == -1)
1023 if (bfd_is_com_section ((*sym_ptr)->section)
1024 || (*sym_ptr)->section == &bfd_und_section)
1025 internal_sym.value = (*sym_ptr)->value;
1027 internal_sym.value = ((*sym_ptr)->value
1028 + (*sym_ptr)->section->output_offset
1029 + (*sym_ptr)->section->output_section->vma);
1030 internal_sym.st = stNil;
1031 internal_sym.sc = scUndefined;
1032 internal_sym.index = indexNil;
1034 external_sym = (PTR) obstack_alloc (&ainfo->memory,
1035 output_swap->external_sym_size);
1038 bfd_set_error (bfd_error_no_memory);
1041 (*swap_sym_out) (output_bfd, &internal_sym, external_sym);
1042 add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end,
1043 external_sym, output_swap->external_sym_size);
1045 ++output_symhdr->isymMax;
1048 bfd_release (output_bfd, (PTR) symbols);
1050 /* Leave everything else in the FDR zeroed out. This will cause
1051 the lang field to be langC. The fBigendian field will
1052 indicate little endian format, but it doesn't matter because
1053 it only applies to aux fields and there are none. */
1054 external_fdr = (PTR) obstack_alloc (&ainfo->memory,
1055 output_swap->external_fdr_size);
1058 bfd_set_error (bfd_error_no_memory);
1061 (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr);
1062 add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end,
1063 external_fdr, output_swap->external_fdr_size);
1065 ++output_symhdr->ifdMax;
1070 /* Set up ECOFF debugging information for the external symbols.
1071 FIXME: This is done using a memory buffer, but it should be
1072 probably be changed to use a shuffle structure. The assembler uses
1073 this interface, so that must be changed to do something else. */
1076 bfd_ecoff_debug_externals (abfd, debug, swap, relocateable, get_extr,
1079 struct ecoff_debug_info *debug;
1080 const struct ecoff_debug_swap *swap;
1081 boolean relocateable;
1082 boolean (*get_extr) PARAMS ((asymbol *, EXTR *));
1083 void (*set_index) PARAMS ((asymbol *, bfd_size_type));
1085 HDRR * const symhdr = &debug->symbolic_header;
1086 asymbol **sym_ptr_ptr;
1089 sym_ptr_ptr = bfd_get_outsymbols (abfd);
1090 if (sym_ptr_ptr == NULL)
1093 for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++)
1098 sym_ptr = *sym_ptr_ptr;
1100 /* Get the external symbol information. */
1101 if ((*get_extr) (sym_ptr, &esym) == false)
1104 /* If we're producing an executable, move common symbols into
1106 if (relocateable == false)
1108 if (esym.asym.sc == scCommon)
1109 esym.asym.sc = scBss;
1110 else if (esym.asym.sc == scSCommon)
1111 esym.asym.sc = scSBss;
1114 if (bfd_is_com_section (sym_ptr->section)
1115 || sym_ptr->section == &bfd_und_section)
1117 /* FIXME: gas does not keep the value of a small undefined
1118 symbol in the symbol itself, because of relocation
1120 if (esym.asym.sc != scSUndefined
1121 || esym.asym.value == 0
1122 || sym_ptr->value != 0)
1123 esym.asym.value = sym_ptr->value;
1126 esym.asym.value = (sym_ptr->value
1127 + sym_ptr->section->output_offset
1128 + sym_ptr->section->output_section->vma);
1131 (*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax);
1133 if (! bfd_ecoff_debug_one_external (abfd, debug, swap,
1134 sym_ptr->name, &esym))
1141 /* Add a single external symbol to the debugging information. */
1144 bfd_ecoff_debug_one_external (abfd, debug, swap, name, esym)
1146 struct ecoff_debug_info *debug;
1147 const struct ecoff_debug_swap *swap;
1151 const bfd_size_type external_ext_size = swap->external_ext_size;
1152 void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR))
1153 = swap->swap_ext_out;
1154 HDRR * const symhdr = &debug->symbolic_header;
1157 namelen = strlen (name);
1159 if (debug->ssext_end - debug->ssext
1160 < symhdr->issExtMax + namelen + 1)
1162 if (ecoff_add_bytes ((char **) &debug->ssext,
1163 (char **) &debug->ssext_end,
1164 symhdr->issExtMax + namelen + 1)
1168 if ((char *) debug->external_ext_end - (char *) debug->external_ext
1169 < (symhdr->iextMax + 1) * external_ext_size)
1171 if (ecoff_add_bytes ((char **) &debug->external_ext,
1172 (char **) &debug->external_ext_end,
1173 (symhdr->iextMax + 1) * external_ext_size)
1178 esym->asym.iss = symhdr->issExtMax;
1180 (*swap_ext_out) (abfd, esym,
1181 ((char *) debug->external_ext
1182 + symhdr->iextMax * swap->external_ext_size));
1186 strcpy (debug->ssext + symhdr->issExtMax, name);
1187 symhdr->issExtMax += namelen + 1;
1192 /* Align the ECOFF debugging information. */
1196 ecoff_align_debug (abfd, debug, swap)
1198 struct ecoff_debug_info *debug;
1199 const struct ecoff_debug_swap *swap;
1201 HDRR * const symhdr = &debug->symbolic_header;
1202 bfd_size_type debug_align, aux_align, rfd_align;
1205 /* Adjust the counts so that structures are aligned. */
1206 debug_align = swap->debug_align;
1207 aux_align = debug_align / sizeof (union aux_ext);
1208 rfd_align = debug_align / swap->external_rfd_size;
1210 add = debug_align - (symhdr->cbLine & (debug_align - 1));
1211 if (add != debug_align)
1213 if (debug->line != (unsigned char *) NULL)
1214 memset ((PTR) (debug->line + symhdr->cbLine), 0, add);
1215 symhdr->cbLine += add;
1218 add = debug_align - (symhdr->issMax & (debug_align - 1));
1219 if (add != debug_align)
1221 if (debug->ss != (char *) NULL)
1222 memset ((PTR) (debug->ss + symhdr->issMax), 0, add);
1223 symhdr->issMax += add;
1226 add = debug_align - (symhdr->issExtMax & (debug_align - 1));
1227 if (add != debug_align)
1229 if (debug->ssext != (char *) NULL)
1230 memset ((PTR) (debug->ssext + symhdr->issExtMax), 0, add);
1231 symhdr->issExtMax += add;
1234 add = aux_align - (symhdr->iauxMax & (aux_align - 1));
1235 if (add != aux_align)
1237 if (debug->external_aux != (union aux_ext *) NULL)
1238 memset ((PTR) (debug->external_aux + symhdr->iauxMax), 0,
1239 add * sizeof (union aux_ext));
1240 symhdr->iauxMax += add;
1243 add = rfd_align - (symhdr->crfd & (rfd_align - 1));
1244 if (add != rfd_align)
1246 if (debug->external_rfd != (PTR) NULL)
1247 memset ((PTR) ((char *) debug->external_rfd
1248 + symhdr->crfd * swap->external_rfd_size),
1249 0, add * swap->external_rfd_size);
1250 symhdr->crfd += add;
1254 /* Return the size required by the ECOFF debugging information. */
1257 bfd_ecoff_debug_size (abfd, debug, swap)
1259 struct ecoff_debug_info *debug;
1260 const struct ecoff_debug_swap *swap;
1264 ecoff_align_debug (abfd, debug, swap);
1265 tot = swap->external_hdr_size;
1267 #define ADD(count, size) \
1268 tot += debug->symbolic_header.count * size
1270 ADD (cbLine, sizeof (unsigned char));
1271 ADD (idnMax, swap->external_dnr_size);
1272 ADD (ipdMax, swap->external_pdr_size);
1273 ADD (isymMax, swap->external_sym_size);
1274 ADD (ioptMax, swap->external_opt_size);
1275 ADD (iauxMax, sizeof (union aux_ext));
1276 ADD (issMax, sizeof (char));
1277 ADD (issExtMax, sizeof (char));
1278 ADD (ifdMax, swap->external_fdr_size);
1279 ADD (crfd, swap->external_rfd_size);
1280 ADD (iextMax, swap->external_ext_size);
1287 /* Write out the ECOFF symbolic header, given the file position it is
1288 going to be placed at. This assumes that the counts are set
1292 ecoff_write_symhdr (abfd, debug, swap, where)
1294 struct ecoff_debug_info *debug;
1295 const struct ecoff_debug_swap *swap;
1298 HDRR * const symhdr = &debug->symbolic_header;
1301 ecoff_align_debug (abfd, debug, swap);
1303 /* Go to the right location in the file. */
1304 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1307 where += swap->external_hdr_size;
1309 symhdr->magic = swap->sym_magic;
1311 /* Fill in the file offsets. */
1312 #define SET(offset, count, size) \
1313 if (symhdr->count == 0) \
1314 symhdr->offset = 0; \
1317 symhdr->offset = where; \
1318 where += symhdr->count * size; \
1321 SET (cbLineOffset, cbLine, sizeof (unsigned char));
1322 SET (cbDnOffset, idnMax, swap->external_dnr_size);
1323 SET (cbPdOffset, ipdMax, swap->external_pdr_size);
1324 SET (cbSymOffset, isymMax, swap->external_sym_size);
1325 SET (cbOptOffset, ioptMax, swap->external_opt_size);
1326 SET (cbAuxOffset, iauxMax, sizeof (union aux_ext));
1327 SET (cbSsOffset, issMax, sizeof (char));
1328 SET (cbSsExtOffset, issExtMax, sizeof (char));
1329 SET (cbFdOffset, ifdMax, swap->external_fdr_size);
1330 SET (cbRfdOffset, crfd, swap->external_rfd_size);
1331 SET (cbExtOffset, iextMax, swap->external_ext_size);
1334 buff = (PTR) malloc (swap->external_hdr_size);
1335 if (buff == NULL && swap->external_hdr_size != 0)
1337 bfd_set_error (bfd_error_no_memory);
1341 (*swap->swap_hdr_out) (abfd, symhdr, buff);
1342 if (bfd_write (buff, 1, swap->external_hdr_size, abfd)
1343 != swap->external_hdr_size)
1355 /* Write out the ECOFF debugging information. This function assumes
1356 that the information (the pointers and counts) in *DEBUG have been
1357 set correctly. WHERE is the position in the file to write the
1358 information to. This function fills in the file offsets in the
1362 bfd_ecoff_write_debug (abfd, debug, swap, where)
1364 struct ecoff_debug_info *debug;
1365 const struct ecoff_debug_swap *swap;
1368 HDRR * const symhdr = &debug->symbolic_header;
1370 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1373 #define WRITE(ptr, count, size, offset) \
1374 BFD_ASSERT (symhdr->offset == 0 || bfd_tell (abfd) == symhdr->offset); \
1375 if (bfd_write ((PTR) debug->ptr, size, symhdr->count, abfd) \
1376 != size * symhdr->count) \
1379 WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset);
1380 WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset);
1381 WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset);
1382 WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset);
1383 WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset);
1384 WRITE (external_aux, iauxMax, sizeof (union aux_ext), cbAuxOffset);
1385 WRITE (ss, issMax, sizeof (char), cbSsOffset);
1386 WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset);
1387 WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset);
1388 WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset);
1389 WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset);
1395 /* Write out a shuffle list. */
1397 static boolean ecoff_write_shuffle PARAMS ((bfd *,
1398 const struct ecoff_debug_swap *,
1399 struct shuffle *, PTR space));
1402 ecoff_write_shuffle (abfd, swap, shuffle, space)
1404 const struct ecoff_debug_swap *swap;
1405 struct shuffle *shuffle;
1408 register struct shuffle *l;
1409 unsigned long total;
1412 for (l = shuffle; l != (struct shuffle *) NULL; l = l->next)
1416 if (bfd_write (l->u.memory, 1, l->size, abfd) != l->size)
1421 if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0
1422 || bfd_read (space, 1, l->size, l->u.file.input_bfd) != l->size
1423 || bfd_write (space, 1, l->size, abfd) != l->size)
1429 if ((total & (swap->debug_align - 1)) != 0)
1434 i = swap->debug_align - (total & (swap->debug_align - 1));
1435 s = (bfd_byte *) malloc (i);
1436 if (s == NULL && i != 0)
1438 bfd_set_error (bfd_error_no_memory);
1442 memset ((PTR) s, 0, i);
1443 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1454 /* Write out debugging information using accumulated linker
1458 bfd_ecoff_write_accumulated_debug (handle, abfd, debug, swap, info, where)
1461 struct ecoff_debug_info *debug;
1462 const struct ecoff_debug_swap *swap;
1463 struct bfd_link_info *info;
1466 struct accumulate *ainfo = (struct accumulate *) handle;
1469 if (! ecoff_write_symhdr (abfd, debug, swap, where))
1472 space = (PTR) malloc (ainfo->largest_file_shuffle);
1473 if (space == NULL && ainfo->largest_file_shuffle != 0)
1475 bfd_set_error (bfd_error_no_memory);
1479 if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space)
1480 || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space)
1481 || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space)
1482 || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space)
1483 || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space))
1486 /* The string table is written out from the hash table if this is a
1488 if (info->relocateable)
1490 BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL);
1491 if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space))
1496 unsigned long total;
1498 struct string_hash_entry *sh;
1500 BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL);
1502 if (bfd_write ((PTR) &null, 1, 1, abfd) != 1)
1505 BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1);
1506 for (sh = ainfo->ss_hash;
1507 sh != (struct string_hash_entry *) NULL;
1512 len = strlen (sh->root.string);
1513 if (bfd_write ((PTR) sh->root.string, 1, len + 1, abfd) != len + 1)
1518 if ((total & (swap->debug_align - 1)) != 0)
1523 i = swap->debug_align - (total & (swap->debug_align - 1));
1524 s = (bfd_byte *) malloc (i);
1525 if (s == NULL && i != 0)
1527 bfd_set_error (bfd_error_no_memory);
1530 memset ((PTR) s, 0, i);
1531 if (bfd_write ((PTR) s, 1, i, abfd) != i)
1540 /* The external strings and symbol are not converted over to using
1541 shuffles. FIXME: They probably should be. */
1542 if (bfd_write (debug->ssext, 1, debug->symbolic_header.issExtMax, abfd)
1543 != debug->symbolic_header.issExtMax)
1545 if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0)
1550 i = (swap->debug_align
1551 - (debug->symbolic_header.issExtMax & (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)
1567 if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space)
1568 || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space))
1571 BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0
1572 || debug->symbolic_header.cbExtOffset == bfd_tell (abfd));
1574 if (bfd_write (debug->external_ext, swap->external_ext_size,
1575 debug->symbolic_header.iextMax, abfd)
1576 != debug->symbolic_header.iextMax * swap->external_ext_size)