Cosmetic improvements for OSABI access.

Add accessor methods to elfcpp::Ehdr class for EI_OSABI and EI_ABIVERSION;
use those to simplify initialization of Osabi class and eliminate the need
to template the class.

elfcpp/
	* elfcpp.h (class Ehdr): Add get_ei_osabi and get_ei_abiversion methods.

gold/
	* dwp.cc (class Dwo_file): Use new Ehdr::get_ei_osabi and
	get_ei_abiversion methods.
	* incremental.cc (make_sized_incremental_binary): Likewise.
	* object.cc (Sized_relobj_file::Sized_relobj_file): Likewise.
	(make_elf_sized_object): Likewise.
	* object.h (class Osabi): Make the class untemplated.
This commit is contained in:
Cary Coutant
2020-12-15 14:37:22 -08:00
parent 8947abe6bf
commit 2b2d74f4a1
7 changed files with 33 additions and 14 deletions

View File

@ -1,3 +1,7 @@
2020-12-15 Cary Coutant <ccoutant@gmail.com>
* elfcpp.h (class Ehdr): Add get_ei_osabi and get_ei_abiversion methods.
2020-12-15 Vivek Das Mohapatra <vivek@collabora.com> 2020-12-15 Vivek Das Mohapatra <vivek@collabora.com>
* elfcpp.h (enum DT): New enum member DT_GNU_FLAGS_1. * elfcpp.h (enum DT): New enum member DT_GNU_FLAGS_1.

View File

@ -1100,6 +1100,14 @@ class Ehdr
get_e_ident() const get_e_ident() const
{ return this->p_->e_ident; } { return this->p_->e_ident; }
unsigned char
get_ei_osabi() const
{ return this->p_->e_ident[EI_OSABI]; }
unsigned char
get_ei_abiversion() const
{ return this->p_->e_ident[EI_ABIVERSION]; }
Elf_Half Elf_Half
get_e_type() const get_e_type() const
{ return Convert<16, big_endian>::convert_host(this->p_->e_type); } { return Convert<16, big_endian>::convert_host(this->p_->e_type); }

View File

@ -1,3 +1,12 @@
2020-12-15 Cary Coutant <ccoutant@gmail.com>
* dwp.cc (class Dwo_file): Use new Ehdr::get_ei_osabi and
get_ei_abiversion methods.
* incremental.cc (make_sized_incremental_binary): Likewise.
* object.cc (Sized_relobj_file::Sized_relobj_file): Likewise.
(make_elf_sized_object): Likewise.
* object.h (class Osabi): Make the class untemplated.
2020-12-15 Vivek Das Mohapatra <vivek@collabora.com> 2020-12-15 Vivek Das Mohapatra <vivek@collabora.com>
Implement -z unique / -z nounique options. Implement -z unique / -z nounique options.

View File

@ -1107,8 +1107,8 @@ Dwo_file::sized_make_object(const unsigned char* p, Input_file* input_file,
if (output_file != NULL) if (output_file != NULL)
output_file->record_target_info( output_file->record_target_info(
this->name_, ehdr.get_e_machine(), size, big_endian, this->name_, ehdr.get_e_machine(), size, big_endian,
ehdr.get_e_ident()[elfcpp::EI_OSABI], ehdr.get_ei_osabi(),
ehdr.get_e_ident()[elfcpp::EI_ABIVERSION]); ehdr.get_ei_abiversion());
return obj; return obj;
} }

View File

