mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 09:14:14 +08:00
coff keep_relocs and keep_contents
keep_relocs is set by pe_ILF_save_relocs but not used anywhere in the coff/pe code. It is tested by the xcoff backend but not set. keep_contents is only used by the xcoff backend when dealing with the .loader section, and it's easy enough to dispense with it there. keep_contents is set in various places but that's fairly useless when the contents aren't freed anyway until later linker support functions, add_dynamic_symbols and check_dynamic_ar_symbols. There the contents were freed if keep_contents wasn't set. I reckon we can free them unconditionally. * coff-bfd.h (struct coff_section_tdata): Delete keep_relocs and keep_contents. * peicode.h (pe_ILF_save_relocs): Don't set keep_relocs. * xcofflink.c (xcoff_get_section_contents): Cache contents. Return the contents. Update callers. (_bfd_xcoff_canonicalize_dynamic_symtab): Don't set keep_contents for .loader. (xcoff_link_add_dynamic_symbols): Free .loader contents unconditionally. (xcoff_link_check_dynamic_ar_symbols): Likewise.
This commit is contained in:
@ -43,12 +43,8 @@ struct coff_section_tdata
|
|||||||
{
|
{
|
||||||
/* The relocs, swapped into COFF internal form. This may be NULL. */
|
/* The relocs, swapped into COFF internal form. This may be NULL. */
|
||||||
struct internal_reloc *relocs;
|
struct internal_reloc *relocs;
|
||||||
/* If this is TRUE, the relocs entry may not be freed. */
|
|
||||||
bool keep_relocs;
|
|
||||||
/* The section contents. This may be NULL. */
|
/* The section contents. This may be NULL. */
|
||||||
bfd_byte *contents;
|
bfd_byte *contents;
|
||||||
/* If this is TRUE, the contents entry may not be freed. */
|
|
||||||
bool keep_contents;
|
|
||||||
/* Information cached by coff_find_nearest_line. */
|
/* Information cached by coff_find_nearest_line. */
|
||||||
bool saved_bias;
|
bool saved_bias;
|
||||||
bfd_signed_vma bias;
|
bfd_signed_vma bias;
|
||||||
|
@ -526,7 +526,6 @@ pe_ILF_save_relocs (pe_ILF_vars * vars,
|
|||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
|
coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
|
||||||
coff_section_data (vars->abfd, sec)->keep_relocs = true;
|
|
||||||
|
|
||||||
sec->relocation = vars->reltab;
|
sec->relocation = vars->reltab;
|
||||||
sec->reloc_count = vars->relcount;
|
sec->reloc_count = vars->relcount;
|
||||||
|
@ -216,7 +216,7 @@ static bool xcoff_mark (struct bfd_link_info *, asection *);
|
|||||||
|
|
||||||
/* Read the contents of a section. */
|
/* Read the contents of a section. */
|
||||||
|
|
||||||
static bool
|
static bfd_byte *
|
||||||
xcoff_get_section_contents (bfd *abfd, asection *sec)
|
xcoff_get_section_contents (bfd *abfd, asection *sec)
|
||||||
{
|
{
|
||||||
if (coff_section_data (abfd, sec) == NULL)
|
if (coff_section_data (abfd, sec) == NULL)
|
||||||
@ -225,22 +225,22 @@ xcoff_get_section_contents (bfd *abfd, asection *sec)
|
|||||||
|
|
||||||
sec->used_by_bfd = bfd_zalloc (abfd, amt);
|
sec->used_by_bfd = bfd_zalloc (abfd, amt);
|
||||||
if (sec->used_by_bfd == NULL)
|
if (sec->used_by_bfd == NULL)
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coff_section_data (abfd, sec)->contents == NULL)
|
bfd_byte *contents = coff_section_data (abfd, sec)->contents;
|
||||||
|
if (contents == NULL)
|
||||||
{
|
{
|
||||||
bfd_byte *contents;
|
if (bfd_malloc_and_get_section (abfd, sec, &contents))
|
||||||
|
coff_section_data (abfd, sec)->contents = contents;
|
||||||
if (! bfd_malloc_and_get_section (abfd, sec, &contents))
|
else
|
||||||
{
|
{
|
||||||
free (contents);
|
free (contents);
|
||||||
return false;
|
contents = NULL;
|
||||||
}
|
}
|
||||||
coff_section_data (abfd, sec)->contents = contents;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the size required to hold the dynamic symbols. */
|
/* Get the size required to hold the dynamic symbols. */
|
||||||
@ -265,9 +265,9 @@ _bfd_xcoff_get_dynamic_symtab_upper_bound (bfd *abfd)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! xcoff_get_section_contents (abfd, lsec))
|
contents = xcoff_get_section_contents (abfd, lsec);
|
||||||
|
if (!contents)
|
||||||
return -1;
|
return -1;
|
||||||
contents = coff_section_data (abfd, lsec)->contents;
|
|
||||||
|
|
||||||
bfd_xcoff_swap_ldhdr_in (abfd, (void *) contents, &ldhdr);
|
bfd_xcoff_swap_ldhdr_in (abfd, (void *) contents, &ldhdr);
|
||||||
|
|
||||||
@ -299,11 +299,9 @@ _bfd_xcoff_canonicalize_dynamic_symtab (bfd *abfd, asymbol **psyms)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! xcoff_get_section_contents (abfd, lsec))
|
contents = xcoff_get_section_contents (abfd, lsec);
|
||||||
|
if (!contents)
|
||||||
return -1;
|
return -1;
|
||||||
contents = coff_section_data (abfd, lsec)->contents;
|
|
||||||
|
|
||||||
coff_section_data (abfd, lsec)->keep_contents = true;
|
|
||||||
|
|
||||||
bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
|
bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
|
||||||
|
|
||||||
@ -386,9 +384,9 @@ _bfd_xcoff_get_dynamic_reloc_upper_bound (bfd *abfd)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! xcoff_get_section_contents (abfd, lsec))
|
contents = xcoff_get_section_contents (abfd, lsec);
|
||||||
|
if (!contents)
|
||||||
return -1;
|
return -1;
|
||||||
contents = coff_section_data (abfd, lsec)->contents;
|
|
||||||
|
|
||||||
bfd_xcoff_swap_ldhdr_in (abfd, (struct external_ldhdr *) contents, &ldhdr);
|
bfd_xcoff_swap_ldhdr_in (abfd, (struct external_ldhdr *) contents, &ldhdr);
|
||||||
|
|
||||||
@ -421,9 +419,9 @@ _bfd_xcoff_canonicalize_dynamic_reloc (bfd *abfd,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! xcoff_get_section_contents (abfd, lsec))
|
contents = xcoff_get_section_contents (abfd, lsec);
|
||||||
|
if (!contents)
|
||||||
return -1;
|
return -1;
|
||||||
contents = coff_section_data (abfd, lsec)->contents;
|
|
||||||
|
|
||||||
bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
|
bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
|
||||||
|
|
||||||
@ -915,9 +913,9 @@ xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! xcoff_get_section_contents (abfd, lsec))
|
contents = xcoff_get_section_contents (abfd, lsec);
|
||||||
|
if (!contents)
|
||||||
return false;
|
return false;
|
||||||
contents = coff_section_data (abfd, lsec)->contents;
|
|
||||||
|
|
||||||
/* Remove the sections from this object, so that they do not get
|
/* Remove the sections from this object, so that they do not get
|
||||||
included in the link. */
|
included in the link. */
|
||||||
@ -1044,11 +1042,8 @@ xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contents != NULL && ! coff_section_data (abfd, lsec)->keep_contents)
|
free (contents);
|
||||||
{
|
|
||||||
free (coff_section_data (abfd, lsec)->contents);
|
|
||||||
coff_section_data (abfd, lsec)->contents = NULL;
|
coff_section_data (abfd, lsec)->contents = NULL;
|
||||||
}
|
|
||||||
|
|
||||||
/* Record this file in the import files. */
|
/* Record this file in the import files. */
|
||||||
n = bfd_alloc (abfd, (bfd_size_type) sizeof (struct xcoff_import_file));
|
n = bfd_alloc (abfd, (bfd_size_type) sizeof (struct xcoff_import_file));
|
||||||
@ -2306,8 +2301,7 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||||||
|
|
||||||
/* If we are not keeping memory, free the reloc information. */
|
/* If we are not keeping memory, free the reloc information. */
|
||||||
if (! info->keep_memory
|
if (! info->keep_memory
|
||||||
&& coff_section_data (abfd, o) != NULL
|
&& coff_section_data (abfd, o) != NULL)
|
||||||
&& ! coff_section_data (abfd, o)->keep_relocs)
|
|
||||||
{
|
{
|
||||||
free (coff_section_data (abfd, o)->relocs);
|
free (coff_section_data (abfd, o)->relocs);
|
||||||
coff_section_data (abfd, o)->relocs = NULL;
|
coff_section_data (abfd, o)->relocs = NULL;
|
||||||
@ -2383,9 +2377,9 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
|
|||||||
/* There are no symbols, so don't try to include it. */
|
/* There are no symbols, so don't try to include it. */
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (! xcoff_get_section_contents (abfd, lsec))
|
contents = xcoff_get_section_contents (abfd, lsec);
|
||||||
|
if (!contents)
|
||||||
return false;
|
return false;
|
||||||
contents = coff_section_data (abfd, lsec)->contents;
|
|
||||||
|
|
||||||
bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
|
bfd_xcoff_swap_ldhdr_in (abfd, contents, &ldhdr);
|
||||||
|
|
||||||
@ -2434,12 +2428,9 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We do not need this shared object. */
|
/* We do not need this shared object's .loader section. */
|
||||||
if (contents != NULL && ! coff_section_data (abfd, lsec)->keep_contents)
|
free (contents);
|
||||||
{
|
|
||||||
free (coff_section_data (abfd, lsec)->contents);
|
|
||||||
coff_section_data (abfd, lsec)->contents = NULL;
|
coff_section_data (abfd, lsec)->contents = NULL;
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -3142,8 +3133,7 @@ xcoff_mark (struct bfd_link_info *info, asection *sec)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (! info->keep_memory
|
if (! info->keep_memory
|
||||||
&& coff_section_data (sec->owner, sec) != NULL
|
&& coff_section_data (sec->owner, sec) != NULL)
|
||||||
&& ! coff_section_data (sec->owner, sec)->keep_relocs)
|
|
||||||
{
|
{
|
||||||
free (coff_section_data (sec->owner, sec)->relocs);
|
free (coff_section_data (sec->owner, sec)->relocs);
|
||||||
coff_section_data (sec->owner, sec)->relocs = NULL;
|
coff_section_data (sec->owner, sec)->relocs = NULL;
|
||||||
|
Reference in New Issue
Block a user