; (hint:tabulation size is 3) ; (date-dd-mm-yyyy:03/01/2007) ; Creating a fully functional ELF file without even GNU/ld ; --------------------------------------------------------- ; ; This a pattern file which allow you to create ELF executable without ; even a linker in hands. This is useful for custom installation with ; low resource, such as old PC. Indeed, the usual way is to use GNU/ld, ; but unfortunatly, ld rely on glibc, which is very-very hugh en ; outrageously resource consuming. ; ; You can use it with nasm (the syntax used here is the one of nasm). ; A static version of nasm if very light (between 150 and 200KB). So ; with a static version of e3 (which is no more than 13KB), and ; a few text files documentations about syscalls and some other good ; stuff, you can have a real developpement environement under less ; than the quarter of an 1.44M floppy disk. ; ; Please visit http://www.les-ziboux.rasama.org/elf-without-ld.html ; for updates. In the futur, I will mirror a very small static version ; of nasm (102KB), a static version of e3, and some useful texte ; documentation. ; ; You can use this pattern in any project... it is not mandatory, but this ; would be very nice of you to put this url on top of your product sources : ; http://www.les-ziboux.rasama.org/elf-without-ld.html ; Thank you :) ; ; To use this pattern, just edit the place between the BEGIN and END mark, ; both in code and data segment. ; ; If you code only adress read-only data, then you can use the other ; "elf-simple.asm", beceause is there are only read-only datas, it is ; best to put them in code segment. ; ; Finaly you have to compile your code with "nasm -f bin [-O2] yourcode.asm" ; (the -O parameter is optional, alghtough often requited because of ; short-jumps and some stuff like that). ; This file is full of comments... you may remove them after reading ;) ; ; Comments are welcome : les-ziboux@rasama.org (fr/en) ; You wanna learn Arabic ? -> http://www.les-ziboux.rasama.org (fr) cpu 386 bits 32 org 0x08048000 ; Linux applications are loaded at this virtual address. ; === Header ================================================================ elf_header: .start db 0x7F, "ELF" ; ELF signature -- constant db 1 ; Architecture(1) -- 1 = 32 bits db 1 ; Data enconding -- 1 = LSB-First db 1 ; File version -- 1 = v1 db 0,0,0,0,0,0,0,0,0 ; 9 bytes padding -- should be zero dw 2 ; Type -- 2 = executable dw 3 ; Architecture(2) -- 3 = i386 dd 1 ; ELF Version -- 1 = ELF-v1 dd _start ; Entry point adress in memory -- virtual adress dd segments_table - $$ ; Segments table offset in file dd 0 ; Sections table offset in file -- 0 = none) dd 0 ; File's flags dw elf_header.size ; ELF Header's size dw 32 ; Segments table entries's size dw 2 ; Number of segment descriptors dw 0 ; Sections table entries's size -- 0 = none dw 0 ; Number of sections descriptor -- 0 = none dw 0 ; String table index -- 0 = none .size equ $ - .start segments_table: code_segment_descriptor: .start: dd 1 ; Type -- 1 = loadable into memory dd 0 ; Offset in file -- include ELF header and table dd $$ ; Virtual address in memory dd 0 ; Physical adress -- 0 = no physical address dd code_size ; Size in file dd code_size ; Size in memory dd 5 ; Permission flags -- 0x4 + 0x1 = read and execute dd 0x4 ; Alignment in memory (and in file) .size equ $ - .start data_segment_descriptor: .start: dd 1 ; Type -- 1 = loadable into memory dd _data - $$ ; Offset in file dd _data ; Virtual adress in memory dd 0 ; Physical adress -- 0 = no physical address dd data_size ; Size in file dd data_size ; Size in memory dd 6 ; Permission flags -- 0x4 + 0x2 = read and write dd 0x4 ; Alignment in memory (and in file) .size equ $ - .start ; === Code ================================================================== _code : _start: ; You can move the start label where-ever you want in code segment. ; ----- BEGIN of your code ----- ; Here is a sample code which simply say good bye and terminate. ; It give an example of usage of both code segment and data ; segment. Although this example does write to data segment, ; the data segment is still fully writable. Note that read-only ; datas can also reside in code segment (you should use ; the pattern "elf-simple.asm" for this purpose). ; You can put your own code between the BEGIN and END mark. ; Do not modify something else, unless you're sure about what ; you are playing with. mov eax, 4 ; function id for sys_write mov ebx, 1 ; descriptor of standard output mov ecx, message ; offset of bytes to write mov edx, message.length ; number of bytes to write int 0x80 ; syscall mov eax, 1 ; function id for sys_exit mov ebx, 0 ; return code from the program (0 mean Ok) int 0x80 ; syscall ; ----- END of your code ----- align 4 code_size equ $ - $$ ; === Data ================================================================== align 4 _data: ; ----- BEGIN of your datas ----- ; This is a simple data example. This data segment is writable. ; Note that you can put read-only data in the code segment. If you ; only have read-only data, and no writable data in you application, ; then putting them in code segmet, avoid the creation of a data ; segment, reducing a bit the size of the executable. For this ; purpose, use the other patten name "elf-simple.asm". ; You can put your own datas between the BEGIN and END mark. ; Do not modify something else, unless you're sure about what ; you are playing with. message: db "Bye, Au-revoir, Ma'a as-salama, Bisbald ... :)", 10 .length equ $ - message ; ----- END of your datas ----- align 4 data_size equ $ - _data