簡體   English   中英

如何創建渲染3D場景的4KB Linux二進制文件?

[英]How to create 4KB Linux binaries that render a 3D scene?

我剛剛了解了4k演示場景比賽 它包括創建一個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幫助您擺脫嵌入在二進制文件中的不需要的符號:

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,HEIGHT,32,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。

關於為Linux創建真正的Teensy ELF可執行文件的旋風教程是一篇有趣的文章,它通過逐步創建盡可能小的ELF可執行文件的過程。

我不想破壞結局,但筆者得到它下降到了不少小於4K;)

不久前回顧一下KSplice博客中的這篇文章。 它討論了沒有標准庫的鏈接。

https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM