<HTML ><HEAD ><TITLE > IELFO - ELF File Producer Interface </TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.74b"><LINK REL="HOME" TITLE="ELFIO" HREF="index.php"><LINK REL="PREVIOUS" TITLE="ELFDump Utility" HREF="c63.htm"></HEAD ><BODY CLASS="CHAPTER" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >ELFIO: Tutorial</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="c63.htm" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" > </TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="CHAPTER" ><H1 ><A NAME="ielfo" >Chapter 3. <FONT COLOR="RED" >IELFO</FONT > - ELF File Producer Interface </A ></H1 > <P > The ELFIO library can help you build a very short ELF executable file. This chapter shows how to build an executable file that will run on x86 Linux machines and print "Hello World!" on your console. </P > <P > Just as with the reader, the first step is to get a pointer onto the ELF File Writer (Producer): <PRE CLASS="PROGRAMLISTING" > IELFO* pELFO; ELFIO::GetInstance()->CreateELFO( &pELFO );</PRE > </P > <P > Before continuing, the library must be informed about the main attributes of the executable file to be built. To do this, declare that the executable ELF file will run on a 32 bit x86 machine; has little endian encoding and uses the current version of the ELF file format: <PRE CLASS="PROGRAMLISTING" > // You can't proceed without this function call! pELFO->SetAttr( ELFCLASS32, ELFDATA2LSB, EV_CURRENT, ET_EXEC, EM_386, EV_CURRENT, 0 );</PRE > </P > <P > Some sections of an ELF executable file should reside in the program segments. To create this loadable segment call the <TT CLASS="METHODNAME" >AddSegment()</TT > function. <PRE CLASS="PROGRAMLISTING" > // Create a loadable segment IELFOSegment* pSegment = pELFO->AddSegment( PT_LOAD, 0x08040000, 0x08040000, PF_X | PF_R, 0x1000 );</PRE > </P > <P > The following segment serves as a placeholder for our code section. To create this code section call the AddSection() function: <PRE CLASS="PROGRAMLISTING" > // Create code section IELFOSection* pTextSec = pELFO->AddSection( ".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR, 0, 0x10, 0 );</PRE > </P > <P > Then, add the executable code for the section: <PRE CLASS="PROGRAMLISTING" > 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', // db 'Hello' '\x2C', '\x20', '\x57', '\x6F', '\x72', // db ', Wor' '\x6C', '\x64', '\x21', '\x0A' // db 'ld!', 10 }; pTextSec->SetData( text, sizeof( text ) );</PRE > </P > <P > Next, this code section is put into the loadable segment: <PRE CLASS="PROGRAMLISTING" > // Add code section into program segment pSegment->AddSection( pTextSec ); pTextSec->Release(); pSegment->Release();</PRE > </P > <P > Finally, define the start address of the program and create the result file: <PRE CLASS="PROGRAMLISTING" > // Set program entry point pELFO->SetEntry( 0x08040000 ); // Create ELF file pELFO->Save( "test.elf" ); pELFO->Release();</PRE > </P > <P > Please note: Call the <TT CLASS="METHODNAME" >Release()</TT > functions for each interface you have used. This will free all resources the ELFIO library has created. </P > <P > Now compile the program and run it. The result is a new ELF file called "test.elf". The size of this working executable file is only 267 bytes! Run it on your Linux machine with the following commands: <PRE CLASS="PROGRAMLISTING" > [Writer]$ ./Writer [Writer]$ chmod +x test.elf [Writer]$ ./test.elf Hello, World!</PRE > </P > <P > The full text for this program can be found in the "Writer" directory. Also, in the "Examples" directory, two other programs "WriteObj" and "WriteObj2" demonstrate the creation of ELF object files. </P > </DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="c63.htm" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.php" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" > </TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >ELFDump Utility</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" > </TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" > </TD ></TR ></TABLE ></DIV ></BODY ></HTML >