libabigail
Namespaces | Functions
abg-elf-helpers.cc File Reference

This contains the definitions of the ELF utilities for the dwarf reader. More...

#include "config.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <elfutils/libdwfl.h>
#include <sstream>
#include "abg-elf-helpers.h"
#include "abg-tools-utils.h"
Include dependency graph for abg-elf-helpers.cc:

Go to the source code of this file.

Namespaces

 abigail
 Toplevel namespace for libabigail.
 

Functions

bool address_is_in_opd_section (Elf *elf_handle, Dwarf_Addr addr)
 Return true if an address is in the ".opd" section that is present on the ppc64 platform. More...
 
bool address_is_in_section (Dwarf_Addr addr, Elf_Scn *section)
 Test if a given address is in a given section. More...
 
bool architecture_is_arm32 (Elf *elf_handle)
 Test if the architecture of the current binary is arm32. More...
 
bool architecture_is_arm64 (Elf *elf_handle)
 Test if the architecture of the current binary is arm64. More...
 
bool architecture_is_big_endian (Elf *elf_handle)
 Test if the endianness of the current binary is Big Endian. More...
 
bool architecture_is_ppc32 (Elf *elf_handle)
 Test if the architecture of the current binary is ppc32. More...
 
bool architecture_is_ppc64 (Elf *elf_handle)
 Test if the architecture of the current binary is ppc64. More...
 
dwfl_sptr create_new_dwfl_handle (Dwfl_Callbacks &cb)
 
std::string e_machine_to_string (GElf_Half e_machine)
 Convert the value of the e_machine field of GElf_Ehdr into a string. This is to get a string representing the architecture of the elf file at hand. More...
 
Elf_Scn * find_bss_section (Elf *elf_handle)
 Find and return the .bss section. More...
 
Elf_Scn * find_data1_section (Elf *elf_handle)
 Find and return the .data1 section. More...
 
Elf_Scn * find_data_section (Elf *elf_handle)
 Find and return the .data section. More...
 
Elf_Scn * find_dynsym_section (Elf *elf_handle)
 Find and return the .symtab section. More...
 
hash_table_kind find_hash_table_section_index (Elf *elf_handle, size_t &ht_section_index, size_t &symtab_section_index)
 Get the offset offset of the hash table section. More...
 
Elf_Scn * find_ksymtab_gpl_section (Elf *elf_handle)
 Return the __ksymtab_gpl section of a linux kernel ELF file (either a vmlinux binary or a kernel module). More...
 
Elf_Scn * find_ksymtab_section (Elf *elf_handle)
 Return the __ksymtab section of a linux kernel ELF file (either a vmlinux binary or a kernel module). More...
 
Elf_Scn * find_ksymtab_strings_section (Elf *elf_handle)
 Find the __ksymtab_strings section of a Linux kernel binary. More...
 
Elf_Scn * find_opd_section (Elf *elf_handle)
 Return the "Official Procedure descriptors section." This section is named .opd, and is usually present only on PPC64 ELFv1 binaries. More...
 
Elf_Scn * find_relocation_section (Elf *elf_handle, Elf_Scn *target_section)
 Return the .rel{a,} section corresponding to a given section. More...
 
Elf_Scn * find_rodata_section (Elf *elf_handle)
 Find and return the .rodata section. More...
 
Elf_Scn * find_section (Elf *elf_handle, const std::string &name, Elf64_Word section_type)
 Find and return a section by its name and its type. More...
 
Elf_Scn * find_section (Elf *elf_handle, Elf64_Word section_type)
 Find and return a section by its type. More...
 
Elf_Scn * find_section_by_name (Elf *elf_handle, const std::string &name)
 Find and return a section by its name. More...
 
Elf_Scn * find_strtab_for_symtab_section (Elf *elf_handle, Elf_Scn *symtab_section)
 Return the string table used by the given symbol table. More...
 
Elf_Scn * find_symbol_table_section (Elf *elf_handle)
 Find the symbol table. More...
 
bool find_symbol_table_section_index (Elf *elf_handle, size_t &symtab_index)
 Find the index (in the section headers table) of the symbol table section. More...
 
Elf_Scn * find_symtab_section (Elf *elf_handle)
 Find and return the .symtab section. More...
 
