デモシーン コンテスト用の最小サイズの実行可能ファイルを作成しようとしています。自分でリンクすることで、実行可能ファイルのサイズを最小限に抑えようとしています。
これは、 http://www.int21.de/linux4k/から取得した私の最小限の main.c です。画面に白い三角形を描画します。
#include "SDL/SDL.h"
#include "GL/gl.h"
void _start(){
SDL_Event event;
SDL_SetVideoMode(640,480,0,SDL_OPENGL|SDL_FULLSCREEN);
SDL_ShowCursor(SDL_DISABLE);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.33,1.33,-1,1,1.5,100);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_TRIANGLES);
glVertex3i(1,1,-10);
glVertex3i(1,-1,-10);
glVertex3i(-1,1,-10);
glEnd();
SDL_GL_SwapBuffers();
do{
SDL_PollEvent(&event);
} while (event.type!=SDL_KEYDOWN);
SDL_Quit();
}
C ランタイムを使用したくないため、void _start()
代わりにを使用しています。int main()
これが私のビルドコマンドです(私のマシンはUbuntu Linuxを実行しています):
gcc -c main.c
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -lSDL -lGL main.o -o main
SDL_SetVideoMode でプログラムがクラッシュします。gdb レポート:
Program received signal SIGSEGV, Segmentation fault.
_dl_map_object_from_fd (name=0x7ffff77dfcec "libXrender.so.1", fd=-1, fbp=0x7fffffffd908,
realname=0x601de0 "/usr/lib/x86_64-linux-gnu/libXrender.so.1", loader=<optimized out>, l_type=<optimized out>,
mode=-1879048190, stack_endp=0x7fffffffdc68, nsid=0) at dl-load.c:1574
なにが問題ですか?に変更void _start()
しint main()
、全体を でコンパイルするとgcc main.c -o main -lSDL -lGL
、問題なく動作します。で実行可能ファイルを調べると、この動作中のバージョンと自己リンクされた壊れたバージョンには、リンクされたライブラリのリストがまったく同じldd
です。