diff options
Diffstat (limited to 'contrib/binutils/bfd/stabs.c')
-rw-r--r-- | contrib/binutils/bfd/stabs.c | 880 |
1 files changed, 0 insertions, 880 deletions
diff --git a/contrib/binutils/bfd/stabs.c b/contrib/binutils/bfd/stabs.c deleted file mode 100644 index 04b91f6800452..0000000000000 --- a/contrib/binutils/bfd/stabs.c +++ /dev/null @@ -1,880 +0,0 @@ -/* Stabs in sections linking support. - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 - Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file contains support for linking stabs in sections, as used - on COFF and ELF. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "aout/stab_gnu.h" -#include "safe-ctype.h" - -/* Stabs entries use a 12 byte format: - 4 byte string table index - 1 byte stab type - 1 byte stab other field - 2 byte stab desc field - 4 byte stab value - FIXME: This will have to change for a 64 bit object format. - - The stabs symbols are divided into compilation units. For the - first entry in each unit, the type of 0, the value is the length of - the string table for this unit, and the desc field is the number of - stabs symbols for this unit. */ - -#define STRDXOFF (0) -#define TYPEOFF (4) -#define OTHEROFF (5) -#define DESCOFF (6) -#define VALOFF (8) -#define STABSIZE (12) - -/* A hash table used for header files with N_BINCL entries. */ - -struct stab_link_includes_table -{ - struct bfd_hash_table root; -}; - -/* A linked list of totals that we have found for a particular header - file. A total is a unique identifier for a particular BINCL...EINCL - sequence of STABs that can be used to identify duplicate sequences. - It consists of three fields, 'sum_chars' which is the sum of all the - STABS characters; 'num_chars' which is the number of these charactes - and 'symb' which is a buffer of all the symbols in the sequence. This - buffer is only checked as a last resort. */ - -struct stab_link_includes_totals -{ - struct stab_link_includes_totals *next; - bfd_vma sum_chars; /* Accumulated sum of STABS characters. */ - bfd_vma num_chars; /* Number of STABS characters. */ - const char* symb; /* The STABS characters themselves. */ -}; - -/* An entry in the header file hash table. */ - -struct stab_link_includes_entry -{ - struct bfd_hash_entry root; - /* List of totals we have found for this file. */ - struct stab_link_includes_totals *totals; -}; - -/* Look up an entry in an the header file hash table. */ - -#define stab_link_includes_lookup(table, string, create, copy) \ - ((struct stab_link_includes_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -/* This structure is used to hold a list of N_BINCL symbols, some of - which might be converted into N_EXCL symbols. */ - -struct stab_excl_list -{ - /* The next symbol to convert. */ - struct stab_excl_list *next; - /* The offset to this symbol in the section contents. */ - bfd_size_type offset; - /* The value to use for the symbol. */ - bfd_vma val; - /* The type of this symbol (N_BINCL or N_EXCL). */ - int type; -}; - -/* This structure is stored with each .stab section. */ - -struct stab_section_info -{ - /* This is a linked list of N_BINCL symbols which should be - converted into N_EXCL symbols. */ - struct stab_excl_list *excls; - - /* This is used to map input stab offsets within their sections - to output stab offsets, to take into account stabs that have - been deleted. If it is NULL, the output offsets are the same - as the input offsets, because no stabs have been deleted from - this section. Otherwise the i'th entry is the number of - bytes of stabs that have been deleted prior to the i'th - stab. */ - bfd_size_type *cumulative_skips; - - /* This is an array of string indices. For each stab symbol, we - store the string index here. If a stab symbol should not be - included in the final output, the string index is -1. */ - bfd_size_type stridxs[1]; -}; - -/* This structure is used to keep track of stabs in sections - information while linking. */ - -struct stab_info -{ - /* A hash table used to hold stabs strings. */ - struct bfd_strtab_hash *strings; - /* The header file hash table. */ - struct stab_link_includes_table includes; - /* The first .stabstr section. */ - asection *stabstr; -}; - -static struct bfd_hash_entry *stab_link_includes_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); - -/* The function to create a new entry in the header file hash table. */ - -static struct bfd_hash_entry * -stab_link_includes_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct stab_link_includes_entry *ret = - (struct stab_link_includes_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct stab_link_includes_entry *) NULL) - ret = ((struct stab_link_includes_entry *) - bfd_hash_allocate (table, - sizeof (struct stab_link_includes_entry))); - if (ret == (struct stab_link_includes_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct stab_link_includes_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - if (ret) - { - /* Set local fields. */ - ret->totals = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* This function is called for each input file from the add_symbols - pass of the linker. */ - -bfd_boolean -_bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_offset) - bfd *abfd; - PTR *psinfo; - asection *stabsec; - asection *stabstrsec; - PTR *psecinfo; - bfd_size_type *pstring_offset; -{ - bfd_boolean first; - struct stab_info *sinfo; - bfd_size_type count, amt; - struct stab_section_info *secinfo; - bfd_byte *stabbuf = NULL; - bfd_byte *stabstrbuf = NULL; - bfd_byte *sym, *symend; - bfd_size_type stroff, next_stroff, skip; - bfd_size_type *pstridx; - - if (stabsec->_raw_size == 0 - || stabstrsec->_raw_size == 0) - { - /* This file does not contain stabs debugging information. */ - return TRUE; - } - - if (stabsec->_raw_size % STABSIZE != 0) - { - /* Something is wrong with the format of these stab symbols. - Don't try to optimize them. */ - return TRUE; - } - - if ((stabstrsec->flags & SEC_RELOC) != 0) - { - /* We shouldn't see relocations in the strings, and we aren't - prepared to handle them. */ - return TRUE; - } - - if ((stabsec->output_section != NULL - && bfd_is_abs_section (stabsec->output_section)) - || (stabstrsec->output_section != NULL - && bfd_is_abs_section (stabstrsec->output_section))) - { - /* At least one of the sections is being discarded from the - link, so we should just ignore them. */ - return TRUE; - } - - first = FALSE; - - if (*psinfo == NULL) - { - /* Initialize the stabs information we need to keep track of. */ - first = TRUE; - amt = sizeof (struct stab_info); - *psinfo = (PTR) bfd_alloc (abfd, amt); - if (*psinfo == NULL) - goto error_return; - sinfo = (struct stab_info *) *psinfo; - sinfo->strings = _bfd_stringtab_init (); - if (sinfo->strings == NULL) - goto error_return; - /* Make sure the first byte is zero. */ - (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); - if (! bfd_hash_table_init_n (&sinfo->includes.root, - stab_link_includes_newfunc, - 251)) - goto error_return; - sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); - sinfo->stabstr->flags |= SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING; - } - - sinfo = (struct stab_info *) *psinfo; - - /* Initialize the information we are going to store for this .stab - section. */ - - count = stabsec->_raw_size / STABSIZE; - - amt = sizeof (struct stab_section_info); - amt += (count - 1) * sizeof (bfd_size_type); - *psecinfo = bfd_alloc (abfd, amt); - if (*psecinfo == NULL) - goto error_return; - - secinfo = (struct stab_section_info *) *psecinfo; - secinfo->excls = NULL; - secinfo->cumulative_skips = NULL; - memset (secinfo->stridxs, 0, (size_t) count * sizeof (bfd_size_type)); - - /* Read the stabs information from abfd. */ - - stabbuf = (bfd_byte *) bfd_malloc (stabsec->_raw_size); - stabstrbuf = (bfd_byte *) bfd_malloc (stabstrsec->_raw_size); - if (stabbuf == NULL || stabstrbuf == NULL) - goto error_return; - - if (! bfd_get_section_contents (abfd, stabsec, stabbuf, (bfd_vma) 0, - stabsec->_raw_size) - || ! bfd_get_section_contents (abfd, stabstrsec, stabstrbuf, (bfd_vma) 0, - stabstrsec->_raw_size)) - goto error_return; - - /* Look through the stabs symbols, work out the new string indices, - and identify N_BINCL symbols which can be eliminated. */ - - stroff = 0; - /* The stabs sections can be split when - -split-by-reloc/-split-by-file is used. We must keep track of - each stab section's place in the single concatenated string - table. */ - next_stroff = pstring_offset ? *pstring_offset : 0; - skip = 0; - - symend = stabbuf + stabsec->_raw_size; - for (sym = stabbuf, pstridx = secinfo->stridxs; - sym < symend; - sym += STABSIZE, ++pstridx) - { - bfd_size_type symstroff; - int type; - const char *string; - - if (*pstridx != 0) - { - /* This symbol has already been handled by an N_BINCL pass. */ - continue; - } - - type = sym[TYPEOFF]; - - if (type == 0) - { - /* Special type 0 stabs indicate the offset to the next - string table. We only copy the very first one. */ - stroff = next_stroff; - next_stroff += bfd_get_32 (abfd, sym + 8); - if (pstring_offset) - *pstring_offset = next_stroff; - if (! first) - { - *pstridx = (bfd_size_type) -1; - ++skip; - continue; - } - first = FALSE; - } - - /* Store the string in the hash table, and record the index. */ - symstroff = stroff + bfd_get_32 (abfd, sym + STRDXOFF); - if (symstroff >= stabstrsec->_raw_size) - { - (*_bfd_error_handler) - (_("%s(%s+0x%lx): Stabs entry has invalid string index."), - bfd_archive_filename (abfd), - bfd_get_section_name (abfd, stabsec), - (long) (sym - stabbuf)); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - string = (char *) stabstrbuf + symstroff; - *pstridx = _bfd_stringtab_add (sinfo->strings, string, TRUE, TRUE); - - /* An N_BINCL symbol indicates the start of the stabs entries - for a header file. We need to scan ahead to the next N_EINCL - symbol, ignoring nesting, adding up all the characters in the - symbol names, not including the file numbers in types (the - first number after an open parenthesis). */ - if (type == (int) N_BINCL) - { - bfd_vma sum_chars; - bfd_vma num_chars; - bfd_vma buf_len = 0; - char * symb; - char * symb_rover; - int nest; - bfd_byte * incl_sym; - struct stab_link_includes_entry * incl_entry; - struct stab_link_includes_totals * t; - struct stab_excl_list * ne; - - symb = symb_rover = NULL; - sum_chars = num_chars = 0; - nest = 0; - - for (incl_sym = sym + STABSIZE; - incl_sym < symend; - incl_sym += STABSIZE) - { - int incl_type; - - incl_type = incl_sym[TYPEOFF]; - if (incl_type == 0) - break; - else if (incl_type == (int) N_EXCL) - continue; - else if (incl_type == (int) N_EINCL) - { - if (nest == 0) - break; - --nest; - } - else if (incl_type == (int) N_BINCL) - ++nest; - else if (nest == 0) - { - const char *str; - - str = ((char *) stabstrbuf - + stroff - + bfd_get_32 (abfd, incl_sym + STRDXOFF)); - for (; *str != '\0'; str++) - { - if (num_chars >= buf_len) - { - buf_len += 32 * 1024; - symb = bfd_realloc (symb, buf_len); - if (symb == NULL) - goto error_return; - symb_rover = symb + num_chars; - } - * symb_rover ++ = * str; - sum_chars += *str; - num_chars ++; - if (*str == '(') - { - /* Skip the file number. */ - ++str; - while (ISDIGIT (*str)) - ++str; - --str; - } - } - } - } - - BFD_ASSERT (num_chars == (bfd_vma) (symb_rover - symb)); - - /* If we have already included a header file with the same - value, then replaced this one with an N_EXCL symbol. */ - incl_entry = stab_link_includes_lookup (&sinfo->includes, string, - TRUE, TRUE); - if (incl_entry == NULL) - goto error_return; - - for (t = incl_entry->totals; t != NULL; t = t->next) - if (t->sum_chars == sum_chars - && t->num_chars == num_chars - && memcmp (t->symb, symb, num_chars) == 0) - break; - - /* Record this symbol, so that we can set the value - correctly. */ - amt = sizeof *ne; - ne = (struct stab_excl_list *) bfd_alloc (abfd, amt); - if (ne == NULL) - goto error_return; - ne->offset = sym - stabbuf; - ne->val = sum_chars; - ne->type = (int) N_BINCL; - ne->next = secinfo->excls; - secinfo->excls = ne; - - if (t == NULL) - { - /* This is the first time we have seen this header file - with this set of stabs strings. */ - t = ((struct stab_link_includes_totals *) - bfd_hash_allocate (&sinfo->includes.root, sizeof *t)); - if (t == NULL) - goto error_return; - t->sum_chars = sum_chars; - t->num_chars = num_chars; - t->symb = bfd_realloc (symb, num_chars); /* Trim data down. */ - t->next = incl_entry->totals; - incl_entry->totals = t; - } - else - { - bfd_size_type *incl_pstridx; - - /* We have seen this header file before. Tell the final - pass to change the type to N_EXCL. */ - ne->type = (int) N_EXCL; - - /* Free off superfluous symbols. */ - free (symb); - - /* Mark the skipped symbols. */ - - nest = 0; - for (incl_sym = sym + STABSIZE, incl_pstridx = pstridx + 1; - incl_sym < symend; - incl_sym += STABSIZE, ++incl_pstridx) - { - int incl_type; - - incl_type = incl_sym[TYPEOFF]; - - if (incl_type == (int) N_EINCL) - { - if (nest == 0) - { - *incl_pstridx = (bfd_size_type) -1; - ++skip; - break; - } - --nest; - } - else if (incl_type == (int) N_BINCL) - ++nest; - else if (incl_type == (int) N_EXCL) - /* Keep existing exclusion marks. */ - continue; - else if (nest == 0) - { - *incl_pstridx = (bfd_size_type) -1; - ++skip; - } - } - } - } - } - - free (stabbuf); - stabbuf = NULL; - free (stabstrbuf); - stabstrbuf = NULL; - - /* We need to set the section sizes such that the linker will - compute the output section sizes correctly. We set the .stab - size to not include the entries we don't want. We set - SEC_EXCLUDE for the .stabstr section, so that it will be dropped - from the link. We record the size of the strtab in the first - .stabstr section we saw, and make sure we don't set SEC_EXCLUDE - for that section. */ - stabsec->_cooked_size = (count - skip) * STABSIZE; - if (stabsec->_cooked_size == 0) - stabsec->flags |= SEC_EXCLUDE; - stabstrsec->flags |= SEC_EXCLUDE; - sinfo->stabstr->_cooked_size = _bfd_stringtab_size (sinfo->strings); - - /* Calculate the `cumulative_skips' array now that stabs have been - deleted for this section. */ - - if (skip != 0) - { - bfd_size_type i, offset; - bfd_size_type *pskips; - - amt = count * sizeof (bfd_size_type); - secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt); - if (secinfo->cumulative_skips == NULL) - goto error_return; - - pskips = secinfo->cumulative_skips; - pstridx = secinfo->stridxs; - offset = 0; - - for (i = 0; i < count; i++, pskips++, pstridx++) - { - *pskips = offset; - if (*pstridx == (bfd_size_type) -1) - offset += STABSIZE; - } - - BFD_ASSERT (offset != 0); - } - - return TRUE; - - error_return: - if (stabbuf != NULL) - free (stabbuf); - if (stabstrbuf != NULL) - free (stabstrbuf); - return FALSE; -} - - -/* This function is called for each input file before the stab - section is relocated. It discards stab entries for discarded - functions and variables. The function returns TRUE iff - any entries have been deleted. -*/ - -bfd_boolean -_bfd_discard_section_stabs (abfd, stabsec, psecinfo, - reloc_symbol_deleted_p, cookie) - bfd *abfd; - asection *stabsec; - PTR psecinfo; - bfd_boolean (*reloc_symbol_deleted_p) PARAMS ((bfd_vma, PTR)); - PTR cookie; -{ - bfd_size_type count, amt; - struct stab_section_info *secinfo; - bfd_byte *stabbuf = NULL; - bfd_byte *sym, *symend; - bfd_size_type skip; - bfd_size_type *pstridx; - int deleting; - - if (stabsec->_raw_size == 0) - { - /* This file does not contain stabs debugging information. */ - return FALSE; - } - - if (stabsec->_raw_size % STABSIZE != 0) - { - /* Something is wrong with the format of these stab symbols. - Don't try to optimize them. */ - return FALSE; - } - - if ((stabsec->output_section != NULL - && bfd_is_abs_section (stabsec->output_section))) - { - /* At least one of the sections is being discarded from the - link, so we should just ignore them. */ - return FALSE; - } - - /* We should have initialized our data in _bfd_link_stab_sections. - If there was some bizarre error reading the string sections, though, - we might not have. Bail rather than asserting. */ - if (psecinfo == NULL) - return FALSE; - - count = stabsec->_raw_size / STABSIZE; - secinfo = (struct stab_section_info *) psecinfo; - - /* Read the stabs information from abfd. */ - - stabbuf = (bfd_byte *) bfd_malloc (stabsec->_raw_size); - if (stabbuf == NULL) - goto error_return; - - if (! bfd_get_section_contents (abfd, stabsec, stabbuf, (bfd_vma) 0, - stabsec->_raw_size)) - goto error_return; - - /* Look through the stabs symbols and discard any information for - discarded functions. */ - - skip = 0; - deleting = -1; - - symend = stabbuf + stabsec->_raw_size; - for (sym = stabbuf, pstridx = secinfo->stridxs; - sym < symend; - sym += STABSIZE, ++pstridx) - { - int type; - - if (*pstridx == (bfd_size_type) -1) - { - /* This stab was deleted in a previous pass. */ - continue; - } - - type = sym[TYPEOFF]; - - if (type == (int) N_FUN) - { - int strx = bfd_get_32 (abfd, sym + STRDXOFF); - - if (strx == 0) - { - if (deleting) - { - skip++; - *pstridx = -1; - } - deleting = -1; - continue; - } - deleting = 0; - if ((*reloc_symbol_deleted_p) (sym + VALOFF - stabbuf, cookie)) - deleting = 1; - } - - if (deleting == 1) - { - *pstridx = -1; - skip++; - } - else if (deleting == -1) - { - /* Outside of a function. Check for deleted variables. */ - if (type == (int) N_STSYM || type == (int) N_LCSYM) - if ((*reloc_symbol_deleted_p) (sym + VALOFF - stabbuf, cookie)) - { - *pstridx = -1; - skip ++; - } - /* We should also check for N_GSYM entries which reference a - deleted global, but those are less harmful to debuggers - and would require parsing the stab strings. */ - } - } - - free (stabbuf); - stabbuf = NULL; - - /* Shrink the stabsec as needed. */ - stabsec->_cooked_size -= skip * STABSIZE; - if (stabsec->_cooked_size == 0) - stabsec->flags |= SEC_EXCLUDE; - - /* Recalculate the `cumulative_skips' array now that stabs have been - deleted for this section. */ - - if (skip != 0) - { - bfd_size_type i, offset; - bfd_size_type *pskips; - - if (secinfo->cumulative_skips == NULL) - { - amt = count * sizeof (bfd_size_type); - secinfo->cumulative_skips = (bfd_size_type *) bfd_alloc (abfd, amt); - if (secinfo->cumulative_skips == NULL) - goto error_return; - } - - pskips = secinfo->cumulative_skips; - pstridx = secinfo->stridxs; - offset = 0; - - for (i = 0; i < count; i++, pskips++, pstridx++) - { - *pskips = offset; - if (*pstridx == (bfd_size_type) -1) - offset += STABSIZE; - } - - BFD_ASSERT (offset != 0); - } - - return skip > 0; - - error_return: - if (stabbuf != NULL) - free (stabbuf); - return FALSE; -} - -/* Write out the stab section. This is called with the relocated - contents. */ - -bfd_boolean -_bfd_write_section_stabs (output_bfd, psinfo, stabsec, psecinfo, contents) - bfd *output_bfd; - PTR *psinfo; - asection *stabsec; - PTR *psecinfo; - bfd_byte *contents; -{ - struct stab_info *sinfo; - struct stab_section_info *secinfo; - struct stab_excl_list *e; - bfd_byte *sym, *tosym, *symend; - bfd_size_type *pstridx; - - sinfo = (struct stab_info *) *psinfo; - secinfo = (struct stab_section_info *) *psecinfo; - - if (secinfo == NULL) - return bfd_set_section_contents (output_bfd, stabsec->output_section, - contents, - (file_ptr) stabsec->output_offset, - stabsec->_raw_size); - - /* Handle each N_BINCL entry. */ - for (e = secinfo->excls; e != NULL; e = e->next) - { - bfd_byte *excl_sym; - - BFD_ASSERT (e->offset < stabsec->_raw_size); - excl_sym = contents + e->offset; - bfd_put_32 (output_bfd, e->val, excl_sym + VALOFF); - excl_sym[TYPEOFF] = e->type; - } - - /* Copy over all the stabs symbols, omitting the ones we don't want, - and correcting the string indices for those we do want. */ - tosym = contents; - symend = contents + stabsec->_raw_size; - for (sym = contents, pstridx = secinfo->stridxs; - sym < symend; - sym += STABSIZE, ++pstridx) - { - if (*pstridx != (bfd_size_type) -1) - { - if (tosym != sym) - memcpy (tosym, sym, STABSIZE); - bfd_put_32 (output_bfd, *pstridx, tosym + STRDXOFF); - - if (sym[TYPEOFF] == 0) - { - /* This is the header symbol for the stabs section. We - don't really need one, since we have merged all the - input stabs sections into one, but we generate one - for the benefit of readers which expect to see one. */ - BFD_ASSERT (sym == contents); - bfd_put_32 (output_bfd, _bfd_stringtab_size (sinfo->strings), - tosym + VALOFF); - bfd_put_16 (output_bfd, - stabsec->output_section->_raw_size / STABSIZE - 1, - tosym + DESCOFF); - } - - tosym += STABSIZE; - } - } - - BFD_ASSERT ((bfd_size_type) (tosym - contents) == stabsec->_cooked_size); - - return bfd_set_section_contents (output_bfd, stabsec->output_section, - contents, (file_ptr) stabsec->output_offset, - stabsec->_cooked_size); -} - -/* Write out the .stabstr section. */ - -bfd_boolean -_bfd_write_stab_strings (output_bfd, psinfo) - bfd *output_bfd; - PTR *psinfo; -{ - struct stab_info *sinfo; - - sinfo = (struct stab_info *) *psinfo; - - if (sinfo == NULL) - return TRUE; - - if (bfd_is_abs_section (sinfo->stabstr->output_section)) - { - /* The section was discarded from the link. */ - return TRUE; - } - - BFD_ASSERT ((sinfo->stabstr->output_offset - + _bfd_stringtab_size (sinfo->strings)) - <= sinfo->stabstr->output_section->_raw_size); - - if (bfd_seek (output_bfd, - (file_ptr) (sinfo->stabstr->output_section->filepos - + sinfo->stabstr->output_offset), - SEEK_SET) != 0) - return FALSE; - - if (! _bfd_stringtab_emit (output_bfd, sinfo->strings)) - return FALSE; - - /* We no longer need the stabs information. */ - _bfd_stringtab_free (sinfo->strings); - bfd_hash_table_free (&sinfo->includes.root); - - return TRUE; -} - -/* Adjust an address in the .stab section. Given OFFSET within - STABSEC, this returns the new offset in the adjusted stab section, - or -1 if the address refers to a stab which has been removed. */ - -bfd_vma -_bfd_stab_section_offset (output_bfd, psinfo, stabsec, psecinfo, offset) - bfd *output_bfd ATTRIBUTE_UNUSED; - PTR *psinfo ATTRIBUTE_UNUSED; - asection *stabsec; - PTR *psecinfo; - bfd_vma offset; -{ - struct stab_section_info *secinfo; - - secinfo = (struct stab_section_info *) *psecinfo; - - if (secinfo == NULL) - return offset; - - if (offset >= stabsec->_raw_size) - return offset - (stabsec->_cooked_size - stabsec->_raw_size); - - if (secinfo->cumulative_skips) - { - bfd_vma i; - - i = offset / STABSIZE; - - if (secinfo->stridxs [i] == (bfd_size_type) -1) - return (bfd_vma) -1; - - return offset - secinfo->cumulative_skips [i]; - } - - return offset; -} |