Elf_Scn * find_text_section (Elf *elf_handle)
 Find and return the .text section. More...
 
unsigned char get_architecture_word_size (Elf *elf_handle)
 Return the size of a word for the current architecture. More...
 
bool get_binary_load_address (Elf *elf_handle, GElf_Addr &load_address)
 Get the address at which a given binary is loaded in memory. More...
 
bool get_crc_for_symbol (Elf *elf_handle, GElf_Sym *crc_symbol, uint32_t &crc_value)
 Return the CRC from the "__crc_" symbol. More...
 
bool get_soname_of_elf_file (const string &path, string &soname)
 Fetch the SONAME ELF property from an ELF binary file. More...
 
bool get_symbol_versionning_sections (Elf *elf_handle, Elf_Scn *&versym_section, Elf_Scn *&verdef_section, Elf_Scn *&verneed_section)
 Return the SHT_GNU_versym, SHT_GNU_verdef and SHT_GNU_verneed sections that are involved in symbol versionning. More...
 
bool get_version_definition_for_versym (Elf *elf_handle, GElf_Versym *versym, Elf_Scn *verdef_section, elf_symbol::version &version)
 Get the version definition (from the SHT_GNU_verdef section) of a given symbol represented by a pointer to GElf_Versym. More...
 
bool get_version_for_symbol (Elf *elf_handle, size_t symbol_index, bool get_def_version, elf_symbol::version &version)
 Return the version for a symbol that is at a given index in its SHT_SYMTAB section. More...
 
bool get_version_needed_for_versym (Elf *elf_handle, GElf_Versym *versym, Elf_Scn *verneed_section, elf_symbol::version &version)
 Get the version needed (from the SHT_GNU_verneed section) to resolve an undefined symbol represented by a pointer to GElf_Versym. More...
 
const Dwfl_Callbacks & initialize_dwfl_callbacks (Dwfl_Callbacks &cb, char **debug_info_root_path)
 
bool is_dso (Elf *elf_handle)
 Test if the elf file being read is a dynamic shared / object. More...
 
bool is_executable (Elf *elf_handle)
 Test if the elf file being read is an executable. More...
 
bool is_linux_kernel (Elf *elf_handle)
 Test if the ELF binary denoted by a given ELF handle is a Linux Kernel binary (either vmlinux or a kernel module). More...
 
bool is_linux_kernel_module (Elf *elf_handle)
 Test if the ELF binary denoted by a given ELF handle is a Linux Kernel Module. More...
 
bool lookup_data_tag_from_dynamic_segment (Elf *elf, Elf64_Sxword data_tag, vector< string > &dt_tag_data)
 Get data tag information of an ELF file by looking up into its dynamic segment. More...
 
GElf_Addr lookup_ppc64_elf_fn_entry_point_address (Elf *elf_handle, GElf_Addr fn_desc_address)
 Lookup the address of the function entry point that corresponds to the address of a given function descriptor. More...
 
GElf_Addr maybe_adjust_et_rel_sym_addr_to_abs_addr (Elf *elf_handle, GElf_Sym *sym)
 Translate a section-relative symbol address (i.e, symbol value) into an absolute symbol address by adding the address of the section the symbol belongs to, to the address value. More...
 
template<typename T >
bool read_int_from_array_of_bytes (const uint8_t *bytes, unsigned char number_of_bytes, bool is_big_endian, T &result)
 Read N bytes and convert their value into an integer type T. More...
 
bool read_uint64_from_array_of_bytes (const uint8_t *bytes, bool is_big_endian, uint64_t &result)
 Read 8 bytes and convert their value into an uint64_t. More...
 
elf_symbol::binding stb_to_elf_symbol_binding (unsigned char stb)
 Convert an elf symbol binding (given by the ELF{32,64}_ST_BIND macros) into an elf_symbol::binding value. More...
 
elf_symbol::type stt_to_elf_symbol_type (unsigned char stt)
 Convert an elf symbol type (given by the ELF{32,64}_ST_TYPE macros) into an elf_symbol::type value. More...
 
elf_symbol::visibility stv_to_elf_symbol_visibility (unsigned char stv)
 Convert an ELF symbol visiblity given by the symbols ->st_other data member as returned by the GELF_ST_VISIBILITY macro into a elf_symbol::visiblity value. More...
 

