Compiler mit kleinsten Executables
-
Disassembliert siehts so aus:
:0001.0100 B013 mov al, 13 :0001.0102 CD10 int 10 :0001.0104 C42F les bp, [bx] * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0001.010E(U) | :0001.0106 AA stosb :0001.0107 11F8 adc ax, di :0001.0109 6413066C04 adc ax, fs:[046C] :0001.010E EBF6 jmp 0106
naja... das soll mal einer durchblicken :p
So wie ich das sehe, sind da ziemlich viele Annahmen im Spiel. was ist bx beim start, worauf zeigt ds:si, was ist fs, di und ax? Naja sowas geht auch nur unter DOS.
-
achja, fs:[046C] wird wahrscheinlich auf den bildschirmspeicher zeigen. Der erste int 10 schaltet dann wohl in den grafikmodus um.
Und es ist ne ganz hübsche endlosschleife
-
Also auf Deutsch gesagt, bringt das Programm absolut nichts?
MfG SideWinder
-
Shade Of Mine schrieb:
Kleiner gehts AFAIK nicht mehr.
wenn man dem linker auch ein kleines /align gibt, darf man das /filealign auch runtersetzen.
man kann nen kleineren stub nehmen.
macht zusammen 576 bytes.#pragma comment(linker,"/FILEALIGN:16") #pragma comment(linker,"/ALIGN:16") //#pragma comment(exestr,"<< (c) Volkard Henkel >>") #pragma comment(linker,"/IGNORE:4078") #pragma comment(linker,"/IGNORE:4089") #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/MERGE:.data=.text") #pragma comment(linker,"/SECTION:.text,ERW") #pragma comment(linker,"/nodefaultlib") #pragma comment(linker,"/incremental:no") #pragma comment(linker,"/entry:crtmain") #pragma comment(linker,"/subsystem:console") //der stub ist von http://its.mine.nu/html/coding/essays/stub.html #pragma comment(linker,"/IGNORE:4060") #pragma comment(linker,"/stub:stub.exe") #pragma optimize("s",on) #include <windows.h> int __stdcall crtmain() { DWORD bytesWritten; WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),"hello, world!",13,&bytesWritten,NULL); return 0; } /* 26.02.2004 03:56 576 test1.exe 1 Datei(en) 576 Bytes */
-
(korbinian: sry! hab ausbersehen hier editiert. mach deinen beotrag bitte wieder rein)
-
*vielleicht* das symbolische linken?
-
was meinst du mit symbolischem linken?
-
sory, hab da was durcheinander gebracht und aus versehen deinen beitrag bearbeitet statt zitiert
hab das -s flag von ln mit dem -s (static) von ld verwechselt. sry
-
na super... jetz hab ich grad die datei gelöscht, weil ich gedacht hab, das steht eh noch herin. also noch ein mal. ich hab dafür noch 2 optimierungsmethoden gefunden.
void printf_mini(const char* text, unsigned int size) { asm ( "int $0x80\t\n" : : "a"(4), "b"(2), "c"(text), "d"(size) ); return; } void exit_mini(unsigned int return_code) { asm ( "int $0x80\t\n" : : "a"(1), "b"(return_code) ); return; } int main(void) { printf_mini("Hello World!\n", 13); exit_mini(0); return 0; }
gcc -Os -mregparm=2 -fomit-frame-pointer -c test.c
ld -s --entry=main -o test test.o
objcopy --remove-section .comment test
objcopy --remove-section .data test
objcopy --remove-section .bss testgcc hat version 3.2.2. verschiedene gcc versionen produzieren anderen code. hab jetz nur gcc 3.3.3 noch getestet. der braucht mehr code. vielleicht schaffen es andere versionen mit weniger code.
./test
Hello World!
test ist 380 byte groß.das -s flags heißt nicht static sondern --strip-all. dh es entfernt unnötige daten, wie symbole und so, aus dem output.
-
hast du alle libs reingelinkt (gcc --static) sonst nimmt er die .so libs
-
ich verwend keine dynamischen libs. ich verwend nicht einmal die start objects. es gibt keinen grund irgendwelche libs miteinzubeziehen.