2012-01-04 15 views
3

IN LINUX: 可能かどうかわかりません。私は100のソースファイルと100のそれぞれの実行可能ファイルを持っています。 実行可能ファイルを指定すると、それぞれのソースファイルを特定することが可能になります。実行ファイルからソースファイル名を見つける方法は?

+0

これらの100個の実行可能ファイルのすべてが1つのソースコードファイルから得られるという事実はありますか? –

+0

いいえ、すべて100個のソースファイルからそれぞれです。 – Whoami

+2

さて、あなたはあなたの質問を大きな時間に再定式化する必要があります。 –

答えて

5

私はあなたがこれを試すことができると思います。

readelf -s a.out | grep FILE 

私は、あなたが上記のコマンドにいくつかのgrepsed魔法を追加して、ソースファイル名を取得することができると思います。

strings executable | grep '\.c' 

をしかし、ファイル名がまたは実行中にあってもなくてもよいと、彼らはよく、またはソースファイル名を表していない場合があります。ソースファイル名は、実行可能ファイルに存在している場合

+0

これは単なるヒューリスティックです(@mouvicielの 'strings'はreadelfの次に優れたものです)。実行可能ファイルを簡単に削除または変更できます。 –

3

いいえ、1つのバイナリが正確に1つのソースファイルから来ると仮定しているため、非常に偽です。

ほとんどの実際のアプリケーションは、数千のファイルで構成されていますが、数千ものファイルで構成されています。

strippedバイナリ、またはdebugging informationでコンパイルされた(さらに良い)バイナリがある場合は、ファイルに情報が残っている可能性があります(またはデバッグ情報の場合)。ソースファイルの名前ですが、一般的に、それらを自分でビルドしない限り、バイナリはありません。

1

これらの100個の実行可能ファイルのすべてが単一のソースファイルから来ており、すべてのソースファイルを持ち、それらをすべてコンパイルできることを前提とすると、あなたの質問だけが理にかなっています。

あなたができることは、各ソースファイル内に"HERE!HERE!>>>" + __FILE__のような文字列を宣言し、実行ファイルの中で "HERE!HERE!>>>"を検索し、それに続く文字列を解析するユーティリティを書くことです。 __FILE__は、コンパイルされているソースファイルのフルパス名に展開されるプリプロセッサディレクティブです。

+0

彼自身が実行ファイルをコンパイルすると、ちょっとしたデバッグ情報の追加が可能になります。 GCCオプション-g1 – datenwolf

0

、あなたがそれらを見つけることができます。あなたがプログラムが書き込まれていると仮定どんな拡張子に

変更.c

1

ヘルプのこの種のものの「馬が逃げた後に納屋のドアを閉める」親切に落ちるが、それは将来を助けるかもしれませんポスター。

これは古い問題です。 UNIXとLinuxは、Mark Rochkind(私が正しく覚えていれば)によって発明されたwhatコマンドをサポートしています。このタイプの問題を正確に処理します。 1つのソースファイル - > 1つの展開可能な(またはオブジェクトファイル)種類のものに対して100%信頼できるだけです。他にも重要な用途があります。

char unique_id[] = "@(#)identification information"; 

@(#)「が何文字列」と呼ばれ、実行可能イメージ内のソースをコンパイルすることにより、副生成物として生じません。コマンドラインからwhatを使用してください。内部コードの使用は、おそらくこのようなものは(あなたが選択したので、答えとして一つだけのファイル名を取得すると仮定し、慎重にあなたのどのような文字列):

char *foo(char *whoami, size_t len_whoami) 
{ 
    char tmp[80]={0x0}; 
    FILE *cmd; 
    sprintf(tmp, "/usr/bin/grep -F -l '%s' /path/to/*.c", unique_id); 
    cmd=popen(tmp, "r"); 
    fgets(whoami, len_whoami, cmd); 
    pclose(cmd); 
    return whoami; 
} 

同じwhat文字列でソースコードファイル名を返します。これは、あなたの実行可能ファイルから建った。言い換えれば、正確にあなたが尋ねたことは、私はあなたがwhat文字列を聞いたことがないと確信しているので、あなたの現在のコードベースには存在しません。

関連する問題