2009-10-30 Linux assembler SDL
Open SDL window from asm. I tryed to open SDL window from asm. And that worked. Hardest thing is defining all structures from SDL headers. Windows opening and waiting while anykey will pressed.
include 'cdecl.inc' format ELF extrn SDL_Init extrn SDL_SetVideoMode extrn SDL_PollEvent extrn SDL_Quit ;video settings SDL_INIT_VIDEO equ 0x00000020 SDL_FULLSCREEN equ 0x80000000 ;event settings SDL_KEYDOWN equ 2 SDL_MOUSEBUTTONDOWN equ 5 ;programm settings SCREEN_WIDTH equ 800 SCREEN_HEIGHT equ 600 SCREEN_BPP equ 24 struc SDL_keysym { .scancode db 0 .sym dd 0 .mod dd 0 .unicode dd 0 } struc SDL_KeyboardEvent { .type db 0 .which db 0 .state db 0 .keysym SDL_keysym } struc SDL_Event { .type db 0 union SDL_KeyboardEvent .empty db 0,0,0 } section '.text' executable public _start _start: ccall SDL_Init,SDL_INIT_VIDEO ccall SDL_SetVideoMode, SCREEN_WIDTH , SCREEN_HEIGHT , SCREEN_BPP , SDL_FULLSCREEN ;try to make while loop while_run: while_polleEvent: ccall SDL_PollEvent, event cmp eax, 0 je while_polleEventquit cmp byte [event.type], SDL_KEYDOWN jne while_polleEvent mov byte [run], 0 jmp while_polleEvent while_polleEventquit: ; if run != 1 quit cmp byte [run], 1 je while_run ccall SDL_Quit, 0 mov eax, 1 xor ebx, ebx int 80h section '.data' writeable event SDL_Event run db 1
Compile with lines:
fasm sdl.asm sdl.o
ld -dynamic-linker /lib/ld-linux.so.2 sdl.o /usr/lib/libSDL.so -o sdl
Dowload Source
2009-10-24 Making C executables smaller
There are some simple things that can be done to make C executables as small as possible.
Here is some example code we will work with:
Compile: gcc main.c -o main -lSDL
#include <SDL/SDL.h> char quit = 0; int main() { SDL_Surface *screen,surface; SDL_Event e; SDL_Init( SDL_INIT_VIDEO ); screen = SDL_SetVideoMode( 400, 400, 32, SDL_SWSURFACE ); while(!quit) while(SDL_PollEvent(&e)>0) { if(e.type==SDL_MOUSEBUTTONDOWN) quit=1; if(e.type==SDL_KEYDOWN) quit=1; } SDL_Quit(); }
Compile: gcc main.c -o main -lSDL
Size before: 5326 bytes
Execute command: strip main
strip is included in most unix systems. It deletes some info symbols from executables
strip is included in most unix systems. It deletes some info symbols from executables
Size after: 3532 bytes
You can also try sstrip which is advanced version of strip. You can download it from ELF kickers webpage.
Execute command: sstrip main
Size after: 1960 bytes
There are some others way to decrease size of programm.
GC Masher Allows to bruteforce gcc options for smaller executable size.
I where using this options for gcsmaher
-O -O0 -O1 -O2 -O3 -Os -ffast-math -fomit-frame-pointer -fauto-inc-dec -mpush-args -mno-red-zone -mstackrealign
After runnig with this options executble size is 5175 bytes and best compiling options are all posible combination.
Combining with sstrip gives 1960 bytes.
And there size where not reduced but some time there can be saved some bytes.
Now we will change main function with
void _start()
and return change to
asm ( \ "movl $1,%eax\n" \ "xor %ebx,%ebx\n" \ "int $128\n" \ );
One other thing is to archive your executable and cat it with unpack shell script.
a=/tmp/I;tail -n+2 $0|zcat>$a;chmod +x $a;$a;rm $a;exit
Best options and smallest size now is 563 byte. Nope this is not smallest size try to
rename executable name to one symbol and you will get 4 extra bytes.
gcc -Os -ffast-math -fomit-frame-pointer -fauto-inc-dec -mpush-args -mno-red-zone -c small.c; ld -dynamic-linker /lib/ld-linux.so.2 small.o /usr/lib/libSDL.so -o small; strip -s -R .comment -R .gnu.version small;sstrip small; 7z a -tGZip -mx=9 small.gz small > /dev/null; cat unpack.header small.gz > small; chmod a+x small;rm small.gz small.o
Download Source
Author in link has 634 bytes. With his options I have 622 bytes and using gcmasher i have 606 bytes. I have used his source in this compare.
2009-10-08 Basic HTTP server
Basic HTTP server. When you type url it shows listing of your local directory. If you tipe with path to file name noting hapens
Use:
http://*.*.*.*:
http://*.*.*.*:
Run:
./server port
Compile:
gcc server.c -o server
C Source
Here is also python source. It runs on port:8081 and prints in terminal HTTP request. You can see what browser sends to server.
Py Source