aboutsummaryrefslogtreecommitdiff
path: root/gold/object.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2020-12-14 15:46:47 -0800
committerCary Coutant <ccoutant@gmail.com>2020-12-14 15:49:27 -0800
commitff4bc37d77a0ca7286883a477adcb3aa145fc782 (patch)
treef90757858598811f287e2100b14fa0299d39cdde /gold/object.cc
parent8cd6d968de17f5dac1601d7cbdda838c9d82c822 (diff)
downloadfsf-binutils-gdb-ff4bc37d77a0ca7286883a477adcb3aa145fc782.zip
fsf-binutils-gdb-ff4bc37d77a0ca7286883a477adcb3aa145fc782.tar.gz
fsf-binutils-gdb-ff4bc37d77a0ca7286883a477adcb3aa145fc782.tar.bz2
Keep input SHF_GNU_RETAIN sections and strip output SHF_GNU_RETAIN for GNU/FreBSD ELFOSABIs.
2020-12-14 H.J. Lu <hjl.tools@gmail.com> Cary Coutant <ccoutant@gmail.com> elfcpp/ PR gold/27039 * elfcpp.h (SHF): Add SHF_GNU_RETAIN. gold/ PR gold/27039 * layout.cc (Layout::layout): Strip SHF_GNU_RETAIN. * object.cc (Sized_relobj_file::Sized_relobj_file): Initialize osabi_. (Sized_relobj_file::do_layout): Keep SHF_GNU_RETAIN sections for GNU/FreBSD ELFOSABIs. * object.h (Osabi) New class. (Sized_relobj_file): Add osabi() and osabi_. * testsuite/Makefile.am (check_SCRIPTS): Add retain.sh. (check_DATA): Add retain_1.out retain_2.out. (MOSTLYCLEANFILES): Add retain_1 retain_2. (retain_1.out): New target. (retain_1): Likewise. (retain_1.o): Likewise. (retain_2.out): Likewise. (retain_2): Likewise. (retain_2.o): Likewise. * testsuite/Makefile.in: Regenerate. * testsuite/retain.sh: New file. * testsuite/retain_1.s: Likewise. * testsuite/retain_2.s: Likewise.
Diffstat (limited to 'gold/object.cc')
-rw-r--r--gold/object.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/gold/object.cc b/gold/object.cc
index 23ce206..072563b 100644
--- a/gold/object.cc
+++ b/gold/object.cc
@@ -464,6 +464,7 @@ Sized_relobj_file<size, big_endian>::Sized_relobj_file(
const elfcpp::Ehdr<size, big_endian>& ehdr)
: Sized_relobj<size, big_endian>(name, input_file, offset),
elf_file_(this, ehdr),
+ osabi_(ehdr),
symtab_shndx_(-1U),
local_symbol_count_(0),
output_local_symbol_count_(0),
@@ -1706,7 +1707,8 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
if (this->is_section_name_included(name)
|| layout->keep_input_section (this, name)
|| sh_type == elfcpp::SHT_INIT_ARRAY
- || sh_type == elfcpp::SHT_FINI_ARRAY)
+ || sh_type == elfcpp::SHT_FINI_ARRAY
+ || this->osabi().has_shf_retain(shdr.get_sh_flags()))
{
symtab->gc()->worklist().push_back(Section_id(this, i));
}