問題タブ [readelf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
17326 参照

linker - readelf-S出力の説明

作成したMIPSシミュレーターにelfファイルをロードしようとしています。私が抱えている問題は、elfセクションのヘッダーオフセットの背後にある意味を完全に理解していないことです。セグメントダンプを実行すると、セグメント25〜31および33〜35は0x00000000で「開始」しますが、ヘッダーには、セグメントが何らかの値(例:010190)のオフセットで開始することが示されます。また、-Sセクションの冒頭で、readelfは、ヘッダーが0x107b4のメモリで開始することを示しています。しかし、-Sに見られるように、最も初期のメモリ割り当て(セグメント0が空であるため)は、実際にはオフセット010210のセグメント26にあります。誰かがここで何が起こっているのか説明できますか?このファイルすべてをメモリ配列に静的に割り当てたい。私がこれを行うのを妨げているオフセットについてのいくつかの仮定はありますか?そして、なぜreadelfは0x107b4がヘッダーの開始点であると言うのですか?

また、.initreadelfで指定された「エントリポイント」にPCを配置する前に、実行する必要がありますか?

編集:さて、実行可能ファイルの16進ダンプを実行しましたが、オフセットが実際のelfファイル(「アドレス」0〜11d48の要素を含む)の場所を参照していることがわかりました。 ..メモリアドレスの多くがアドレス0x00000000を参照しているという事実を解決するにはどうすればよいですか?もちろん、それらには異なるオフセットがありますが、それがファイル固有であることがわかったので、それはいくつかのセクションエイリアスを意味します。実際にメモリアドレス指定でオフセットを使用しますか?

セグメント25:

Readelf -S出力:

セクションヘッダー:

0 投票する
3 に答える
374 参照

gcc - gcc は、どの変数からコンパイルされたレジスターに通知しますか

obj ファイル内のバイナリ命令のレジスタがどの変数からコンパイルされているかを知る必要があります。
要するに、各命令のレジスタから変数へのマッピング

例: objdump が obj ファイルのスニペットを次のように与えるとします。

R1 が変数、たとえばvar1をソース コードから格納していることをどのように知ることができるでしょうか? R2 はvar2を格納しますか?

残念ながらreadelfのドキュメントを検索しましたが、無駄でした。
(ソースとバイナリの間の行マッピングを提供することはできますが、それ以上は役に立ちません)

次に、gcc とリンカのデバッグ オプションをいくつか探しました。いくつかの有用な情報が見つかりましたが、それでも私の問題は解決しません。
私が見つけた情報は次のとおりです。

  • オプション-fdump-rtl-vartrackはすべての変数を追跡でき、便利なようです。しかし、このオプションを使用してコンパイルすると、予想される *.vartrack ダンプ ファイルが見つかりませんでした。
  • オプション*fdump-rtl-vartrack-uidは、各変数の一意の ID (DECL_UID) を示します。しかし、使用中に次のエラーを受け取りました: cc1: エラー: 認識されないコマンド ライン オプション "-fdump-tree-uid"
  • オプションfdump-rtl-lregはローカル レジスタの割り当てをダンプしますが、reg から変数へのマッピングをどのように教えてくれるのかわかりません。

誰かが経験やアイデアを持っていますか?

皆さん、ありがとうございました!

ハッキング...

0 投票する
1 に答える
15619 参照

linux - readelfとobjdump:なぜ両方が必要なのか

作業中のプロジェクトのELFファイルレイアウトについて学ぶ必要があり、これらのツールの存在に気づきました。すべてのLinuxディストリビューションにreadelfとobjdumpの両方が含まれているのはなぜですか?これらのツールは互いに補完し合っていますか?いつ使用したいですか?

0 投票する
2 に答える
945 参照

linux - /lib32/libc.so.6に2つの「fopen」記号が含まれているのはなぜですか?

ここに私の質問があります:

  1. /lib32/libc.so.6に2つのfopenシンボルが含まれているのはなぜですか?同じターゲットファイル内の同一のシンボルは禁止されるべきですよね?

  2. readelf -sがfopenの代わりにfopen@@GLIBC_2.1とfopen@GLIBC_2.0をダンプするのはなぜですか?

ありがとう

0 投票する
1 に答える
2142 参照

elf - elf 実行可能ファイルからの構造内の要素のアドレス

デバッグ用にコンパイルされていない ELF 実行可能ファイルから構造内の要素のアドレスを取得することは可能ですか?

例、次のコードが与えられた場合:

nm と readelf の両方が変数「places」の開始アドレスを提供し、readelf も sizeof を提供します。

ただし、必要なのは、構造内の各要素のアドレスです。したがって、上から私が欲しいのは次のとおりです。

現時点で私の唯一のルートは、dwarf2 デバッグ情報を使用してコンパイルし、readelf (-wliao) を使用して .debug_info セクションをダンプし、DW_TAG_variable から型ツリーを解析して base_type のサイズを加算することです。例の読み取り:

ソースコードにアクセスせず、デバッグ情報をオフにしてこれを行う方法を見つける必要があります..

ヘルプやポインタをいただければ幸いです。

ありがとう、クリス

0 投票する
1 に答える
13894 参照

linux - nm と「readelf -s」

libtest.so という名前の共有ライブラリがあり、その中に「foo」という関数が 1 つあるとします。

ストリップを使用して libtest.so からすべてのシンボルを破棄します

だから、今私たちが使用する場合:

印刷されます:

nm: libtest.so: シンボルなし

しかし、使用する場合:

foo 関数は、その結果からまだ見ることができます:

...

10: 000005dc 5 FUNC グローバルデフォルト 12 _Z3foov

...

コマンド文字列を使用して確認することもできます。

...

_Z3foov

...

ここに私の質問があります.なぜ nm は縞模様の libtest.so に対して結果を出さないのですか?

ありがとう

0 投票する
1 に答える
889 参照

simulation - シミュレーション用のエルフからメモリへの画像

SparcV8のC++シミュレーションモデルを書いています。メモリは単純に配列としてモデル化されます。クロスコンパイラによって生成されたelf-executableを読み取り、それを使用してメモリを初期化する必要があります。次のようにやろうと思っています。

これにより、次のような(アドレス、ワード、ワードワード)形式のテキストファイルが生成されます。

Q:最後の列のすべてのドットは何ですか?

Q:elf実行可能ファイルからメモリイメージを生成するためのより良い方法はありますか?.text、.rodata、.dataセクションのみをコピーする必要があると思います

提案をありがとう

0 投票する
1 に答える
4364 参照

gcc - objdump/readelfは変数情報を取得します

コンパイルされたcプログラムからグローバル変数に関する情報を取得する必要があります。私はここで同様の質問をしました。

私が今抱えている問題は、変数情報を抽出しようとしているプログラムが非常に大きく、ツリーをテキストで取得するだけで4秒かかることです(readelf -w[i] file.out)。次に、必要な場所に到達するために、前後にジャンプするツリーを解析する必要があります。たとえば、変数がタイプのconst unsigned char * volatile MyVariable場合、ツリーの5つの異なるノードに移動する必要があり、プログラムに1000個の変数が含まれている場合、必要なものを取得するのに時間がかかります。

ですから、私の質問は、readelfコマンドをより有効に活用して必要なものを実現するにはどうすればよいかということです。このreadelf -w[i] file.outコマンドは、必要な情報(すべての関数、サブルーチン、ローカル変数など)を提供します。たとえば、そのコマンドの出力を調べてグローバル変数を取得する代わりに、readelf -s --wide file.outコマンドを使用して変数のみを取得します。そのコマンドは変数の名前を教えてくれるので、たとえば変数が整数であるかどうかを確認するためにツリーを調べる必要があります。

このリンクの237ページには、たとえばタイプに関する情報を取得する方法の例があると思います。ここに写真があります:

ここに画像の説明を入力してください

必要なものを解析するのに約15秒かかりますが、まだいくつかのバグがあります。車輪の再発明をしなくても、readelfコマンドをより有効に活用できれば便利です。

0 投票する
1 に答える
8966 参照

linux - readelf -s は完全な変数名を出力しません

コンパイルされた C プログラム ファイルからグローバル シンボルを取得する必要があります。私が使用するのは、readelf -s filePath そのコマンドを使用するときに linux コマンドです。これが得られます。

ここに画像の説明を入力

変数名が正しく表示されないことを示すために、青い四角形を描画します。25 文字の後にトリムされます。フルネームを表示するにはどうすればよいですか?

0 投票する
1 に答える
484 参照

windows - コンパイルされたプログラムで変数を見つけるためにパターンを理解する

コンパイルされたcプログラムからグローバル変数を抽出する必要があります。私が今していることは、その情報を取得するためにLinuxreadelfコマンドを使用することです。言い換えれば、私がするとき:

ここreadelf.exeからダウンロードできるプログラムでそれを行います。私はウィンドウを使用していて、それが私が必要とする唯一のコマンドだからです。Linuxでは、コンソールを開いて実行しますreadelf -w[i] myFile.out

とにかく、そのコマンドを実行すると、次のようになります。

その「ツリー」を使用して、すべてのグローバル変数とタイプを取得できます。たとえば、最初の変数NetBuf_ID_Ctrを見ると、ノードの型に関する情報を取得できることがわかります <0x86923>。そのノードはツリーのどこかにあります!実際に最初のノードであるものを見てください。開始するもので <1><86923>....、そのノードの内部を見ると、変数が4バイトのサイズのunsignedintであることがわかります。


今私の質問は、そのreadelfコマンドを使用すると ここに画像の説明を入力してください 、解析する必要のある192883行のテキストを取得することです。このツリーは、私が必要としているものよりも多くの情報を私に与えてくれます。16進エディタでファイルを調べると、次のように表示されます。

ここに画像の説明を入力してください

同じ変数を見つけることができ、そのNetBuf_ID_Ctr隣(強調表示)はアドレス<0x86923>です!

木の作り方を教えてくれる場所はインターネット上にありますか?コマンドreadelf.exeは、ツリーを作成するのに.1秒かかります。出力をStreamReaderに配置するため、非常に高速です。そのStreamReaderをメモリに配置して、非常に時間がかかる文字列に変換したい場合。


編集

要約すると、myFile.outからツリー(readelfの出力)がどのように構築されているかを知りたいと思います。そのパターンを理解することも、インターネット上のその方法を説明する場所もわかりません。