編集(更新された質問)
私は簡単なCプログラムを持っています:
// it is not important to know what the code does you may skip the code
main.c
#include <bsp.h>
unsigned int AppCtr;
unsigned char AppFlag;
int SOME_LARGE_VARIABLE;
static void AppTest (void);
void main (void)
{
AppCtr = 0;
AppFlag = 0;
AppTest();
}
static void Foo(void){
SOME_LARGE_VARIABLE=15;
}
static void AppTest (void)
{
unsigned int i;
i = 0;
while (i < 200000) {
i++;
}
BSP_Test();
SOME_LARGE_VARIABLE=3;
Foo();
}
bsp.c
extern int SOME_LARGE_VARIABLE;
extern unsigned char AppFlag;
unsigned int long My_GREAT_COUNTER;
void BSP_Test (void) {
SOME_LARGE_VARIABLE = 5;
My_GREAT_COUNTER = 4;
}
(プログラムは何も役に立ちません...私の目標は、変数名を宣言されている場所とメモリアドレスを抽出することです)
プログラムをコンパイルすると、a.out
デバッグ情報を含むelfファイルであるファイルが取得されます。
会社の誰かが5年前に.netで、このすべての情報をa.outファイルから取得するプログラムを作成しました。これはコードが返すものです:
// Name Display Name Type Size Address
この小さなプログラムでは、それはうまく機能し、他の大規模なプロジェクトでも機能します。
そのコードは2000行の長さで、いくつかのバグがあり、.NETバージョン4をサポートしていません。そのため、私はそれを再作成しようとしています。
ですから、私の質問は、この問題を解決するためにどのようなアプローチを取るべきかわからないという意味で迷子になっています。これらは私が検討してきたオプションです:
最初の画像で示したプログラムのバグのあるコードを整理し、その情報を取得するために、プログラムが何を実行し、a.outファイルをどのように解析するかを確認してください。完全に理解したら、バージョン3および4をサポートしない理由を理解してください。
私は正規表現を作成しても大丈夫なので、次のようにしてa.outファイルでパターンを探してみてください。
これまでのところ、ファイルが1つしかないパターン(main.c)を見つけることができました。ただし、ファイルが複数ある場合は、さらに複雑になります。まだ試していません。多分それはそれほど複雑ではなく、パターンを見つけることが可能になるでしょう。
Cygwinをインストールして、、、などのWindowsでLinuxコマンドを使用できるように
objdump
しnm
ますelfread
。readelf -w a.out
必要な情報が得られるなど、これらのコマンドを使用するときは、コマンドを十分に試していません。私がこのアプローチにそれほど多くの時間を費やしていない理由にはいくつかの短所があります:短所:Windowsにcygwinをインストールするのに時間がかかります。このアプリケーションをお客様に提供する場合、お客様にインストールする必要はありません。たぶん、全部をインストールすることなく、コマンドobjdumpとelfreadをインストールする方法があるでしょう。
長所:使用する適切なコマンドが見つかった場合、車輪の再発明を行わず、時間を節約できます。多分それは次のようなコマンドの結果を解析することの問題です
objdump -w a.out
ここで解析するためにa.outファイルをダウンロードする場合は、です。
概要
.outファイルでグローバル変数を取得できるようになります。各変数のタイプ(int、char、..)、変数のメモリアドレス、および変数が宣言されているファイル(main.cまたはsomeOtherFile.c)についても知りたいと思います。cygwinを使用する必要がない場合は、展開がより簡単になりますので、よろしくお願いします。この質問は多くのことを求めているので、私はそれをもっと分割しようとしました:
おそらく他の質問を削除する必要があります。冗長でごめんなさい。