mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 08:02:20 +08:00
* simple.c (bfd_simple_get_relocated_section_contents): Add
parameter symbol_table. Optionally use it instead of the symbol table from the bfd. Save and restore output offsets and output sections around bfd_get_relocated_section_contents. Fix a memory leak. (simple_save_output_info, simple_restore_output_info): New functions. * bfd-in2.h: Regenerate. * dwarf2.c (read_abbrevs): Use bfd_simple_get_relocated_section_contents instead of bfd_get_section_contents. (decode_line_info): Likewise. (_bfd_dwarf2_find_nearest_line): Likewise. Don't call find_rela_addend. (find_rela_addend): Remove. * elfxx-ia64.c (elfNN_ia64_reloc): Weaken sanity check for debugging sections. (elfNN_ia64_hash_table_create): Create the hash table with malloc, not bfd_zalloc.
This commit is contained in:
@ -1,3 +1,26 @@
|
|||||||
|
2003-03-31 Andreas Schwab <schwab@suse.de>
|
||||||
|
Daniel Jacobowitz <drow@mvista.com>
|
||||||
|
|
||||||
|
* simple.c (bfd_simple_get_relocated_section_contents): Add
|
||||||
|
parameter symbol_table. Optionally use it instead of the symbol
|
||||||
|
table from the bfd. Save and restore output offsets and output
|
||||||
|
sections around bfd_get_relocated_section_contents. Fix a memory
|
||||||
|
leak.
|
||||||
|
(simple_save_output_info, simple_restore_output_info): New
|
||||||
|
functions.
|
||||||
|
* bfd-in2.h: Regenerate.
|
||||||
|
* dwarf2.c (read_abbrevs): Use
|
||||||
|
bfd_simple_get_relocated_section_contents instead of
|
||||||
|
bfd_get_section_contents.
|
||||||
|
(decode_line_info): Likewise.
|
||||||
|
(_bfd_dwarf2_find_nearest_line): Likewise. Don't call
|
||||||
|
find_rela_addend.
|
||||||
|
(find_rela_addend): Remove.
|
||||||
|
* elfxx-ia64.c (elfNN_ia64_reloc): Weaken sanity check for
|
||||||
|
debugging sections.
|
||||||
|
(elfNN_ia64_hash_table_create): Create the hash table with malloc,
|
||||||
|
not bfd_zalloc.
|
||||||
|
|
||||||
2003-03-31 David Heine <dlheine@suif.stanford.edu>
|
2003-03-31 David Heine <dlheine@suif.stanford.edu>
|
||||||
|
|
||||||
* aoutx.h (aout_link_hash_table_create): Use bfd_malloc instead of
|
* aoutx.h (aout_link_hash_table_create): Use bfd_malloc instead of
|
||||||
|
@ -4385,7 +4385,7 @@ bfd_link_split_section PARAMS ((bfd *abfd, asection *sec));
|
|||||||
|
|
||||||
/* Extracted from simple.c. */
|
/* Extracted from simple.c. */
|
||||||
bfd_byte *
|
bfd_byte *
|
||||||
bfd_simple_get_relocated_section_contents PARAMS ((bfd *abfd, asection *sec, bfd_byte *outbuf));
|
bfd_simple_get_relocated_section_contents PARAMS ((bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table));
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
114
bfd/dwarf2.c
114
bfd/dwarf2.c
@ -245,8 +245,6 @@ static bfd_boolean lookup_address_in_line_info_table
|
|||||||
static bfd_boolean lookup_address_in_function_table
|
static bfd_boolean lookup_address_in_function_table
|
||||||
PARAMS ((struct funcinfo *, bfd_vma, struct funcinfo **, const char **));
|
PARAMS ((struct funcinfo *, bfd_vma, struct funcinfo **, const char **));
|
||||||
static bfd_boolean scan_unit_for_functions PARAMS ((struct comp_unit *));
|
static bfd_boolean scan_unit_for_functions PARAMS ((struct comp_unit *));
|
||||||
static bfd_vma find_rela_addend
|
|
||||||
PARAMS ((bfd *, asection *, bfd_size_type, asymbol**));
|
|
||||||
static struct comp_unit *parse_comp_unit
|
static struct comp_unit *parse_comp_unit
|
||||||
PARAMS ((bfd *, struct dwarf2_debug *, bfd_vma, unsigned int));
|
PARAMS ((bfd *, struct dwarf2_debug *, bfd_vma, unsigned int));
|
||||||
static bfd_boolean comp_unit_contains_address
|
static bfd_boolean comp_unit_contains_address
|
||||||
@ -546,13 +544,11 @@ read_abbrevs (abfd, offset, stash)
|
|||||||
}
|
}
|
||||||
|
|
||||||
stash->dwarf_abbrev_size = msec->_raw_size;
|
stash->dwarf_abbrev_size = msec->_raw_size;
|
||||||
stash->dwarf_abbrev_buffer = (char*) bfd_alloc (abfd, msec->_raw_size);
|
stash->dwarf_abbrev_buffer
|
||||||
|
= bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
|
||||||
|
stash->syms);
|
||||||
if (! stash->dwarf_abbrev_buffer)
|
if (! stash->dwarf_abbrev_buffer)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (! bfd_get_section_contents (abfd, msec, stash->dwarf_abbrev_buffer,
|
|
||||||
(bfd_vma) 0, msec->_raw_size))
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset >= stash->dwarf_abbrev_size)
|
if (offset >= stash->dwarf_abbrev_size)
|
||||||
@ -1023,21 +1019,15 @@ decode_line_info (unit, stash)
|
|||||||
}
|
}
|
||||||
|
|
||||||
stash->dwarf_line_size = msec->_raw_size;
|
stash->dwarf_line_size = msec->_raw_size;
|
||||||
stash->dwarf_line_buffer = (char *) bfd_alloc (abfd, msec->_raw_size);
|
stash->dwarf_line_buffer
|
||||||
|
= bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
|
||||||
|
stash->syms);
|
||||||
if (! stash->dwarf_line_buffer)
|
if (! stash->dwarf_line_buffer)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (! bfd_get_section_contents (abfd, msec, stash->dwarf_line_buffer,
|
|
||||||
(bfd_vma) 0, msec->_raw_size))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* FIXME: We ought to apply the relocs against this section before
|
|
||||||
we process it... */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since we are using un-relocated data, it is possible to get a bad value
|
/* It is possible to get a bad value for the line_offset. Validate
|
||||||
for the line_offset. Validate it here so that we won't get a segfault
|
it here so that we won't get a segfault below. */
|
||||||
below. */
|
|
||||||
if (unit->line_offset >= stash->dwarf_line_size)
|
if (unit->line_offset >= stash->dwarf_line_size)
|
||||||
{
|
{
|
||||||
(*_bfd_error_handler) (_("Dwarf Error: Line offset (%lu) greater than or equal to .debug_line size (%lu)."),
|
(*_bfd_error_handler) (_("Dwarf Error: Line offset (%lu) greater than or equal to .debug_line size (%lu)."),
|
||||||
@ -1529,60 +1519,6 @@ scan_unit_for_functions (unit)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look for a RELA relocation to be applied on OFFSET of section SEC,
|
|
||||||
and return the addend if such a relocation is found. Since this is
|
|
||||||
only used to find relocations referring to the .debug_abbrev
|
|
||||||
section, we make sure the relocation refers to this section, but
|
|
||||||
this is not strictly necessary, and it can probably be safely
|
|
||||||
removed if needed. However, it is important to note that this
|
|
||||||
function only returns the addend, it doesn't serve the purpose of
|
|
||||||
applying a generic relocation.
|
|
||||||
|
|
||||||
If no suitable relocation is found, or if it is not a real RELA
|
|
||||||
relocation, this function returns 0. */
|
|
||||||
|
|
||||||
static bfd_vma
|
|
||||||
find_rela_addend (abfd, sec, offset, syms)
|
|
||||||
bfd* abfd;
|
|
||||||
asection* sec;
|
|
||||||
bfd_size_type offset;
|
|
||||||
asymbol** syms;
|
|
||||||
{
|
|
||||||
long reloc_size = bfd_get_reloc_upper_bound (abfd, sec);
|
|
||||||
arelent **relocs = NULL;
|
|
||||||
long reloc_count, relc;
|
|
||||||
|
|
||||||
if (reloc_size <= 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
relocs = (arelent **) bfd_malloc ((bfd_size_type) reloc_size);
|
|
||||||
if (relocs == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
reloc_count = bfd_canonicalize_reloc (abfd, sec, relocs, syms);
|
|
||||||
|
|
||||||
if (reloc_count <= 0)
|
|
||||||
{
|
|
||||||
free (relocs);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (relc = 0; relc < reloc_count; relc++)
|
|
||||||
if (relocs[relc]->address == offset
|
|
||||||
&& (*relocs[relc]->sym_ptr_ptr)->flags & BSF_SECTION_SYM
|
|
||||||
&& strcmp ((*relocs[relc]->sym_ptr_ptr)->name,
|
|
||||||
".debug_abbrev") == 0)
|
|
||||||
{
|
|
||||||
bfd_vma addend = (relocs[relc]->howto->partial_inplace
|
|
||||||
? 0 : relocs[relc]->addend);
|
|
||||||
free (relocs);
|
|
||||||
return addend;
|
|
||||||
}
|
|
||||||
|
|
||||||
free (relocs);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Parse a DWARF2 compilation unit starting at INFO_PTR. This
|
/* Parse a DWARF2 compilation unit starting at INFO_PTR. This
|
||||||
includes the compilation unit header that proceeds the DIE's, but
|
includes the compilation unit header that proceeds the DIE's, but
|
||||||
does not include the length field that preceeds each compilation
|
does not include the length field that preceeds each compilation
|
||||||
@ -1610,7 +1546,6 @@ parse_comp_unit (abfd, stash, unit_length, offset_size)
|
|||||||
char *info_ptr = stash->info_ptr;
|
char *info_ptr = stash->info_ptr;
|
||||||
char *end_ptr = info_ptr + unit_length;
|
char *end_ptr = info_ptr + unit_length;
|
||||||
bfd_size_type amt;
|
bfd_size_type amt;
|
||||||
bfd_size_type off;
|
|
||||||
|
|
||||||
version = read_2_bytes (abfd, info_ptr);
|
version = read_2_bytes (abfd, info_ptr);
|
||||||
info_ptr += 2;
|
info_ptr += 2;
|
||||||
@ -1619,12 +1554,6 @@ parse_comp_unit (abfd, stash, unit_length, offset_size)
|
|||||||
abbrev_offset = read_4_bytes (abfd, info_ptr);
|
abbrev_offset = read_4_bytes (abfd, info_ptr);
|
||||||
else
|
else
|
||||||
abbrev_offset = read_8_bytes (abfd, info_ptr);
|
abbrev_offset = read_8_bytes (abfd, info_ptr);
|
||||||
/* The abbrev offset is generally a relocation pointing to
|
|
||||||
.debug_abbrev+offset. On RELA targets, we have to find the
|
|
||||||
relocation and extract the addend to obtain the actual
|
|
||||||
abbrev_offset, so do it here. */
|
|
||||||
off = info_ptr - stash->sec_info_ptr;
|
|
||||||
abbrev_offset += find_rela_addend (abfd, stash->sec, off, stash->syms);
|
|
||||||
info_ptr += offset_size;
|
info_ptr += offset_size;
|
||||||
addr_size = read_1_byte (abfd, info_ptr);
|
addr_size = read_1_byte (abfd, info_ptr);
|
||||||
info_ptr += 1;
|
info_ptr += 1;
|
||||||
@ -1947,8 +1876,8 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
|
|||||||
|
|
||||||
start = stash->info_ptr_end - stash->info_ptr;
|
start = stash->info_ptr_end - stash->info_ptr;
|
||||||
|
|
||||||
if (! bfd_get_section_contents (abfd, msec, stash->info_ptr + start,
|
if ((bfd_simple_get_relocated_section_contents
|
||||||
(bfd_vma) 0, size))
|
(abfd, msec, stash->info_ptr + start, symbols)) == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
stash->info_ptr_end = stash->info_ptr + start + size;
|
stash->info_ptr_end = stash->info_ptr + start + size;
|
||||||
@ -1961,21 +1890,6 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
|
|||||||
stash->syms = symbols;
|
stash->syms = symbols;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: There is a problem with the contents of the
|
|
||||||
.debug_info section. The 'low' and 'high' addresses of the
|
|
||||||
comp_units are computed by relocs against symbols in the
|
|
||||||
.text segment. We need these addresses in order to determine
|
|
||||||
the nearest line number, and so we have to resolve the
|
|
||||||
relocs. There is a similar problem when the .debug_line
|
|
||||||
section is processed as well (e.g., there may be relocs
|
|
||||||
against the operand of the DW_LNE_set_address operator).
|
|
||||||
|
|
||||||
Unfortunately getting hold of the reloc information is hard...
|
|
||||||
|
|
||||||
For now, this means that disassembling object files (as
|
|
||||||
opposed to fully executables) does not always work as well as
|
|
||||||
we would like. */
|
|
||||||
|
|
||||||
/* A null info_ptr indicates that there is no dwarf2 info
|
/* A null info_ptr indicates that there is no dwarf2 info
|
||||||
(or that an error occured while setting up the stash). */
|
(or that an error occured while setting up the stash). */
|
||||||
if (! stash->info_ptr)
|
if (! stash->info_ptr)
|
||||||
@ -2042,10 +1956,10 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
|
|||||||
{
|
{
|
||||||
if (comp_unit_contains_address (each, addr))
|
if (comp_unit_contains_address (each, addr))
|
||||||
return comp_unit_find_nearest_line (each, addr,
|
return comp_unit_find_nearest_line (each, addr,
|
||||||
filename_ptr,
|
filename_ptr,
|
||||||
functionname_ptr,
|
functionname_ptr,
|
||||||
linenumber_ptr,
|
linenumber_ptr,
|
||||||
stash);
|
stash);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -357,6 +357,10 @@ elfNN_ia64_reloc (abfd, reloc, sym, data, input_section,
|
|||||||
reloc->address += input_section->output_offset;
|
reloc->address += input_section->output_offset;
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (input_section->flags & SEC_DEBUGGING)
|
||||||
|
return bfd_reloc_continue;
|
||||||
|
|
||||||
*error_message = "Unsupported call to elfNN_ia64_reloc";
|
*error_message = "Unsupported call to elfNN_ia64_reloc";
|
||||||
return bfd_reloc_notsupported;
|
return bfd_reloc_notsupported;
|
||||||
}
|
}
|
||||||
@ -1788,19 +1792,24 @@ elfNN_ia64_hash_table_create (abfd)
|
|||||||
{
|
{
|
||||||
struct elfNN_ia64_link_hash_table *ret;
|
struct elfNN_ia64_link_hash_table *ret;
|
||||||
|
|
||||||
ret = bfd_zalloc (abfd, (bfd_size_type) sizeof (*ret));
|
ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
|
if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
|
||||||
elfNN_ia64_new_elf_hash_entry))
|
elfNN_ia64_new_elf_hash_entry))
|
||||||
{
|
{
|
||||||
bfd_release (abfd, ret);
|
free (ret);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!elfNN_ia64_local_hash_table_init (&ret->loc_hash_table, abfd,
|
if (!elfNN_ia64_local_hash_table_init (&ret->loc_hash_table, abfd,
|
||||||
elfNN_ia64_new_loc_hash_entry))
|
elfNN_ia64_new_loc_hash_entry))
|
||||||
return 0;
|
{
|
||||||
|
free (ret);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return &ret->root.root;
|
return &ret->root.root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
92
bfd/simple.c
92
bfd/simple.c
@ -42,8 +42,14 @@ static bfd_boolean simple_dummy_reloc_dangerous
|
|||||||
static bfd_boolean simple_dummy_unattached_reloc
|
static bfd_boolean simple_dummy_unattached_reloc
|
||||||
PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma));
|
PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma));
|
||||||
|
|
||||||
|
static void simple_save_output_info
|
||||||
|
PARAMS ((bfd *, asection *, PTR));
|
||||||
|
|
||||||
|
static void simple_restore_output_info
|
||||||
|
PARAMS ((bfd *, asection *, PTR));
|
||||||
|
|
||||||
bfd_byte * bfd_simple_get_relocated_section_contents
|
bfd_byte * bfd_simple_get_relocated_section_contents
|
||||||
PARAMS ((bfd *, asection *, bfd_byte *));
|
PARAMS ((bfd *, asection *, bfd_byte *, asymbol **));
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
simple_dummy_warning (link_info, warning, symbol, abfd, section, address)
|
simple_dummy_warning (link_info, warning, symbol, abfd, section, address)
|
||||||
@ -105,17 +111,48 @@ simple_dummy_unattached_reloc (link_info, name, abfd, section, address)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct saved_output_info
|
||||||
|
{
|
||||||
|
bfd_vma offset;
|
||||||
|
asection *section;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
simple_save_output_info (abfd, section, ptr)
|
||||||
|
bfd *abfd ATTRIBUTE_UNUSED;
|
||||||
|
asection *section;
|
||||||
|
PTR ptr;
|
||||||
|
{
|
||||||
|
struct saved_output_info *output_info = (struct saved_output_info *) ptr;
|
||||||
|
output_info[section->index].offset = section->output_offset;
|
||||||
|
output_info[section->index].section = section->output_section;
|
||||||
|
section->output_offset = 0;
|
||||||
|
section->output_section = section;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
simple_restore_output_info (abfd, section, ptr)
|
||||||
|
bfd *abfd ATTRIBUTE_UNUSED;
|
||||||
|
asection *section;
|
||||||
|
PTR ptr;
|
||||||
|
{
|
||||||
|
struct saved_output_info *output_info = (struct saved_output_info *) ptr;
|
||||||
|
section->output_offset = output_info[section->index].offset;
|
||||||
|
section->output_section = output_info[section->index].section;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_simple_relocate_secton
|
bfd_simple_relocate_secton
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
bfd_byte *bfd_simple_get_relocated_section_contents (bfd *abfd, asection *sec, bfd_byte *outbuf);
|
bfd_byte *bfd_simple_get_relocated_section_contents (bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Returns the relocated contents of section @var{sec}. Only symbols
|
Returns the relocated contents of section @var{sec}. The symbols in
|
||||||
from @var{abfd} and the output offsets assigned to sections in
|
@var{symbol_table} will be used, or the symbols from @var{abfd} if
|
||||||
@var{abfd} are used. The result will be stored at @var{outbuf}
|
@var{symbol_table} is NULL. The output offsets for all sections will
|
||||||
|
be temporarily reset to 0. The result will be stored at @var{outbuf}
|
||||||
or allocated with @code{bfd_malloc} if @var{outbuf} is @code{NULL}.
|
or allocated with @code{bfd_malloc} if @var{outbuf} is @code{NULL}.
|
||||||
|
|
||||||
Generally all sections in @var{abfd} should have their
|
Generally all sections in @var{abfd} should have their
|
||||||
@ -126,17 +163,18 @@ DESCRIPTION
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
bfd_byte *
|
bfd_byte *
|
||||||
bfd_simple_get_relocated_section_contents (abfd, sec, outbuf)
|
bfd_simple_get_relocated_section_contents (abfd, sec, outbuf, symbol_table)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
asection *sec;
|
asection *sec;
|
||||||
bfd_byte *outbuf;
|
bfd_byte *outbuf;
|
||||||
|
asymbol **symbol_table;
|
||||||
{
|
{
|
||||||
struct bfd_link_info link_info;
|
struct bfd_link_info link_info;
|
||||||
struct bfd_link_order link_order;
|
struct bfd_link_order link_order;
|
||||||
struct bfd_link_callbacks callbacks;
|
struct bfd_link_callbacks callbacks;
|
||||||
bfd_byte *contents, *data;
|
bfd_byte *contents, *data;
|
||||||
int storage_needed;
|
int storage_needed;
|
||||||
asymbol **symbol_table;
|
PTR saved_offsets;
|
||||||
|
|
||||||
if (! (sec->flags & SEC_RELOC))
|
if (! (sec->flags & SEC_RELOC))
|
||||||
{
|
{
|
||||||
@ -183,11 +221,36 @@ bfd_simple_get_relocated_section_contents (abfd, sec, outbuf)
|
|||||||
return NULL;
|
return NULL;
|
||||||
outbuf = data;
|
outbuf = data;
|
||||||
}
|
}
|
||||||
bfd_link_add_symbols (abfd, &link_info);
|
|
||||||
|
|
||||||
storage_needed = bfd_get_symtab_upper_bound (abfd);
|
/* The sections in ABFD may already have output sections and offsets set.
|
||||||
symbol_table = (asymbol **) bfd_malloc (storage_needed);
|
Because this function is primarily for debug sections, and GCC uses the
|
||||||
bfd_canonicalize_symtab (abfd, symbol_table);
|
knowledge that debug sections will generally have VMA 0 when emiting
|
||||||
|
relocations between DWARF-2 sections (which are supposed to be
|
||||||
|
section-relative offsets anyway), we need to reset the output offsets
|
||||||
|
to zero. We also need to arrange for section->output_section->vma plus
|
||||||
|
section->output_offset to equal section->vma, which we do by setting
|
||||||
|
section->output_section to point back to section. Save the original
|
||||||
|
output offset and output section to restore later. */
|
||||||
|
saved_offsets = malloc (sizeof (struct saved_output_info)
|
||||||
|
* abfd->section_count);
|
||||||
|
if (saved_offsets == NULL)
|
||||||
|
{
|
||||||
|
if (data)
|
||||||
|
free (data);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
bfd_map_over_sections (abfd, simple_save_output_info, saved_offsets);
|
||||||
|
|
||||||
|
if (symbol_table == NULL)
|
||||||
|
{
|
||||||
|
bfd_link_add_symbols (abfd, &link_info);
|
||||||
|
|
||||||
|
storage_needed = bfd_get_symtab_upper_bound (abfd);
|
||||||
|
symbol_table = (asymbol **) bfd_malloc (storage_needed);
|
||||||
|
bfd_canonicalize_symtab (abfd, symbol_table);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
storage_needed = 0;
|
||||||
|
|
||||||
contents = bfd_get_relocated_section_contents (abfd,
|
contents = bfd_get_relocated_section_contents (abfd,
|
||||||
&link_info,
|
&link_info,
|
||||||
@ -198,6 +261,12 @@ bfd_simple_get_relocated_section_contents (abfd, sec, outbuf)
|
|||||||
if (contents == NULL && data != NULL)
|
if (contents == NULL && data != NULL)
|
||||||
free (data);
|
free (data);
|
||||||
|
|
||||||
|
if (storage_needed != 0)
|
||||||
|
free (symbol_table);
|
||||||
|
|
||||||
|
bfd_map_over_sections (abfd, simple_restore_output_info, saved_offsets);
|
||||||
|
free (saved_offsets);
|
||||||
|
|
||||||
/* Foul hack to prevent bfd_section_size aborts. This flag only controls
|
/* Foul hack to prevent bfd_section_size aborts. This flag only controls
|
||||||
that macro (and the related size macros), selecting between _raw_size
|
that macro (and the related size macros), selecting between _raw_size
|
||||||
and _cooked_size. Debug sections won't change size while we're only
|
and _cooked_size. Debug sections won't change size while we're only
|
||||||
@ -208,6 +277,5 @@ bfd_simple_get_relocated_section_contents (abfd, sec, outbuf)
|
|||||||
|
|
||||||
bfd_link_hash_table_free (abfd, link_info.hash);
|
bfd_link_hash_table_free (abfd, link_info.hash);
|
||||||
|
|
||||||
free (symbol_table);
|
|
||||||
return contents;
|
return contents;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user