]> 2002-5-25 ELFIO User's Guide Serge Lamikhov-Center Introduction ELFIO is a C++ library for reading and generating files in ELF binary format. This library is independent and does not require any other product. It is also cross-platform - the library uses standard ANSI C++ constructions and runs on wide variety of architectures. While the library's implementation does make your work much easier: basic knowledge of the ELF binary format is required. Information about ELF format can be found widely on the web. Getting Started With ELFIO ELF File Reader The ELFIO library is a header only library. No preparatory compilation steps are required. To make your application be aware about the ELFIO classes and types declarations, just include elfio.hpp header file. All ELFIO library declarations reside in ELFIO namespace. So, this tutorial code starts from the following code: #include using namespace ELFIO; int main( int argc, char** argv ) { if ( argc != 2 ) { std::cout << "Usage: tutorial " << std::endl; return 1; } ]]> Include elfio.hpp header file The ELFIO namespace usage This chapter will explain how to work with the reader portion of the ELFIO library. The first step would be creation of the elfio class instance. The elfio constructor does not receive any parameters. After that, we initialize the instance by loading an ELF file with name passed as a parameter. Create elfio class instance Initialize the instance by loading ELF file. The function load returns true if the ELF file was found and processed successfully. It returns false otherwise. From here, ELF header properties are accessible. This makes it possible to request file parameters such as encoding, machine type, entry point, etc. To get the class and the encoding of the file use: Member function get_class() returns ELF file class. Possible values are ELFCLASS32 or ELFCLASS64. Member function get_encoding() returns ELF file format encoding. Possible values are ELFDATA2LSB and ELFDATA2MSB. Standard ELF types, flags and constants are defined in the elf_types.hpp header file. This file is included automatically into the project. For example: ELFCLASS32, ELFCLASS64 constants define a value for 32/64 bit architectures. ELFDATA2LSB and ELFDATA2MSB constants define value for little and big endian encoding. ELF binary files may consist of several sections. Each section has it's own responsibility: some contain executable code; others describe program dependencies; others symbol tables and so on. See ELF binary format documentation for a full description of each section. The following code demonstrates how to find out the amount of sections the ELF file contains. The code also presents how to access particular section properties like names and sizes: get_name() << "\t" << psec->get_size() << std::endl; // Access to section's data // const char* p = reader.sections[i]->get_data() } ]]> sections member of reader object permits to obtain number of sections the ELF file contains. It also serves for getting access to individual section by using operator[], which returns a pointer to corresponding section's interface. Similarly, segments of the ELF file can be processed: get_flags() << "\t0x" << pseg->get_virtual_address() << "\t0x" << pseg->get_file_size() << "\t0x" << pseg->get_memory_size() << std::endl; // Access to segments's data // const char* p = reader.segments[i]->get_data() } ]]> In this case, segments' attributes and data are obtained by using segments member of the reader. The full text of this example comes together with ELFIO library distribution. ELF Section Data Accessors To simplify creation and interpretation of the ELF sections' data, the ELFIO library comes with auxiliary classes - accessors. To the moment of this document writing, the following accessors are available: string_section_accessor symbol_section_accessor relocation_section_accessor note_section_accessor Definitely, it is possible to extend the library by implementing additional accessors serving particular purposes. Let's see how the accessors can be used with the previous ELF file reader example. For this example purposes, we will print out all symbols in a symbol section. get_type() == SHT_SYMTAB ) { const symbol_section_accessor symbols( reader, psec ); for ( unsigned int j = 0; j < symbols.get_symbols_num(); ++j ) { std::string name; Elf64_Addr value; Elf_Xword size; unsigned char bind; unsigned char type; Elf_Half section_index; unsigned char other; symbols.get_symbol( j, name, value, size, bind, type, section_index, other ); std::cout << j << " " << name << std::endl; } } ]]> We create symbol_section_accessor instance first. Usually, accessors receive the elfio and section* parameters for their constructors. get_symbol is used to retrieve a particular entry in the symbol table. ELFDump Utility The source code for the ELF Dumping Utility can be found in the "examples" directory; there also located more examples on how to use different ELFIO reader interfaces. ELF File Writer TODO ELFIO Library Classes Class <classname>elfio</classname> Data members The ELFIO library's main class is elfio. The class contains the following two public data members: sections and segments: &elfio_data_members_table; Member functions Here is the list of elfio public member functions. Most of the functions permit to retrieve or set ELF file properties. &elfio_members_table; Class <classname>section</classname> Class section has no public data members. Member functions Here is the list of section public member functions. These functions permit to retrieve or set ELF file section properties. §ion_members_table;