我刚刚了解了
4k demo scene contest.它包括创建一个4KB可执行文件,呈现出一个不错的3D场景.引用的演示是为Windows构建的,所以我想知道如何在Linux上创建4KB OpenGL场景.
一个裸露的“你好世界”已经消耗了8KB:
$cat ex.c #include <stdio.h> int main() { printf("Hello world\n"); } $gcc -Os ex.c -o ex $ls -l ex -rwxrwxr-x 1 cklein cklein 8374 2012-05-11 13:56 ex
解决方法
使用标准设置不能制作小工具的主要原因是将许多符号和标准库的引用插入到二进制文件中.你必须明确删除即使是基本的东西.
这是我如何做到的:
http://phresnel.org/gpl/4k/ntropy2k7/
相关选项:
主要是自我解释:
gcc main.c -o fourk0001 -Os -mfpmath=387 \ -mfancy-math-387 -fmerge-all-constants -fsingle-precision-constant \ -fno-math-errno -Wall -ldl -ffast-math -nostartfiles -nostdlib \ -fno-unroll-loops -fshort-double
按摩:
条可帮助您摆脱嵌入二进制文件中的不必要符号:
strip -R .note -R .comment -R .eh_frame -R .eh_frame_hdr -s fourk0001
码:
你可能需要调整和尝试和错误很多.有时,一个循环给出较小的代码,有时是一个调用,有时是一个内联函数.在我的代码中,例如,而不是有一个干净的链表,包含所有的花式多态的风格的火焰变换,我有一个固定的数组,其中每个元素是一个大实体,包含所有参数,使用或未使用,作为所有火焰的联合每个Scott Draves火焰纸.
你的技巧不会是便携式的,其他版本的g可能会给出次优的结果.
请注意,使用上述参数,您不要写一个main()函数,而是一个_start()函数.
还要注意,使用库有点不同.而不是将SDL和标准库函数链接在一起,便捷的方式,您必须手动进行.例如.
void *libSDL = dlopen( "libSDL.so",RTLD_LAZY ); void *libC = dlopen( "libc.so",RTLD_LAZY ); #if 1 SDL_SetVideoMode_t sym_SDL_SetVideoMode = dlsym(libSDL,"SDL_SetVideoMode"); g_sdlbuff = sym_SDL_SetVideoMode(WIDTH,HEIGHT,32,SDL_HWSURFACE|SDL_DOUBLEBUF); #else ((SDL_SetVideoMode_t)dlsym(libSDL,"SDL_SetVideoMode"))(WIDTH,SDL_HWSURFACE|SDL_DOUBLEBUF); #endif //> need malloc,probably kinda craft (we only use it once :| ) //> load some sdl cruft (cruft!) malloc_t sym_malloc = dlsym( libC,"malloc" ); sym_rand = dlsym( libC,"rand" ); sym_srand = dlsym( libC,"srand" ); sym_SDL_Flip = dlsym(libSDL,"SDL_Flip"); sym_SDL_LockSurface = dlsym(libSDL,"SDL_LockSurface"); sym_SDL_UnlockSurface = dlsym(libSDL,"SDL_UnlockSurface"); sym_SDL_MapRGB = dlsym(libSDL,"SDL_MapRGB");
即使没有汇编器受到损害,您的代码可能会产生UB.
编辑:
哎呀,我骗了大会.
void _start() { ... asm( "int $0x80" :: "a"(1),"b"(42) ); }
这将使您的程序返回42.