Detailed Description

This contains the definitions of the ELF utilities for the dwarf reader.

Definition in file abg-elf-helpers.cc.

Function Documentation

◆ address_is_in_opd_section()

bool address_is_in_opd_section ( Elf *  elf_handle,
Dwarf_Addr  addr 
)

Return true if an address is in the ".opd" section that is present on the ppc64 platform.

Parameters
addrthe address to consider.
Returns
true iff addr designates a word that is in the ".opd" section.

Definition at line 1383 of file abg-elf-helpers.cc.

◆ address_is_in_section()

bool abigail::elf_helpers::address_is_in_section ( Dwarf_Addr  addr,
Elf_Scn *  section 
)

Test if a given address is in a given section.

Parameters
addrthe address to consider.
sectionthe section to consider.
Returns
true iff addr is in section section.

Definition at line 1361 of file abg-elf-helpers.cc.

◆ architecture_is_arm32()

bool architecture_is_arm32 ( Elf *  elf_handle)

Test if the architecture of the current binary is arm32.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the architecture of the current binary is arm32.

Definition at line 997 of file abg-elf-helpers.cc.

◆ architecture_is_arm64()

bool architecture_is_arm64 ( Elf *  elf_handle)

Test if the architecture of the current binary is arm64.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the architecture of the current binary is arm64.

Definition at line 1010 of file abg-elf-helpers.cc.

◆ architecture_is_big_endian()

bool architecture_is_big_endian ( Elf *  elf_handle)

Test if the endianness of the current binary is Big Endian.

https://en.wikipedia.org/wiki/Endianness.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the current binary is Big Endian.

Definition at line 1029 of file abg-elf-helpers.cc.

◆ architecture_is_ppc32()

bool architecture_is_ppc32 ( Elf *  elf_handle)

Test if the architecture of the current binary is ppc32.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the architecture of the current binary is ppc32.

Definition at line 984 of file abg-elf-helpers.cc.

◆ architecture_is_ppc64()

bool architecture_is_ppc64 ( Elf *  elf_handle)

Test if the architecture of the current binary is ppc64.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the architecture of the current binary is ppc64.

Definition at line 971 of file abg-elf-helpers.cc.

◆ e_machine_to_string()

std::string e_machine_to_string ( GElf_Half  e_machine)

Convert the value of the e_machine field of GElf_Ehdr into a string. This is to get a string representing the architecture of the elf file at hand.

Parameters
e_machinethe value of GElf_Ehdr::e_machine.
Returns
the string representation of GElf_Ehdr::e_machine.

Definition at line 122 of file abg-elf-helpers.cc.

◆ find_bss_section()

Elf_Scn * find_bss_section ( Elf *  elf_handle)

Find and return the .bss section.

Parameters
elf_handle.
Returns
the .bss section found.

Definition at line 535 of file abg-elf-helpers.cc.

◆ find_data1_section()

Elf_Scn * find_data1_section ( Elf *  elf_handle)

Find and return the .data1 section.

Parameters
elf_handlethe elf handle to use.
Returns
the .data1 section found.

Definition at line 562 of file abg-elf-helpers.cc.

◆ find_data_section()

Elf_Scn * find_data_section ( Elf *  elf_handle)

Find and return the .data section.

Parameters
elf_handlethe elf handle to use.
Returns
the .data section found.

Definition at line 553 of file abg-elf-helpers.cc.

◆ find_dynsym_section()

Elf_Scn * find_dynsym_section ( Elf *  elf_handle)

Find and return the .symtab section.

Parameters
elf_handlethe elf handle to use.
Returns
the section found, or nil if none was found

Definition at line 414 of file abg-elf-helpers.cc.

◆ find_hash_table_section_index()

hash_table_kind find_hash_table_section_index ( Elf *  elf_handle,
size_t &  ht_section_index,
size_t &  symtab_section_index 
)

Get the offset offset of the hash table section.

Parameters
elf_handlethe elf handle to use.
ht_section_offsetthis is set to the resulting offset of the hash table section. This is set iff the function returns true.
symtab_section_offsetthe offset of the section of the symbol table the hash table refers to.

Definition at line 485 of file abg-elf-helpers.cc.

