mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-17 16:05:56 +08:00
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 d3e5f6c8f1e, 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:
@ -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
|
||||
|
Reference in New Issue
Block a user