1

デモシーン コンテスト用の最小サイズの実行可能ファイルを作成しようとしています。自分でリンクすることで、実行可能ファイルのサイズを最小限に抑えようとしています。

これは、 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です。

4

1 に答える 1

1

TL;DR: 患者: "先生、${THAT} をすると痛いです" – 医者: "それなら ${THAT} はしないでください".

そこに C ランタイムを入れたくない場合は、C ランタイムが利用可能であり、さらに重要なことに初期化されていることに依存するコードを使用しないようにする必要があります。SDL は libc の機能に強く依存しているため ( -lcSDL を適切にリンクできるように追加したのはおそらくそのためです)、リンクするときはすべての libc が必要です。ただし、libc が適切に機能するには、初期化する必要があります_start()

実行可能ファイルのサイズを小さくしたい場合は、(肥大化した GNU) libc を取り除くことも必要です。自分で多くのことを行うか、使用するライブラリにパッチを適用して、必要なものに依存しないようにする必要があります。削除する。

于 2015-03-15T16:23:37.430 に答える