◆ find_ksymtab_gpl_section()

Elf_Scn * find_ksymtab_gpl_section ( Elf *  elf_handle)

Return the __ksymtab_gpl section of a linux kernel ELF file (either a vmlinux binary or a kernel module).

Parameters
elf_handlethe elf handle to consider.
Returns
the __ksymtab section if found, nil otherwise.

Definition at line 641 of file abg-elf-helpers.cc.

◆ find_ksymtab_section()

Elf_Scn * find_ksymtab_section ( Elf *  elf_handle)

Return the __ksymtab section of a linux kernel ELF file (either a vmlinux binary or a kernel module).

Parameters
elf_handlethe elf handle to consider.
Returns
the __ksymtab section if found, nil otherwise.

Definition at line 631 of file abg-elf-helpers.cc.

◆ find_ksymtab_strings_section()

Elf_Scn * find_ksymtab_strings_section ( Elf *  elf_handle)

Find the __ksymtab_strings section of a Linux kernel binary.

Parameters
elf_handlethe elf handle to use.
Returns
the find_ksymtab_strings_section of the linux kernel binary denoted by elf_handle, or nil if such a section could not be found.

Definition at line 652 of file abg-elf-helpers.cc.

◆ find_opd_section()

Elf_Scn * find_opd_section ( Elf *  elf_handle)

Return the "Official Procedure descriptors section." This section is named .opd, and is usually present only on PPC64 ELFv1 binaries.

Parameters
elf_handlethe elf handle to consider.
Returns
the .opd section, if found. Return nil otherwise.

Definition at line 573 of file abg-elf-helpers.cc.

◆ find_relocation_section()

Elf_Scn * find_relocation_section ( Elf *  elf_handle,
Elf_Scn *  target_section 
)

Return the .rel{a,} section corresponding to a given section.

Parameters
elf_handlethe elf handle to consider.
target_sectionthe section to search the relocation section for
Returns
the .rel{a,} section if found, null otherwise.

Definition at line 667 of file abg-elf-helpers.cc.

◆ find_rodata_section()

Elf_Scn * find_rodata_section ( Elf *  elf_handle)

Find and return the .rodata section.

Parameters
elf_handle.
Returns
the .rodata section found.

Definition at line 544 of file abg-elf-helpers.cc.

◆ find_section() [1/2]

Elf_Scn * find_section ( Elf *  elf_handle,
const std::string &  name,
Elf64_Word  section_type 
)

Find and return a section by its name and its type.

Parameters
elf_handlethe elf handle to use.
namethe name of the section.
section_typethe type of the section. This is the Elf32_Shdr::sh_type (or Elf64_Shdr::sh_type) data member. Examples of values of this parameter are SHT_PROGBITS or SHT_NOBITS.
Returns
the section found, nor nil if none was found.

Definition at line 351 of file abg-elf-helpers.cc.

◆ find_section() [2/2]

Elf_Scn * find_section ( Elf *  elf_handle,
Elf64_Word  section_type 
)

Find and return a section by its type.

Parameters
elf_handlethe elf handle to use.
section_typethe type of the section. This is the Elf32_Shdr::sh_type (or Elf64_Shdr::sh_type) data member. Examples of values of this parameter are SHT_PROGBITS or SHT_NOBITS.
Returns
the section found, or nil if none was found.

Definition at line 384 of file abg-elf-helpers.cc.

◆ find_section_by_name()

Elf_Scn * find_section_by_name ( Elf *  elf_handle,
const std::string &  name 
)

Find and return a section by its name.

Parameters
elf_handlethe elf handle to use.
namethe section name.
Returns
the section found, nor nil if none was found.

Definition at line 316 of file abg-elf-helpers.cc.

◆ find_strtab_for_symtab_section()

Elf_Scn * find_strtab_for_symtab_section ( Elf *  elf_handle,
Elf_Scn *  symtab_section 
)

Return the string table used by the given symbol table.

Parameters
elf_handlethe elf handle to use.
symtab_sectionsection containing a symbol table.
Returns
the string table linked by the symtab, if it is not NULL.

Definition at line 700 of file abg-elf-helpers.cc.

◆ find_symbol_table_section()

Elf_Scn * find_symbol_table_section ( Elf *  elf_handle)

