PR23611, objcopy is not removing executable relocatable sections

BFD handles ELF relocation sections in an executable differently to
relocation sections in a relocatable object.  For a relocatable
object, BFD carries the relocations as data associated with the
section to which they apply; The relocation section doesn't appear as
a separate section.  For an executable, dynamic relocation sections do
appear as separate sections.  This means that objcopy needs to use
different strategies when dealing with relocations.

When --remove-relocations was added to objcopy with commit
d3e5f6c8f1, objcopy lost the ability to remove dynamic relocation
sections such as .rela.plt from executables using the option
"--remove-section=.rela.plt".  This patch reinstates that
functionality.

I thought it best to keep --remove-relocations as is, rather than
extending to handle dynamic relocations as per the patch in the PR,
because executables linked with --emit-relocs may have both dynamic
and non-dynamic relocations.  In that case --remove-relocataions=* is
useful to remove all the non-dynamic relocations.

	PR binutils/23611
	* objcopy.c (handle_remove_section_option): Consider .rela and
	.rel sections for stripping directly as well as attached to the
	associated section they relocate.
	* doc/binutils.texi (remove-relocations): Specify that this
	option removes non-dynamic relocation sections.
	* testsuite/binutils-all/objcopy.exp
	(objcopy_remove_relocations_from_executable): New test.
This commit is contained in:
Alan Modra 2018-09-10 11:57:08 +09:30
parent 78f8307c93
commit f9853190c8
4 changed files with 59 additions and 14 deletions

View file

@ -3943,7 +3943,7 @@ discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
/* Wrapper for dealing with --remove-section (-R) command line arguments.
A special case is detected here, if the user asks to remove a relocation
section (one starting with ".rela." or ".rel.") then this removal must
be done using a different technique. */
be done using a different technique in a relocatable object. */
static void
handle_remove_section_option (const char *section_pattern)
@ -3952,11 +3952,9 @@ handle_remove_section_option (const char *section_pattern)
handle_remove_relocations_option (section_pattern + 5);
else if (strncmp (section_pattern, ".rel.", 5) == 0)
handle_remove_relocations_option (section_pattern + 4);
else
{
find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
sections_removed = TRUE;
}
find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
sections_removed = TRUE;
}
/* Copy relocations in input section ISECTION of IBFD to an output