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 からコンパイルしています (特別なものはありません)。