Find the symbol table.

If we are looking at a relocatable or executable file, this function will return the .symtab symbol table (of type SHT_SYMTAB). But if we are looking at a DSO it returns the .dynsym symbol table (of type SHT_DYNSYM).

Parameters
elf_handlethe elf handle to consider.
symtabthe symbol table found.
Returns
the symbol table section

Definition at line 432 of file abg-elf-helpers.cc.

◆ find_symbol_table_section_index()

bool find_symbol_table_section_index ( Elf *  elf_handle,
size_t &  symtab_index 
)

Find the index (in the section headers table) of the symbol table section.

If we are looking at a relocatable or executable file, this function will return the index for the .symtab symbol table (of type SHT_SYMTAB). But if we are looking at a DSO it returns the index for the .dynsym symbol table (of type SHT_DYNSYM).

Parameters
elf_handlethe elf handle to use.
symtab_indexthe index of the symbol_table, that was found.
Returns
true iff the symbol table section index was found.

Definition at line 464 of file abg-elf-helpers.cc.

◆ find_symtab_section()

Elf_Scn * find_symtab_section ( Elf *  elf_handle)

Find and return the .symtab section.

Parameters
elf_handlethe elf handle to use.
Returns
the section found, or nil if none was found

Definition at line 403 of file abg-elf-helpers.cc.

◆ find_text_section()

Elf_Scn * find_text_section ( Elf *  elf_handle)

Find and return the .text section.

Parameters
elf_handlethe elf handle to use.
Returns
the .text section found.

Definition at line 526 of file abg-elf-helpers.cc.

◆ get_architecture_word_size()

unsigned char get_architecture_word_size ( Elf *  elf_handle)

Return the size of a word for the current architecture.

Parameters
elf_handlethe ELF handle to consider.
Returns
the size of a word.

Definition at line 1273 of file abg-elf-helpers.cc.

◆ get_binary_load_address()

bool get_binary_load_address ( Elf *  elf_handle,
GElf_Addr &  load_address 
)

Get the address at which a given binary is loaded in memory.

Parameters
elf_handlethe elf handle for the binary to consider.
load_addressthe address where the binary is loaded. This is set by the function iff it returns true.
Returns
true if the function could get the binary load address and assign load_address to it.

Definition at line 1231 of file abg-elf-helpers.cc.

◆ get_crc_for_symbol()

bool get_crc_for_symbol ( Elf *  elf_handle,
GElf_Sym *  crc_symbol,
uint32_t &  crc_value 
)

Return the CRC from the "__crc_" symbol.

Parameters
elf_handlethe elf handle to use.
crc_symbolsymbol containing CRC value.
crc_valuethe CRC found for crc_symbol.
Returns
true iff a CRC was found for given crc_symbol.

Definition at line 927 of file abg-elf-helpers.cc.

◆ get_soname_of_elf_file()

bool get_soname_of_elf_file ( const string &  path,
string &  soname 
)

Fetch the SONAME ELF property from an ELF binary file.

Parameters
pathThe path to the elf file to consider.
sonameout parameter. Set to the SONAME property of the binary file, if it present in the ELF file.

return false if an error occured while looking for the SONAME property in the binary, true otherwise.

Definition at line 1505 of file abg-elf-helpers.cc.

◆ get_symbol_versionning_sections()

bool get_symbol_versionning_sections ( Elf *  elf_handle,
Elf_Scn *&  versym_section,
Elf_Scn *&  verdef_section,
Elf_Scn *&  verneed_section 
)

Return the SHT_GNU_versym, SHT_GNU_verdef and SHT_GNU_verneed sections that are involved in symbol versionning.

Parameters
elf_handlethe elf handle to use.
versym_sectionthe SHT_GNU_versym section found. If the section wasn't found, this is set to nil.
verdef_sectionthe SHT_GNU_verdef section found. If the section wasn't found, this is set to nil.
verneed_sectionthe SHT_GNU_verneed section found. If the section wasn't found, this is set to nil.
Returns
true iff at least one of the sections where found.

Definition at line 592 of file abg-elf-helpers.cc.

◆ get_version_definition_for_versym()