@ -856,8 +856,8 @@ make_sized_incremental_binary(Output_file* file,
{ {
Target* target = select_target(NULL, 0, // XXX Target* target = select_target(NULL, 0, // XXX
ehdr.get_e_machine(), size, big_endian, ehdr.get_e_machine(), size, big_endian,
ehdr.get_e_ident()[elfcpp::EI_OSABI], ehdr.get_ei_osabi(),
ehdr.get_e_ident()[elfcpp::EI_ABIVERSION]); ehdr.get_ei_abiversion());
if (target == NULL) if (target == NULL)
{ {
explain_no_incremental(_("unsupported ELF machine number %d"), explain_no_incremental(_("unsupported ELF machine number %d"),

View File

@ -464,7 +464,8 @@ Sized_relobj_file<size, big_endian>::Sized_relobj_file(
const elfcpp::Ehdr<size, big_endian>& ehdr) const elfcpp::Ehdr<size, big_endian>& ehdr)
: Sized_relobj<size, big_endian>(name, input_file, offset), : Sized_relobj<size, big_endian>(name, input_file, offset),
elf_file_(this, ehdr), elf_file_(this, ehdr),
osabi_(ehdr), osabi_(ehdr.get_ei_osabi()),
e_type_(ehdr.get_e_type()),
symtab_shndx_(-1U), symtab_shndx_(-1U),
local_symbol_count_(0), local_symbol_count_(0),
output_local_symbol_count_(0), output_local_symbol_count_(0),
@ -482,7 +483,6 @@ Sized_relobj_file<size, big_endian>::Sized_relobj_file(
deferred_layout_relocs_(), deferred_layout_relocs_(),
output_views_(NULL) output_views_(NULL)
{ {
this->e_type_ = ehdr.get_e_type();
} }
template<int size, bool big_endian> template<int size, bool big_endian>
@ -3387,8 +3387,8 @@ make_elf_sized_object(const std::string& name, Input_file* input_file,
{ {
Target* target = select_target(input_file, offset, Target* target = select_target(input_file, offset,
ehdr.get_e_machine(), size, big_endian, ehdr.get_e_machine(), size, big_endian,
ehdr.get_e_ident()[elfcpp::EI_OSABI], ehdr.get_ei_osabi(),
ehdr.get_e_ident()[elfcpp::EI_ABIVERSION]); ehdr.get_ei_abiversion());
if (target == NULL) if (target == NULL)
gold_fatal(_("%s: unsupported ELF machine number %d"), gold_fatal(_("%s: unsupported ELF machine number %d"),
name.c_str(), ehdr.get_e_machine()); name.c_str(), ehdr.get_e_machine());

View File

@ -386,13 +386,11 @@ build_compressed_section_map(const unsigned char* pshdrs, unsigned int shnum,
// Osabi represents the EI_OSABI field from the ELF header. // Osabi represents the EI_OSABI field from the ELF header.
template <int size, bool big_endian>
class Osabi class Osabi
{ {
public: public:
Osabi(const elfcpp::Ehdr<size, big_endian>& ehdr) Osabi(unsigned char ei_osabi)
: ei_osabi_(static_cast<elfcpp::ELFOSABI>( : ei_osabi_(static_cast<elfcpp::ELFOSABI>(ei_osabi))
ehdr.get_e_ident()[elfcpp::EI_OSABI]))
{ } { }
bool bool
@ -2249,7 +2247,7 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
{ return this->e_type_; } { return this->e_type_; }
// Return the EI_OSABI. // Return the EI_OSABI.
const Osabi<size, big_endian>& const Osabi&
osabi() const osabi() const
{ return this->osabi_; } { return this->osabi_; }
@ -2894,7 +2892,7 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
// General access to the ELF file. // General access to the ELF file.
elfcpp::Elf_file<size, big_endian, Object> elf_file_; elfcpp::Elf_file<size, big_endian, Object> elf_file_;
// The EI_OSABI. // The EI_OSABI.
const Osabi<size, big_endian> osabi_; const Osabi osabi_;
// Type of ELF file (ET_REL or ET_EXEC). ET_EXEC files are allowed // Type of ELF file (ET_REL or ET_EXEC). ET_EXEC files are allowed
// as input files only for the --just-symbols option. // as input files only for the --just-symbols option.
int e_type_; int e_type_;