3

libc (またはその他) に依存せずに実行可能ファイルを作成しようとしています。最初に私はこれをしました:

// test.c
void _start()
{
    // write(1, "hello!\n", 7);
    asm ("int $0x80"::"a"(4), "b"(1), "c"("hello!\n"), "d"(7));

    // exit(0);
    asm ("int $0x80"::"a"(1), "b"(0));
}

でコンパイルgcc -m32 -nostdlib test.c -o test:

hello

ここまでは順調ですね。後で、より「高度な」C のようなものを使用しようとしましたlong long。32 ビット プラットフォーム (私の場合) では、次のものが必要libgccです。

// test.c
void _start()
{
    volatile long long int a = 10;
    volatile long long int b = 5;
    volatile int c = a/b; // Implemented as a call to '__divdi3'
}

これは でコンパイルに失敗しundefined reference to '__divdi3'ます。実際にリンクするように言わなかったので、正しいようです。しかし、フラグを追加して-static-libgccも問題は解決しません! なんで?

libgcc に動的にリンクできないことに注意してください。以下が当てはまる必要があります。

$ ldd test
    not a dynamic executable

gcc 4.8.2 を使用して 64 ビットの Ubuntu 14.04 からコンパイルしています (特別なものはありません)。

4

1 に答える 1