2016-12-01 30 views
0

ELFファイルのグローバル構造を変更したいと思います。 まず、グローバル変数が構造体であるかどうかを知りたいですか? しかし、私が知る唯一の情報は、変数の名前とサイズです。ELFファイルで変数の型を見つける方法は?

+2

タイプの詳細はデバッグ情報にのみ格納されます。プログラムが他の方法で実行されているときは情報は必要ありません。あなたが何をしているのかは間違っているようです - 失敗が予想されます。構造体を使用するコードは、ソースのコンパイル時に使用された構造体の形状/サイズに密接に関連しています。これを変更すると、プログラムが誤動作します。 –

+2

ELFファイルには「変数」や「タイプ」はありません。これらはソースコードの概念です。 ELFファイルには、単にデータの先頭を指すバルクデータとシンボルがあります。あなたが好きなら、すべてのelfファイルは 'char []'と 'void *'です。 –

+0

なぜあなたは尋ねていますか?あなたの質問は不明です(ELF定義がその構造を定義していることを確認してください)、[XY問題](http://xyproblem.info)になる可能性があります。だから、**あなたの質問を編集して**動機づけて、もっと説明してください。 –

答えて

5

あなたはそれを見つけることができません。 ELF形式のタイプ情報は非常に限定されています(一部のグローバル変数がstructまたはintであるかどうかはわかりませんが、変数はほとんどがsizeofです)。 elf(5)を参照してください。

ただし、デバッグサポート(例:g++ -Wall -g)のためにプログラム(および使用しているライブラリ)をコンパイルする場合。 ELFファイルには、多くの場合、DWARF形式を使用する追加のデバッグセクションが含まれています。これらの情報は、stripコマンドを使用してELFファイルから削除できます。だからstrip(1) & readelf(1) & objdump(1)を参照してください。

実際にはsource codeを使用します。したがって、プログラムのソースを入手してください(Linuxは主にfree softwareで作られているので、これは一般的に可能です)。そしてそれを再コンパイルします(もちろん、プログラムのソースコードを調べてください)。コンパイラをカスタマイズするには(たとえば、独自のGCCプラグインを作成するか、GCC MELTを使用するか、Clangコンパイラをカスタマイズするなど)、コードを再コンパイルするために使用したいと思うかもしれません(そして、すべてのグローバル変数宣言)。

関連する問題