bool get_version_definition_for_versym ( Elf *  elf_handle,
GElf_Versym *  versym,
Elf_Scn *  verdef_section,
elf_symbol::version version 
)

Get the version definition (from the SHT_GNU_verdef section) of a given symbol represented by a pointer to GElf_Versym.

Parameters
elf_handethe elf handle to use.
versymthe symbol to get the version definition for.
verdef_sectionthe SHT_GNU_verdef section.
versionthe resulting version definition. This is set iff the function returns true.
Returns
true upon successful completion, false otherwise.

Definition at line 729 of file abg-elf-helpers.cc.

◆ get_version_for_symbol()

bool get_version_for_symbol ( Elf *  elf_handle,
size_t  symbol_index,
bool  get_def_version,
elf_symbol::version version 
)

Return the version for a symbol that is at a given index in its SHT_SYMTAB section.

Parameters
elf_handlethe elf handle to use.
symbol_indexthe index of the symbol to consider.
get_def_versionif this is true, it means that that we want the version for a defined symbol; in that case, the version is looked for in a section of type SHT_GNU_verdef. Otherwise, if this parameter is false, this means that we want the version for an undefined symbol; in that case, the version is the needed one for the symbol to be resolved; so the version is looked fo in a section of type SHT_GNU_verneed.
versionthe version found for symbol at symbol_index.
Returns
true iff a version was found for symbol at index symbol_index.

Definition at line 863 of file abg-elf-helpers.cc.

◆ get_version_needed_for_versym()

bool get_version_needed_for_versym ( Elf *  elf_handle,
GElf_Versym *  versym,
Elf_Scn *  verneed_section,
elf_symbol::version version 
)

Get the version needed (from the SHT_GNU_verneed section) to resolve an undefined symbol represented by a pointer to GElf_Versym.

Parameters
elf_handethe elf handle to use.
versymthe symbol to get the version definition for.
verneed_sectionthe SHT_GNU_verneed section.
versionthe resulting version definition. This is set iff the function returns true.
Returns
true upon successful completion, false otherwise.

Definition at line 790 of file abg-elf-helpers.cc.

◆ is_dso()

bool is_dso ( Elf *  elf_handle)

Test if the elf file being read is a dynamic shared / object.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the elf file being read is a / dynamic shared object.

Definition at line 1306 of file abg-elf-helpers.cc.

◆ is_executable()

bool is_executable ( Elf *  elf_handle)

Test if the elf file being read is an executable.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the elf file being read is an / executable.

Definition at line 1293 of file abg-elf-helpers.cc.

◆ is_linux_kernel()

bool is_linux_kernel ( Elf *  elf_handle)

Test if the ELF binary denoted by a given ELF handle is a Linux Kernel binary (either vmlinux or a kernel module).

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the binary denoted by elf_handle is a Linux kernel binary

Definition at line 1213 of file abg-elf-helpers.cc.

◆ is_linux_kernel_module()

bool is_linux_kernel_module ( Elf *  elf_handle)

Test if the ELF binary denoted by a given ELF handle is a Linux Kernel Module.

Parameters
elf_handlethe ELF handle to consider.
Returns
true iff the binary denoted by elf_handle is a Linux kernel module.

Definition at line 1197 of file abg-elf-helpers.cc.

◆ lookup_data_tag_from_dynamic_segment()

bool lookup_data_tag_from_dynamic_segment ( Elf *  elf,
Elf64_Sxword  data_tag,
vector< string > &  dt_tag_data 
)

Get data tag information of an ELF file by looking up into its dynamic segment.

Parameters
elfthe elf handle to use for the query.
dt_tagdata tag to look for in dynamic segment
dt_tag_datavector of found information for a given data_tag
Returns
true iff data tag data_tag was found

Definition at line 1403 of file abg-elf-helpers.cc.

◆ lookup_ppc64_elf_fn_entry_point_address()

GElf_Addr lookup_ppc64_elf_fn_entry_point_address ( Elf *  elf_handle,
GElf_Addr  fn_desc_address 
)

Lookup the address of the function entry point that corresponds to the address of a given function descriptor.

On PPC64, a function pointer is the address of a function descriptor. Function descriptors are located in the .opd section. Each function descriptor is a triplet of three addresses, each one on 64 bits. Among those three address only the first one is of any interest to us: the address of the entry point of the function.

