一个裸露的“你好世界”已经消耗了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 x80" :: "a"(1),"b"(42) );}
这将使您的程序返回42.
总结以上是内存溢出为你收集整理的如何创建渲染3D场景的4KB Linux二进制文件?全部内容,希望文章能够帮你解决如何创建渲染3D场景的4KB Linux二进制文件?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)