1 /* Stabs in sections linking support.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
22 /* This file contains support for linking stabs in sections, as used
28 #include "aout/stab_gnu.h"
29 #include "safe-ctype.h"
31 /* Stabs entries use a 12 byte format:
32 4 byte string table index
34 1 byte stab other field
35 2 byte stab desc field
37 FIXME: This will have to change for a 64 bit object format.
39 The stabs symbols are divided into compilation units. For the
40 first entry in each unit, the type of 0, the value is the length of
41 the string table for this unit, and the desc field is the number of
42 stabs symbols for this unit. */
51 /* A linked list of totals that we have found for a particular header
52 file. A total is a unique identifier for a particular BINCL...EINCL
53 sequence of STABs that can be used to identify duplicate sequences.
54 It consists of three fields, 'sum_chars' which is the sum of all the
55 STABS characters; 'num_chars' which is the number of these charactes
56 and 'symb' which is a buffer of all the symbols in the sequence. This
57 buffer is only checked as a last resort. */
59 struct stab_link_includes_totals
61 struct stab_link_includes_totals *next;
62 bfd_vma sum_chars; /* Accumulated sum of STABS characters. */
63 bfd_vma num_chars; /* Number of STABS characters. */
64 const char* symb; /* The STABS characters themselves. */
67 /* An entry in the header file hash table. */
69 struct stab_link_includes_entry
71 struct bfd_hash_entry root;
72 /* List of totals we have found for this file. */
73 struct stab_link_includes_totals *totals;
76 /* This structure is used to hold a list of N_BINCL symbols, some of
77 which might be converted into N_EXCL symbols. */
81 /* The next symbol to convert. */
82 struct stab_excl_list *next;
83 /* The offset to this symbol in the section contents. */
85 /* The value to use for the symbol. */
87 /* The type of this symbol (N_BINCL or N_EXCL). */
91 /* This structure is stored with each .stab section. */
93 struct stab_section_info
95 /* This is a linked list of N_BINCL symbols which should be
96 converted into N_EXCL symbols. */
97 struct stab_excl_list *excls;
99 /* This is used to map input stab offsets within their sections
100 to output stab offsets, to take into account stabs that have
101 been deleted. If it is NULL, the output offsets are the same
102 as the input offsets, because no stabs have been deleted from
103 this section. Otherwise the i'th entry is the number of
104 bytes of stabs that have been deleted prior to the i'th
106 bfd_size_type *cumulative_skips;
108 /* This is an array of string indices. For each stab symbol, we
109 store the string index here. If a stab symbol should not be
110 included in the final output, the string index is -1. */
111 bfd_size_type stridxs[1];
114 static struct bfd_hash_entry *stab_link_includes_newfunc
115 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
117 /* The function to create a new entry in the header file hash table. */
119 static struct bfd_hash_entry *
120 stab_link_includes_newfunc (entry, table, string)
121 struct bfd_hash_entry *entry;
122 struct bfd_hash_table *table;
125 struct stab_link_includes_entry *ret =
126 (struct stab_link_includes_entry *) entry;
128 /* Allocate the structure if it has not already been allocated by a
130 if (ret == (struct stab_link_includes_entry *) NULL)
131 ret = ((struct stab_link_includes_entry *)
132 bfd_hash_allocate (table,
133 sizeof (struct stab_link_includes_entry)));
134 if (ret == (struct stab_link_includes_entry *) NULL)
135 return (struct bfd_hash_entry *) ret;
137 /* Call the allocation method of the superclass. */
138 ret = ((struct stab_link_includes_entry *)
139 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
142 /* Set local fields. */
146 return (struct bfd_hash_entry *) ret;
149 /* This function is called for each input file from the add_symbols
150 pass of the linker. */
153 _bfd_link_section_stabs (abfd, sinfo, stabsec, stabstrsec, psecinfo, pstring_offset)
155 struct stab_info *sinfo;
157 asection *stabstrsec;
159 bfd_size_type *pstring_offset;
162 bfd_size_type count, amt;
163 struct stab_section_info *secinfo;
164 bfd_byte *stabbuf = NULL;
165 bfd_byte *stabstrbuf = NULL;
166 bfd_byte *sym, *symend;
167 bfd_size_type stroff, next_stroff, skip;
168 bfd_size_type *pstridx;
170 if (stabsec->size == 0
171 || stabstrsec->size == 0)
173 /* This file does not contain stabs debugging information. */
177 if (stabsec->size % STABSIZE != 0)
179 /* Something is wrong with the format of these stab symbols.
180 Don't try to optimize them. */
184 if ((stabstrsec->flags & SEC_RELOC) != 0)
186 /* We shouldn't see relocations in the strings, and we aren't
187 prepared to handle them. */
191 if ((stabsec->output_section != NULL
192 && bfd_is_abs_section (stabsec->output_section))
193 || (stabstrsec->output_section != NULL
194 && bfd_is_abs_section (stabstrsec->output_section)))
196 /* At least one of the sections is being discarded from the
197 link, so we should just ignore them. */
203 if (sinfo->stabstr == NULL)
205 /* Initialize the stabs information we need to keep track of. */
207 sinfo->strings = _bfd_stringtab_init ();
208 if (sinfo->strings == NULL)
210 /* Make sure the first byte is zero. */
211 (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE);
212 if (! bfd_hash_table_init_n (&sinfo->includes,
213 stab_link_includes_newfunc,
216 sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr");
217 if (sinfo->stabstr == NULL)
219 sinfo->stabstr->flags |= (SEC_HAS_CONTENTS | SEC_READONLY
220 | SEC_DEBUGGING | SEC_LINKER_CREATED);
223 /* Initialize the information we are going to store for this .stab
226 count = stabsec->size / STABSIZE;
228 amt = sizeof (struct stab_section_info);
229 amt += (count - 1) * sizeof (bfd_size_type);
230 *psecinfo = bfd_alloc (abfd, amt);
231 if (*psecinfo == NULL)
234 secinfo = (struct stab_section_info *) *psecinfo;
235 secinfo->excls = NULL;
236 stabsec->rawsize = stabsec->size;
237 secinfo->cumulative_skips = NULL;
238 memset (secinfo->stridxs, 0, (size_t) count * sizeof (bfd_size_type));
240 /* Read the stabs information from abfd. */
242 if (!bfd_malloc_and_get_section (abfd, stabsec, &stabbuf)
243 || !bfd_malloc_and_get_section (abfd, stabstrsec, &stabstrbuf))
246 /* Look through the stabs symbols, work out the new string indices,
247 and identify N_BINCL symbols which can be eliminated. */
250 /* The stabs sections can be split when
251 -split-by-reloc/-split-by-file is used. We must keep track of
252 each stab section's place in the single concatenated string
254 next_stroff = pstring_offset ? *pstring_offset : 0;
257 symend = stabbuf + stabsec->size;
258 for (sym = stabbuf, pstridx = secinfo->stridxs;
260 sym += STABSIZE, ++pstridx)
262 bfd_size_type symstroff;
268 /* This symbol has already been handled by an N_BINCL pass. */
276 /* Special type 0 stabs indicate the offset to the next
277 string table. We only copy the very first one. */
278 stroff = next_stroff;
279 next_stroff += bfd_get_32 (abfd, sym + 8);
281 *pstring_offset = next_stroff;
284 *pstridx = (bfd_size_type) -1;
291 /* Store the string in the hash table, and record the index. */
292 symstroff = stroff + bfd_get_32 (abfd, sym + STRDXOFF);
293 if (symstroff >= stabstrsec->size)
295 (*_bfd_error_handler)
296 (_("%s(%s+0x%lx): Stabs entry has invalid string index."),
297 bfd_archive_filename (abfd),
298 bfd_get_section_name (abfd, stabsec),
299 (long) (sym - stabbuf));
300 bfd_set_error (bfd_error_bad_value);
303 string = (char *) stabstrbuf + symstroff;
304 *pstridx = _bfd_stringtab_add (sinfo->strings, string, TRUE, TRUE);
306 /* An N_BINCL symbol indicates the start of the stabs entries
307 for a header file. We need to scan ahead to the next N_EINCL
308 symbol, ignoring nesting, adding up all the characters in the
309 symbol names, not including the file numbers in types (the
310 first number after an open parenthesis). */
311 if (type == (int) N_BINCL)
320 struct stab_link_includes_entry * incl_entry;
321 struct stab_link_includes_totals * t;
322 struct stab_excl_list * ne;
324 symb = symb_rover = NULL;
325 sum_chars = num_chars = 0;
328 for (incl_sym = sym + STABSIZE;
330 incl_sym += STABSIZE)
334 incl_type = incl_sym[TYPEOFF];
337 else if (incl_type == (int) N_EXCL)
339 else if (incl_type == (int) N_EINCL)
345 else if (incl_type == (int) N_BINCL)
351 str = ((char *) stabstrbuf
353 + bfd_get_32 (abfd, incl_sym + STRDXOFF));
354 for (; *str != '\0'; str++)
356 if (num_chars >= buf_len)
358 buf_len += 32 * 1024;
359 symb = bfd_realloc (symb, buf_len);
362 symb_rover = symb + num_chars;
364 * symb_rover ++ = * str;
369 /* Skip the file number. */
371 while (ISDIGIT (*str))
379 BFD_ASSERT (num_chars == (bfd_vma) (symb_rover - symb));
381 /* If we have already included a header file with the same
382 value, then replaced this one with an N_EXCL symbol. */
383 incl_entry = (struct stab_link_includes_entry * )
384 bfd_hash_lookup (&sinfo->includes, string, TRUE, TRUE);
385 if (incl_entry == NULL)
388 for (t = incl_entry->totals; t != NULL; t = t->next)
389 if (t->sum_chars == sum_chars
390 && t->num_chars == num_chars
391 && memcmp (t->symb, symb, num_chars) == 0)
394 /* Record this symbol, so that we can set the value
397 ne = (struct stab_excl_list *) bfd_alloc (abfd, amt);
400 ne->offset = sym - stabbuf;
402 ne->type = (int) N_BINCL;
403 ne->next = secinfo->excls;
408 /* This is the first time we have seen this header file
409 with this set of stabs strings. */
410 t = ((struct stab_link_includes_totals *)
411 bfd_hash_allocate (&sinfo->includes, sizeof *t));
414 t->sum_chars = sum_chars;
415 t->num_chars = num_chars;
416 t->symb = bfd_realloc (symb, num_chars); /* Trim data down. */
417 t->next = incl_entry->totals;
418 incl_entry->totals = t;
422 bfd_size_type *incl_pstridx;
424 /* We have seen this header file before. Tell the final
425 pass to change the type to N_EXCL. */
426 ne->type = (int) N_EXCL;
428 /* Free off superfluous symbols. */
431 /* Mark the skipped symbols. */
434 for (incl_sym = sym + STABSIZE, incl_pstridx = pstridx + 1;
436 incl_sym += STABSIZE, ++incl_pstridx)
440 incl_type = incl_sym[TYPEOFF];
442 if (incl_type == (int) N_EINCL)
446 *incl_pstridx = (bfd_size_type) -1;
452 else if (incl_type == (int) N_BINCL)
454 else if (incl_type == (int) N_EXCL)
455 /* Keep existing exclusion marks. */
459 *incl_pstridx = (bfd_size_type) -1;
472 /* We need to set the section sizes such that the linker will
473 compute the output section sizes correctly. We set the .stab
474 size to not include the entries we don't want. We set
475 SEC_EXCLUDE for the .stabstr section, so that it will be dropped
476 from the link. We record the size of the strtab in the first
477 .stabstr section we saw, and make sure we don't set SEC_EXCLUDE
479 stabsec->size = (count - skip) * STABSIZE;
480 if (stabsec->size == 0)
481 stabsec->flags |= SEC_EXCLUDE;
482 stabstrsec->flags |= SEC_EXCLUDE;
483 sinfo->stabstr->size = _bfd_stringtab_size (sinfo->strings);
485 /* Calculate the `cumulative_skips' array now that stabs have been
486 deleted for this section. */
490 bfd_size_type i, offset;
491 bfd_size_type *pskips;
493 amt = count * sizeof (bfd_size_type);
494 secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt);
495 if (secinfo->cumulative_skips == NULL)
498 pskips = secinfo->cumulative_skips;
499 pstridx = secinfo->stridxs;
502 for (i = 0; i < count; i++, pskips++, pstridx++)
505 if (*pstridx == (bfd_size_type) -1)
509 BFD_ASSERT (offset != 0);
517 if (stabstrbuf != NULL)
522 /* This function is called for each input file before the stab
523 section is relocated. It discards stab entries for discarded
524 functions and variables. The function returns TRUE iff
525 any entries have been deleted.
529 _bfd_discard_section_stabs (abfd, stabsec, psecinfo,
530 reloc_symbol_deleted_p, cookie)
534 bfd_boolean (*reloc_symbol_deleted_p) PARAMS ((bfd_vma, PTR));
537 bfd_size_type count, amt;
538 struct stab_section_info *secinfo;
539 bfd_byte *stabbuf = NULL;
540 bfd_byte *sym, *symend;
542 bfd_size_type *pstridx;
545 if (stabsec->size == 0)
547 /* This file does not contain stabs debugging information. */
551 if (stabsec->size % STABSIZE != 0)
553 /* Something is wrong with the format of these stab symbols.
554 Don't try to optimize them. */
558 if ((stabsec->output_section != NULL
559 && bfd_is_abs_section (stabsec->output_section)))
561 /* At least one of the sections is being discarded from the
562 link, so we should just ignore them. */
566 /* We should have initialized our data in _bfd_link_stab_sections.
567 If there was some bizarre error reading the string sections, though,
568 we might not have. Bail rather than asserting. */
569 if (psecinfo == NULL)
572 count = stabsec->rawsize / STABSIZE;
573 secinfo = (struct stab_section_info *) psecinfo;
575 /* Read the stabs information from abfd. */
577 if (!bfd_malloc_and_get_section (abfd, stabsec, &stabbuf))
580 /* Look through the stabs symbols and discard any information for
581 discarded functions. */
586 symend = stabbuf + stabsec->rawsize;
587 for (sym = stabbuf, pstridx = secinfo->stridxs;
589 sym += STABSIZE, ++pstridx)
593 if (*pstridx == (bfd_size_type) -1)
595 /* This stab was deleted in a previous pass. */
601 if (type == (int) N_FUN)
603 int strx = bfd_get_32 (abfd, sym + STRDXOFF);
616 if ((*reloc_symbol_deleted_p) (sym + VALOFF - stabbuf, cookie))
625 else if (deleting == -1)
627 /* Outside of a function. Check for deleted variables. */
628 if (type == (int) N_STSYM || type == (int) N_LCSYM)
629 if ((*reloc_symbol_deleted_p) (sym + VALOFF - stabbuf, cookie))
634 /* We should also check for N_GSYM entries which reference a
635 deleted global, but those are less harmful to debuggers
636 and would require parsing the stab strings. */
643 /* Shrink the stabsec as needed. */
644 stabsec->size -= skip * STABSIZE;
645 if (stabsec->size == 0)
646 stabsec->flags |= SEC_EXCLUDE;
648 /* Recalculate the `cumulative_skips' array now that stabs have been
649 deleted for this section. */
653 bfd_size_type i, offset;
654 bfd_size_type *pskips;
656 if (secinfo->cumulative_skips == NULL)
658 amt = count * sizeof (bfd_size_type);
659 secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt);
660 if (secinfo->cumulative_skips == NULL)
664 pskips = secinfo->cumulative_skips;
665 pstridx = secinfo->stridxs;
668 for (i = 0; i < count; i++, pskips++, pstridx++)
671 if (*pstridx == (bfd_size_type) -1)
675 BFD_ASSERT (offset != 0);
686 /* Write out the stab section. This is called with the relocated
690 _bfd_write_section_stabs (output_bfd, sinfo, stabsec, psecinfo, contents)
692 struct stab_info *sinfo;
697 struct stab_section_info *secinfo;
698 struct stab_excl_list *e;
699 bfd_byte *sym, *tosym, *symend;
700 bfd_size_type *pstridx;
702 secinfo = (struct stab_section_info *) *psecinfo;
705 return bfd_set_section_contents (output_bfd, stabsec->output_section,
706 contents, stabsec->output_offset,
709 /* Handle each N_BINCL entry. */
710 for (e = secinfo->excls; e != NULL; e = e->next)
714 BFD_ASSERT (e->offset < stabsec->rawsize);
715 excl_sym = contents + e->offset;
716 bfd_put_32 (output_bfd, e->val, excl_sym + VALOFF);
717 excl_sym[TYPEOFF] = e->type;
720 /* Copy over all the stabs symbols, omitting the ones we don't want,
721 and correcting the string indices for those we do want. */
723 symend = contents + stabsec->rawsize;
724 for (sym = contents, pstridx = secinfo->stridxs;
726 sym += STABSIZE, ++pstridx)
728 if (*pstridx != (bfd_size_type) -1)
731 memcpy (tosym, sym, STABSIZE);
732 bfd_put_32 (output_bfd, *pstridx, tosym + STRDXOFF);
734 if (sym[TYPEOFF] == 0)
736 /* This is the header symbol for the stabs section. We
737 don't really need one, since we have merged all the
738 input stabs sections into one, but we generate one
739 for the benefit of readers which expect to see one. */
740 BFD_ASSERT (sym == contents);
741 bfd_put_32 (output_bfd, _bfd_stringtab_size (sinfo->strings),
743 bfd_put_16 (output_bfd,
744 stabsec->output_section->size / STABSIZE - 1,
752 BFD_ASSERT ((bfd_size_type) (tosym - contents) == stabsec->size);
754 return bfd_set_section_contents (output_bfd, stabsec->output_section,
755 contents, (file_ptr) stabsec->output_offset,
759 /* Write out the .stabstr section. */
762 _bfd_write_stab_strings (output_bfd, sinfo)
764 struct stab_info *sinfo;
766 if (bfd_is_abs_section (sinfo->stabstr->output_section))
768 /* The section was discarded from the link. */
772 BFD_ASSERT ((sinfo->stabstr->output_offset
773 + _bfd_stringtab_size (sinfo->strings))
774 <= sinfo->stabstr->output_section->size);
776 if (bfd_seek (output_bfd,
777 (file_ptr) (sinfo->stabstr->output_section->filepos
778 + sinfo->stabstr->output_offset),
782 if (! _bfd_stringtab_emit (output_bfd, sinfo->strings))
785 /* We no longer need the stabs information. */
786 _bfd_stringtab_free (sinfo->strings);
787 bfd_hash_table_free (&sinfo->includes);
792 /* Adjust an address in the .stab section. Given OFFSET within
793 STABSEC, this returns the new offset in the adjusted stab section,
794 or -1 if the address refers to a stab which has been removed. */
797 _bfd_stab_section_offset (stabsec, psecinfo, offset)
802 struct stab_section_info *secinfo;
804 secinfo = (struct stab_section_info *) psecinfo;
809 if (offset >= stabsec->rawsize)
810 return offset - stabsec->rawsize + stabsec->size;
812 if (secinfo->cumulative_skips)
816 i = offset / STABSIZE;
818 if (secinfo->stridxs [i] == (bfd_size_type) -1)
821 return offset - secinfo->cumulative_skips [i];