#include <elfio/elfio.hpp>
using namespace ELFIO;
int main( void )
{
elfio writer;
writer.create( ELFCLASS64, ELFDATA2LSB );
writer.set_os_abi( ELFOSABI_LINUX );
writer.set_type( ET_EXEC );
writer.set_machine( EM_X86_64 );
segment* load_seg = writer.segments.add();
load_seg->set_type( PT_LOAD );
load_seg->set_virtual_address( 0x400000 );
load_seg->set_physical_address( 0x400000 );
load_seg->set_flags( PF_R );
load_seg->set_align( 0x200000 );
segment* note_seg = writer.segments.add();
note_seg->set_type( PT_NOTE );
note_seg->set_virtual_address( 0x4000b0 );
note_seg->set_physical_address( 0x4000b0 );
note_seg->set_flags( PF_R );
note_seg->set_align( 0x4 );
section* dummy_note_sec = writer.sections.add( ".note.dummy" );
dummy_note_sec->set_type( SHT_NOTE );
dummy_note_sec->set_addr_align( 0x4 );
dummy_note_sec->set_flags( SHF_ALLOC );
note_section_accessor dummy_note_writer( writer, dummy_note_sec );
unsigned char dummy_desc[8] = { 0xfe, 0xca, 0xfe, 0xca, 0x00, 0x00 };
dummy_note_writer.add_note( 0x01, "dummy", dummy_desc, sizeof( dummy_desc ) );
note_seg->add_section_index( dummy_note_sec->get_index(),
dummy_note_sec->get_addr_align() );
section* xen_note_sec = writer.sections.add( ".note.Xen" );
xen_note_sec->set_type( SHT_NOTE );
xen_note_sec->set_addr_align( 0x4 );
xen_note_sec->set_flags( SHF_ALLOC );
note_section_accessor xen_note_writer( writer, xen_note_sec );
unsigned char xen_descr[8] = { 0x1f, 0xfe, 0xe1, 0x01 };
xen_note_writer.add_note( 0x12, "Xen", xen_descr, sizeof( xen_descr ) );
note_seg->add_section_index( xen_note_sec->get_index(),
xen_note_sec->get_addr_align() );
section* gnu_note_sec = writer.sections.add( ".note.gnu.build-id" );
gnu_note_sec->set_type( SHT_NOTE );
gnu_note_sec->set_addr_align( 0x4 );
gnu_note_sec->set_flags( SHF_ALLOC );
note_section_accessor gnu_note_writer( writer, gnu_note_sec );
unsigned char gnu_descr[20] = { 0x28, 0xcc, 0x3d, 0x3d, 0x89, 0xe5, 0xbf,
0xc6, 0x07, 0xa8, 0xce, 0xe3, 0x29, 0xcc,
0x70, 0xd0, 0xbf, 0x34, 0x69, 0x2b };
gnu_note_writer.add_note( 0x03, "GNU", gnu_descr, sizeof( gnu_descr ) );
note_seg->add_section_index( gnu_note_sec->get_index(),
gnu_note_sec->get_addr_align() );
writer.set_entry( 0x400108 );
writer.save( "test_elfnote.bin" );
return 0;
}