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

@ -1,3 +1,14 @@
2018-09-10 Alan Modra <amodra@gmail.com>
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.
2018-09-03 Nick Clifton <nickc@redhat.com> 2018-09-03 Nick Clifton <nickc@redhat.com>
* po/ja.po: Updated Japanese translation. * po/ja.po: Updated Japanese translation.
@ -234,8 +245,8 @@
2018-08-08 Kevin Buettner <kevinb@redhat.com> 2018-08-08 Kevin Buettner <kevinb@redhat.com>
* dwarf.c (decode_location_expresion): Add case for * dwarf.c (decode_location_expresion): Add case for
DW_OP_GNU_variable_value. DW_OP_GNU_variable_value.
2018-08-06 Claudiu Zissulescu <claziss@synopsys.com> 2018-08-06 Claudiu Zissulescu <claziss@synopsys.com>
@ -914,7 +925,7 @@
2018-02-19 Matthias Klose <doko@debian.org> 2018-02-19 Matthias Klose <doko@debian.org>
* strings.c (long_options): Include-all-whitespace does not take * strings.c (long_options): Include-all-whitespace does not take
an extra agument. an extra agument.
2018-02-13 Alan Modra <amodra@gmail.com> 2018-02-13 Alan Modra <amodra@gmail.com>

View file

@ -1321,17 +1321,20 @@ will remove all sections matching the pattern '.text.*', but will not
remove the section '.text.foo'. remove the section '.text.foo'.
@item --remove-relocations=@var{sectionpattern} @item --remove-relocations=@var{sectionpattern}
Remove relocations from the output file for any section matching Remove non-dynamic relocations from the output file for any section
@var{sectionpattern}. This option may be given more than once. Note matching @var{sectionpattern}. This option may be given more than
that using this option inappropriately may make the output file once. Note that using this option inappropriately may make the output
unusable. Wildcard characters are accepted in @var{sectionpattern}. file unusable, and attempting to remove a dynamic relocation section
such as @samp{.rela.plt} from an executable or shared library with
@option{--remove-relocations=.plt} will not work. Wildcard characters
are accepted in @var{sectionpattern}.
For example: For example:
@smallexample @smallexample
--remove-relocations=.text.* --remove-relocations=.text.*
@end smallexample @end smallexample
will remove the relocations for all sections matching the patter will remove the relocations for all sections matching the pattern
'.text.*'. '.text.*'.
If the first character of @var{sectionpattern} is the exclamation If the first character of @var{sectionpattern} is the exclamation

View file

@ -3943,7 +3943,7 @@ discard_relocations (bfd *ibfd ATTRIBUTE_UNUSED, asection *isection)
/* Wrapper for dealing with --remove-section (-R) command line arguments. /* Wrapper for dealing with --remove-section (-R) command line arguments.
A special case is detected here, if the user asks to remove a relocation 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 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 static void
handle_remove_section_option (const char *section_pattern) 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); handle_remove_relocations_option (section_pattern + 5);
else if (strncmp (section_pattern, ".rel.", 5) == 0) else if (strncmp (section_pattern, ".rel.", 5) == 0)
handle_remove_relocations_option (section_pattern + 4); handle_remove_relocations_option (section_pattern + 4);
else
{ find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE);
find_section_list (section_pattern, TRUE, SECTION_CONTEXT_REMOVE); sections_removed = TRUE;
sections_removed = TRUE;
}
} }
/* Copy relocations in input section ISECTION of IBFD to an output /* Copy relocations in input section ISECTION of IBFD to an output

View file

@ -1223,3 +1223,36 @@ proc objcopy_test_without_global_symbol { } {
setup_xfail aarch64*-*-* arm*-*-* setup_xfail aarch64*-*-* arm*-*-*
objcopy_test_without_global_symbol objcopy_test_without_global_symbol
# objcopy remove relocation from executable test
proc objcopy_remove_relocations_from_executable { } {
global OBJCOPY
global srcdir
global subdir
global READELF
set test "remove-section relocation sections"
if { [target_compile $srcdir/$subdir/testprog.c tmpdir/pr23611 executable debug] != "" } {
untested $test
return
}
if [is_remote host] {
set objfile [remote_download host tmpdir/pr23611]
} else {
set objfile tmpdir/pr23611
}
set out tmpdir/pr23611.out
set exec_output1 [binutils_run $OBJCOPY "-R .rela.plt -R .rela.dyn -R .rel.plt -R .rel.dyn $objfile $out"]
set exec_output2 [binutils_run $READELF "-S $out"]
if { [string match "*.rel.plt*" $exec_output2] || [string match "*.rela.plt*" $exec_output2] || [string match "*.rel.dyn*" $exec_output2] || [string match "*.rela.dyn*" $exec_output2] } {
fail $test
return
}
pass $test
}
objcopy_remove_relocations_from_executable