GccでコンパイルされたCプログラムのエントリポイントを変更する方法
次のコードのように
#include<stdio.h>
int entry() //entry is the entry point instead of main
{
return 0;
}
それはリンカー設定です:
-Wl,-eentry
-Wl,...
は引数をリンカーに渡し、リンカーは-e
引数を使用してエントリー関数を設定します
ソースコードは次のように変更できます。
#include<stdio.h>
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
int entry() //entry is the entry point instead of main
{
exit(0);
}
「.interp」セクションを使用すると、プログラムで外部共有ライブラリを呼び出すことができます。出口呼び出しは、リターンではなくプログラムを終了するための入り口関数を作成します。
次に、実行可能な共有ライブラリとしてプログラムをビルドします。
$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main
GNU Binutils (Linuxなど)を提供するシステムを使用している場合は、objcopy
コマンドを使用して、任意の関数を新しいエントリポイントにすることができます。
entry
関数を含むprogram.c
というファイルがあるとします。
$ cat > program.c
#include <stdio.h>
int entry()
{
return 0;
}
^D
最初に-c
を使用してコンパイルし、再配置可能なオブジェクトファイルを生成します。
$ gcc -c program.c -o program.o
次に、entry
をmain
に再定義します。
$ objcopy --redefine-sym entry=main program.o
ここで、gccを使用して新しいオブジェクトファイルをコンパイルします。
$ gcc program.o -o program
注:プログラムにmain
という関数がすでにある場合は、ステップ2の前に、別のobjcopy
を実行できます。呼び出し:
objcopy --redefine-sym oldmain=main program.o