title: execute binary machine code from C
body: <p>following <a href="http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html" rel="noreferrer">this</a> instructions I have managed to produce only 528 bytes in size a.out (when gcc main.c gave me 8539 bytes big file initially).</p>
  
  <p>main.c was:</p>
  
  <pre><code>int main(int argc, char** argv) {
  
      return 42;
  }
  </code></pre>
  
  <p>but I have built a.out from this assembly file instead:</p>
  
  <p>main.s:</p>
  
  <pre><code>; tiny.asm
    BITS 64
    GLOBAL _start
    SECTION .text
    _start:
                  mov     eax, 1
                  mov     ebx, 42  
                  int     0x80
  </code></pre>
  
  <p>with:</p>
  
  <pre><code>me@comp# nasm -f elf64 tiny.s
  me@comp# gcc -Wall -s -nostartfiles -nostdlib tiny.o
  me@comp# ./a.out ; echo $?
  42
  me@comp# wc -c a.out
  528 a.out
  </code></pre>
  
  <p>because I need machine code I do:</p>
  
  <pre><code>objdump -d a.out
  
  a.out:     file format elf64-x86-64
  
  
  Disassembly of section .text:
  
  00000000004000e0 &lt;.text&gt;:
    4000e0:   b8 01 00 00 00          mov    $0x1,%eax
    4000e5:   bb 2a 00 00 00          mov    $0x2a,%ebx
    4000ea:   cd 80                   int    $0x80
  
  &gt;# objdump -hrt a.out
  
  a.out:     file format elf64-x86-64
  
  Sections:
  Idx Name          Size      VMA               LMA               File off  Algn
   0 .note.gnu.build-id 00000024  00000000004000b0  00000000004000b0  000000b0 2**2
                    CONTENTS, ALLOC, LOAD, READONLY, DATA
   1 .text         0000000c  00000000004000e0  00000000004000e0  000000e0 2**4
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
  SYMBOL TABLE:
  no symbols
  </code></pre>
  
  <p>file is in little endian convention:</p>
  
  <pre><code>me@comp# readelf -a a.out
  ELF Header:
    Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:                             ELF64
    Data:                              2's complement, little endian
    Version:                           1 (current)
    OS/ABI:                            UNIX - System V
    ABI Version:                       0
    Type:                              EXEC (Executable file)
    Machine:                           Advanced Micro Devices X86-64
    Version:                           0x1
    Entry point address:               0x4000e0
    Start of program headers:          64 (bytes into file)
    Start of section headers:          272 (bytes into file)
    Flags:                             0x0
    Size of this header:               64 (bytes)
    Size of program headers:           56 (bytes)
    Number of program headers:         2
    Size of section headers:           64 (bytes)
    Number of section headers:         4
    Section header string table index: 3
  </code></pre>
  
  <p>now I want to execute this like this:</p>
  
  <pre><code>#include &lt;unistd.h&gt;
   // which version is (more) correct?
   // this might be related to endiannes (???)
  char code[] = "\x01\xb8\x00\x00\xbb\x00\x00\x2a\x00\x00\x80\xcd\x00";
  char code_v1[] = "\xb8\x01\x00\x00\x00\xbb\x2a\x00\x00\x00\xcd\x80\x00";
  
  int main(int argc, char **argv)
  {
  /*creating a function pointer*/
  int (*func)();
  func = (int (*)()) code;
  (int)(*func)();
  
  return 0;
  }
  </code></pre>
  
  <p>however I get segmentation fault. <strong>My question is: is this section of text</strong></p>
  
  <pre><code>  4000e0:   b8 01 00 00 00          mov    $0x1,%eax
    4000e5:   bb 2a 00 00 00          mov    $0x2a,%ebx
    4000ea:   cd 80                   int    $0x80
  </code></pre>
  
  <p><strong>(this machine code) all I really need?</strong> What I do wrong (endiannes??), maybe I just need to call this in different way since SIGSEGV?</p>