diff options
-rw-r--r-- | gold/ChangeLog | 7 | ||||
-rw-r--r-- | gold/layout.cc | 8 | ||||
-rw-r--r-- | gold/target.h | 10 |
3 files changed, 24 insertions, 1 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 4ddef9a..f1fea46 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,12 @@ 2014-04-15 Sasa Stankovic <Sasa.Stankovic@imgtec.com> + * layout.cc (Layout::include_section): Allow a target to decide + whether to include a section. + * target.h (Target::should_include_section): New function. + (Target::do_should_include_section): New function. + +2014-04-15 Sasa Stankovic <Sasa.Stankovic@imgtec.com> + * copy-relocs.cc (Copy_relocs::Copy_reloc_entry::emit): Remove and inline into ... (Copy_relocs::emit): ... here. diff --git a/gold/layout.cc b/gold/layout.cc index c96516c..02f691e 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -644,7 +644,13 @@ Layout::include_section(Sized_relobj_file<size, big_endian>*, const char* name, && (shdr.get_sh_flags() & elfcpp::SHF_EXCLUDE)) return false; - switch (shdr.get_sh_type()) + elfcpp::Elf_Word sh_type = shdr.get_sh_type(); + + if ((sh_type >= elfcpp::SHT_LOOS && sh_type <= elfcpp::SHT_HIOS) + || (sh_type >= elfcpp::SHT_LOPROC && sh_type <= elfcpp::SHT_HIPROC)) + return parameters->target().should_include_section(sh_type); + + switch (sh_type) { case elfcpp::SHT_NULL: case elfcpp::SHT_SYMTAB: diff --git a/gold/target.h b/gold/target.h index aaf4b1c..e380591 100644 --- a/gold/target.h +++ b/gold/target.h @@ -480,6 +480,11 @@ class Target adjust_dyn_symbol(const Symbol* sym, unsigned char* view) const { this->do_adjust_dyn_symbol(sym, view); } + // Return whether to include the section in the link. + bool + should_include_section(elfcpp::Elf_Word sh_type) const + { return this->do_should_include_section(sh_type); } + protected: // This struct holds the constant information for a child class. We // use a struct to avoid the overhead of virtual function calls for @@ -773,6 +778,11 @@ class Target do_adjust_dyn_symbol(const Symbol*, unsigned char*) const { } + // This may be overridden by the child class. + virtual bool + do_should_include_section(elfcpp::Elf_Word) const + { return true; } + private: // The implementations of the four do_make_elf_object virtual functions are // almost identical except for their sizes and endianness. We use a template. |