diff --git a/doc/elfio.docx b/doc/elfio.docx index e2ecf63..8a2b473 100644 Binary files a/doc/elfio.docx and b/doc/elfio.docx differ diff --git a/doc/elfio_converted_pdf.docx b/doc/elfio_converted_pdf.docx new file mode 100644 index 0000000..cd7ce0d Binary files /dev/null and b/doc/elfio_converted_pdf.docx differ diff --git a/examples/Writer/Write.cpp b/examples/Writer/Write.cpp index a4de555..dc627aa 100644 --- a/examples/Writer/Write.cpp +++ b/examples/Writer/Write.cpp @@ -1,53 +1,82 @@ -#include <ELFIO.h> +#include <elfio.hpp> + +using namespace ELFIO; int main( void ) { - IELFO* pELFO; - ELFIO::GetInstance()->CreateELFO( &pELFO ); - + elfio writer; + // You can't proceed without this function call! - pELFO->SetAttr( ELFCLASS32, ELFDATA2LSB, EV_CURRENT, - ET_EXEC, EM_386, EV_CURRENT, 0 ); + writer.create( ELFCLASS32, ELFDATA2LSB ); - // Create a loadable segment - IELFOSegment* pSegment = pELFO->AddSegment( PT_LOAD, - 0x08040000, - 0x08040000, - PF_X | PF_R, - 0x1000 ); + writer.set_os_abi( ELFOSABI_LINUX ); + writer.set_type( ET_EXEC ); + writer.set_machine( EM_386 ); // Create code section - IELFOSection* pTextSec = pELFO->AddSection( ".text", - SHT_PROGBITS, - SHF_ALLOC | SHF_EXECINSTR, - 0, - 0x10, - 0 ); + section* text_sec = writer.sections.add( ".text" ); + text_sec->set_type( SHT_PROGBITS ); + text_sec->set_flags( SHF_ALLOC | SHF_EXECINSTR ); + text_sec->set_addr_align( 0x10 ); + // Add data into it - char text[] = { '\xB8', '\x04', '\x00', '\x00', '\x00', // mov eax, 4 - '\xBB', '\x01', '\x00', '\x00', '\x00', // mov ebx, 1 - '\xB9', '\xFD', '\x00', '\x04', '\x08', // mov ecx, msg - '\xBA', '\x0E', '\x00', '\x00', '\x00', // mov edx, 14 - '\xCD', '\x80', // int 0x80 - '\xB8', '\x01', '\x00', '\x00', '\x00', // mov eax, 1 - '\xCD', '\x80', // int 0x80 - '\x48', '\x65', '\x6C', '\x6C', '\x6F', // msg: db 'Hello, World!', 10 + char text[] = { '\xB8', '\x04', '\x00', '\x00', '\x00', // mov eax, 4 + '\xBB', '\x01', '\x00', '\x00', '\x00', // mov ebx, 1 + '\xB9', '\x20', '\x80', '\x04', '\x08', // mov ecx, msg + '\xBA', '\x0E', '\x00', '\x00', '\x00', // mov edx, 14 + '\xCD', '\x80', // int 0x80 + '\xB8', '\x01', '\x00', '\x00', '\x00', // mov eax, 1 + '\xCD', '\x80' // int 0x80 + }; + text_sec->set_data( text, sizeof( text ) ); + + // Create a loadable segment + segment* text_seg = writer.segments.add(); + text_seg->set_type( PT_LOAD ); + text_seg->set_virtual_address( 0x08048000 ); + text_seg->set_physical_address( 0x08048000 ); + text_seg->set_flags( PF_X | PF_R ); + text_seg->set_align( 0x1000 ); + + // Add code section into program segment + text_seg->add_section_index( text_sec->get_index(), text_sec->get_addr_align() ); + + // Create data section* + section* data_sec = writer.sections.add( ".data" ); + data_sec->set_type( SHT_PROGBITS ); + data_sec->set_flags( SHF_ALLOC | SHF_WRITE ); + data_sec->set_addr_align( 0x4 ); + + char data[] = { '\x48', '\x65', '\x6C', '\x6C', '\x6F', // msg: db 'Hello, World!', 10 '\x2C', '\x20', '\x57', '\x6F', '\x72', '\x6C', '\x64', '\x21', '\x0A' }; - pTextSec->SetData( text, sizeof( text ) ); + data_sec->set_data( data, sizeof( data ) ); + + // Create a read/write segment + segment* data_seg = writer.segments.add(); + data_seg->set_type( PT_LOAD ); + data_seg->set_virtual_address( 0x08048020 ); + data_seg->set_physical_address( 0x08048020 ); + data_seg->set_flags( PF_W | PF_R ); + data_seg->set_align( 0x10 ); // Add code section into program segment - pSegment->AddSection( pTextSec ); - pTextSec->Release(); - pSegment->Release(); + data_seg->add_section_index( data_sec->get_index(), data_sec->get_addr_align() ); + + section* note_sec = writer.sections.add( ".note" ); + note_sec->set_type( SHT_NOTE ); + note_sec->set_addr_align( 1 ); + note_section_accessor note_writer( writer, note_sec ); + note_writer.add_note( 0x01, "Created by ELFIO", 0, 0 ); + char descr[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36}; + note_writer.add_note( 0x01, "Never easier!", descr, sizeof( descr ) ); + + // Setup entry point + writer.set_entry( 0x08048000 ); - // Set program entry point - pELFO->SetEntry( 0x08040000 ); // Create ELF file - pELFO->Save( "test.elf" ); - - pELFO->Release(); + writer.save( "hello_i386_32" ); return 0; }