This function returns the address of the entry point of the function whose descriptor's address is given.

http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#FUNC-DES

https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/deeply_understand_64_bit_powerpc_elf_abi_function_descriptors?lang=en

Parameters
fn_desc_addressthe address of the function descriptor to consider.
Returns
the address of the entry point of the function whose descriptor has the address fn_desc_address. If there is no .opd section (e.g because we are not on ppc64) or more generally if the function descriptor could not be found then this function just returns the address of the fuction descriptor.

Definition at line 1148 of file abg-elf-helpers.cc.

◆ maybe_adjust_et_rel_sym_addr_to_abs_addr()

GElf_Addr maybe_adjust_et_rel_sym_addr_to_abs_addr ( Elf *  elf_handle,
GElf_Sym *  sym 
)

Translate a section-relative symbol address (i.e, symbol value) into an absolute symbol address by adding the address of the section the symbol belongs to, to the address value.

This is useful when looking at symbol values coming from relocatable files (of ET_REL kind). If the binary is not ET_REL, then the function does nothing and returns the input address unchanged.

Parameters
elf_handlethe elf handle for the binary to consider.
symthe symbol whose address to possibly needs to be translated.
Returns
the section-relative address, translated into an absolute address, if sym is from an ET_REL binary. Otherwise, return the address of sym, unchanged.

Definition at line 1331 of file abg-elf-helpers.cc.

◆ read_int_from_array_of_bytes()

bool abigail::elf_helpers::read_int_from_array_of_bytes ( const uint8_t *  bytes,
unsigned char  number_of_bytes,
bool  is_big_endian,
T &  result 
)

Read N bytes and convert their value into an integer type T.

Note that N cannot be bigger than 8 for now. The type passed needs to be at least of the size of number_of_bytes.

Parameters
bytesthe array of bytes to read the next 8 bytes from. Note that this array must be at least 8 bytes long.
number_of_bytesthe number of bytes to read. This number cannot be bigger than 8.
is_big_endianif true, read the 8 bytes in Big Endian mode, otherwise, read them in Little Endian.
resultwhere to store the resuting integer that was read.
trueif the 8 bytes could be read, false otherwise.

Definition at line 1062 of file abg-elf-helpers.cc.

◆ read_uint64_from_array_of_bytes()

bool abigail::elf_helpers::read_uint64_from_array_of_bytes ( const uint8_t *  bytes,
bool  is_big_endian,
uint64_t &  result 
)

Read 8 bytes and convert their value into an uint64_t.

Parameters
bytesthe array of bytes to read the next 8 bytes from. Note that this array must be at least 8 bytes long.
resultwhere to store the resuting uint64_t that was read.
is_big_endianif true, read the 8 bytes in Big Endian mode, otherwise, read them in Little Endian.
trueif the 8 bytes could be read, false otherwise.

Definition at line 1114 of file abg-elf-helpers.cc.

◆ stb_to_elf_symbol_binding()

elf_symbol::binding stb_to_elf_symbol_binding ( unsigned char  stb)

Convert an elf symbol binding (given by the ELF{32,64}_ST_BIND macros) into an elf_symbol::binding value.

Note that this function aborts when given an unexpected value.

Parameters
thesymbol binding value to convert.
Returns
the converted value.

Definition at line 71 of file abg-elf-helpers.cc.

◆ stt_to_elf_symbol_type()

elf_symbol::type stt_to_elf_symbol_type ( unsigned char  stt)

Convert an elf symbol type (given by the ELF{32,64}_ST_TYPE macros) into an elf_symbol::type value.

Note that this function aborts when given an unexpected value.

Parameters
thesymbol type value to convert.
Returns
the converted value.

Definition at line 35 of file abg-elf-helpers.cc.

◆ stv_to_elf_symbol_visibility()

elf_symbol::visibility stv_to_elf_symbol_visibility ( unsigned char  stv)

Convert an ELF symbol visiblity given by the symbols ->st_other data member as returned by the GELF_ST_VISIBILITY macro into a elf_symbol::visiblity value.

Parameters
stvthe value of the ->st_other data member of the ELF symbol.
Returns
the converted elf_symbol::visiblity value.

Definition at line 97 of file abg-elf-helpers.cc.