ELFIO/examples/writer/writer.cpp

87 lines
2.9 KiB
C++
Raw Normal View History

2012-11-27 09:45:28 +00:00
#include <elfio/elfio.hpp>
using namespace ELFIO;
int main( void )
{
elfio writer;
2012-11-27 09:45:28 +00:00
// You can't proceed without this function call!
writer.create( ELFCLASS64, ELFDATA2LSB );
2012-11-27 09:45:28 +00:00
writer.set_os_abi( ELFOSABI_LINUX );
writer.set_type( ET_EXEC );
writer.set_machine( EM_X86_64 );
2012-11-27 09:45:28 +00:00
// Create code section
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 );
2012-11-27 09:45:28 +00:00
// Add data into it
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
};
2012-11-27 09:45:28 +00:00
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 );
2012-11-27 09:45:28 +00:00
// Add code section into program segment
text_seg->add_section_index( text_sec->get_index(),
text_sec->get_addr_align() );
2012-11-27 09:45:28 +00:00
// Create data section
2012-11-27 09:45:28 +00:00
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' };
2012-11-27 09:45:28 +00:00
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
data_seg->add_section_index( data_sec->get_index(),
data_sec->get_addr_align() );
2012-11-27 09:45:28 +00:00
// Add optional signature for the file producer
2012-11-27 09:45:28 +00:00
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 };
2012-11-27 09:45:28 +00:00
note_writer.add_note( 0x01, "Never easier!", descr, sizeof( descr ) );
// Setup entry point
writer.set_entry( 0x08048000 );
// Create ELF file
writer.save( "hello_x86_64" );
2012-11-27 09:45:28 +00:00
return 0;
}