diff options
author | Cary Coutant <ccoutant@gmail.com> | 2020-12-14 15:46:47 -0800 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2020-12-14 15:49:27 -0800 |
commit | ff4bc37d77a0ca7286883a477adcb3aa145fc782 (patch) | |
tree | f90757858598811f287e2100b14fa0299d39cdde /gold/object.cc | |
parent | 8cd6d968de17f5dac1601d7cbdda838c9d82c822 (diff) | |
download | gdb-ff4bc37d77a0ca7286883a477adcb3aa145fc782.zip gdb-ff4bc37d77a0ca7286883a477adcb3aa145fc782.tar.gz 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.cc | 4 |
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)); } |