2012-03-13 2 views
2

各プログラムにはmain()があり、そこからプログラムが実行されます。 main()なしでプログラムを書いて、別の機能をエントリーポイントにすることは可能ですか?もしそうなら、どうすればいいのか教えてください。私はLinuxを使用していますか?C言語でmain()以外のエントリポイントとして他の関数を作成する方法

+7

エントリポイントとして 'main'を持たないことで何を達成しようとしていますか? – eduffy

+1

@eduffyはCの本を読んでいましたが、main()は他の多くの関数と同じ機能しか持っていませんでしたので、この疑問は – Manu

+0

を参照してください。http://linuxgazette.net/issue84/hawk.html 'main()'が呼び出される前に何が起こるかを見てください。 – eduffy

答えて

5

gccでコンパイルする場合は、-e <symbol>オプションを指定すると、エントリポイントを関数symbol()に変更できます。

+1

これは、標準ライブラリがすでに実行していると仮定するスタートアップコードをバイパスするので、ひどく壊れてしまう可能性があります... –

+3

確かに、これは "main()なしで関数を記述し、私はlinuxを使っています。「どうしたらCプログラムへのエントリーポイントを変えて、ひどく壊れないようにすることができますか?」ではなく、「linux」を使っています。 –

+0

十分に公正です。あなたの答えを批判するよりも、これをしないことがOPにはもっと言いたいことです。 –

-1

プログラムをビルドする実行可能な共有ライブラリを作成するためのソリューションがあります。これは、別の機能をエントリポイントとして使用します。

コードは次のようになります。この方法の問題は、funcができないということです

$ gcc -fpic -shared -o fun.so -Wl,-e,fun fun.c 
$ ./fun.so 

を:

#include <stdio.h> 
#include <stdlib.h> 
const char __invoke_dynamic_linker[] __attribute__ ((section (".interp"))) 
    = "/lib/ld-linux.so.2"; 
void fun() 
{ 
    printf("This is fun./n"); 
    exit(0); 
} 

そして、共有ライブラリとしてあなたのプログラムを構築し、エントリポイントとしてFUNCを指定しますmain関数のように普通の引数を持っているのですが、これは主な引数を初期化するためのcライブラリがないからです。

+0

あなたの提案は、質問よりもはるかに曖昧に思えます。あなたのアドレスが名前で参照できるように、エントリ関数が動的にリンクされたライブラリになければならないと言っていますか? –

+0

@GeorgeSkoptsov動的にリンクされたライブラリである必要はありません。シンボル情報を削除する必要がない場合にのみ、プログラム自体に存在する可能性があります。また、既知の関数シンボルと引数を比較するハードコーディングが可能です。私はManuがプログラムが異なる機能を呼びたいと思うと思う。 –

関連する問題