web-dev-qa-db-ja.com

gccでCプログラムのエントリポイントを変更する方法

GccでコンパイルされたCプログラムのエントリポイントを変更する方法
次のコードのように

#include<stdio.h>
int entry()  //entry is the entry point instead of main
 {
   return 0;
 }
28
asitm9

それはリンカー設定です:

-Wl,-eentry

-Wl,...は引数をリンカーに渡し、リンカーは-e引数を使用してエントリー関数を設定します

32
Foo Bah

ソースコードは次のように変更できます。

#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
8
Sam Liao

GNU Binutils (Linuxなど)を提供するシステムを使用している場合は、objcopyコマンドを使用して、任意の関数を新しいエントリポイントにすることができます。

entry関数を含むprogram.cというファイルがあるとします。

$ cat > program.c
#include <stdio.h>
int entry()
{
    return 0;
}
^D
  1. 最初に-cを使用してコンパイルし、再配置可能なオブジェクトファイルを生成します。

    $ gcc -c program.c -o program.o
    
  2. 次に、entrymainに再定義します。

    $ objcopy --redefine-sym entry=main program.o
    
  3. ここで、gccを使用して新しいオブジェクトファイルをコンパイルします。

    $ gcc program.o -o program
    

注:プログラムにmainという関数がすでにある場合は、ステップ2の前に、別のobjcopyを実行できます。呼び出し:

objcopy --redefine-sym oldmain=main program.o
6
Rudy Matela