* objcopy.c (filter_symbols): Explicitly stripping a symbol used in relocations is an error.
Retype 'keep' to bfd_boolean. * binutils-all/objcopy.exp: Add test for stripping a symbol used in a relocation. * binutils-all/needed-by-reloc.s: New file.
This commit is contained in:
parent
98f17e6e1c
commit
312aaa3cfe
5 changed files with 68 additions and 11 deletions
|
@ -917,7 +917,8 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
|
|||
asymbol *sym = from[src_count];
|
||||
flagword flags = sym->flags;
|
||||
char *name = (char *) bfd_asymbol_name (sym);
|
||||
int keep;
|
||||
bfd_boolean keep;
|
||||
bfd_boolean used_in_reloc = FALSE;
|
||||
bfd_boolean undefined;
|
||||
bfd_boolean rem_leading_char;
|
||||
bfd_boolean add_leading_char;
|
||||
|
@ -985,21 +986,24 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
|
|||
}
|
||||
|
||||
if (strip_symbols == STRIP_ALL)
|
||||
keep = 0;
|
||||
keep = FALSE;
|
||||
else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
|
||||
|| ((flags & BSF_SECTION_SYM) != 0
|
||||
&& ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
|
||||
& BSF_KEEP) != 0))
|
||||
keep = 1;
|
||||
{
|
||||
keep = TRUE;
|
||||
used_in_reloc = TRUE;
|
||||
}
|
||||
else if (relocatable /* Relocatable file. */
|
||||
&& (flags & (BSF_GLOBAL | BSF_WEAK)) != 0)
|
||||
keep = 1;
|
||||
keep = TRUE;
|
||||
else if (bfd_decode_symclass (sym) == 'I')
|
||||
/* Global symbols in $idata sections need to be retained
|
||||
even if relocatable is FALSE. External users of the
|
||||
library containing the $idata section may reference these
|
||||
symbols. */
|
||||
keep = 1;
|
||||
keep = TRUE;
|
||||
else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
|
||||
|| (flags & BSF_WEAK) != 0
|
||||
|| undefined
|
||||
|
@ -1012,7 +1016,7 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
|
|||
else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
|
||||
/* COMDAT sections store special information in local
|
||||
symbols, so we cannot risk stripping any of them. */
|
||||
keep = 1;
|
||||
keep = TRUE;
|
||||
else /* Local symbol. */
|
||||
keep = (strip_symbols != STRIP_UNNEEDED
|
||||
&& (discard_locals != LOCALS_ALL
|
||||
|
@ -1020,17 +1024,30 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
|
|||
|| ! bfd_is_local_label (abfd, sym))));
|
||||
|
||||
if (keep && is_specified_symbol (name, strip_specific_list))
|
||||
keep = 0;
|
||||
{
|
||||
/* There are multiple ways to set 'keep' above, but if it
|
||||
was the relocatable symbol case, then that's an error. */
|
||||
if (used_in_reloc)
|
||||
{
|
||||
non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
|
||||
status = 1;
|
||||
}
|
||||
else
|
||||
keep = FALSE;
|
||||
}
|
||||
|
||||
if (keep
|
||||
&& !(flags & BSF_KEEP)
|
||||
&& is_specified_symbol (name, strip_unneeded_list))
|
||||
keep = 0;
|
||||
keep = FALSE;
|
||||
|
||||
if (!keep
|
||||
&& ((keep_file_symbols && (flags & BSF_FILE))
|
||||
|| is_specified_symbol (name, keep_specific_list)))
|
||||
keep = 1;
|
||||
keep = TRUE;
|
||||
|
||||
if (keep && is_strip_section (abfd, bfd_get_section (sym)))
|
||||
keep = 0;
|
||||
keep = FALSE;
|
||||
|
||||
if (keep)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue