問題タブ [bfd]

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 投票する
3 に答える
4683 参照

c - GNUBinutilsのバイナリファイル記述子ライブラリ-フォーマット例

タイトルのように。私はBFDのELFのコードを読んでみましたが、それは軽い読みではありません。また、ドキュメントから何かを取得しようとしましたが、それがどのように機能するかを確認するための例が必要になります。実行可能形式を定義する方法を知るために、誰かが私にいくつかの簡単な例を教えてもらえますか?

編集:質問を適切に作成しなかったようです。「独自の実行可能フォーマット仕様を作成する方法」や「優れたELFドキュメントはどこにありますか?」ではなく、「GNU BFDを使用して独自の実行可能フォーマットを実装するにはどうすればよいですか?」

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

c - 2つのバイナリ実行可能ファイルをマージするにはどうすればよいですか?

この質問は、私が以前に尋ねた別の質問に続くものです。要するに、これは2つの完全にリンクされた実行可能ファイルを1つの完全にリンクされた実行可能ファイルにマージする私の試みの1つです。違いは、前の質問がオブジェクトファイルを完全にリンクされた実行可能ファイルにマージすることを扱っていることです。これは、手動で再配置を処理する必要があることを意味するため、さらに困難です。

私が持っているのは次のファイルです:

example-target.c

example-embed.c

私の目標は、これら2つの実行可能ファイルをマージして、と同じであるexample-targetが、さらに別のmainとを含む最終的な実行可能ファイルを生成することfunc1です。

BFDライブラリの観点からは、各バイナリは(とりわけ)一連のセクションで構成されています。私が最初に直面した問題の1つは、これらのセクションのロードアドレスが競合していることでした(たとえば、それらをマージすると、セクションがオーバーラップします)。

これを解決するために私がしたことは、example-targetプログラムで分析して、各セクションのロードアドレスとサイズのリストを取得することでした。次に、同じことを行い、この情報を使用してリンカーコマンドexample-embed動的に生成しました。このコマンドにより、すべてのセクションがのどのセクションとも重複しないアドレスでリンクされるようになります。したがって、実際にはこのプロセスで2回完全にリンクされます。1回はセクションの数とサイズを決定するため、もう1回はセクションとの衝突がないことを保証するためにリンクします。example-embed.cexample-targetexample-embedexample-target

私のシステムでは、生成されるリンカーコマンドは次のとおりです。

(セクション名の衝突を避けるために、セクション名の前に.newusingを付けていることに注意してください。)objcopy --prefix-sections=.new example-embedobj

次に、新しい実行可能ファイルを生成するためのコードを作成しました(objcopySecurity Warriorbookの両方からコードを借用しました)。新しい実行可能ファイルには次のものが必要です。

  • のすべてのセクションexample-targetとのすべてのセクションexample-embed
  • example-targetからのすべてのシンボルとのすべてのシンボルを含むシンボルテーブルexample-embed

私が書いたコードは次のとおりです。

このコードの機能を要約すると、出力ファイル()を生成するために2つの入力ファイル(ibfdおよび)が必要です。embedbfdobfd

  • format / arch / mach/fileフラグと開始アドレスをからibfdにコピーしますobfd
  • ibfdとの両方からのセクションを定義embedbfdしますobfd。BFDでは、すべてのセクションが作成される前に作成されることが義務付けられているため、セクションの作成は個別に行われます。
  • 両方の入力BFDのプライベートデータを出力BFDにマージします。BFDは多くのファイル形式よりも一般的な抽象概念であるため、基になるファイル形式に必要なすべてを包括的にカプセル化できるとは限りません。
  • ibfdとのシンボルテーブルで構成される結合シンボルテーブルを作成し、embedbfdこれをのシンボルテーブルとして設定しますobfd。このシンボルテーブルは保存されるため、後で再配置情報を作成するために使用できます。
  • ibfdセクションをからにコピーしますobfd。このステップでは、セクションの内容をコピーするだけでなく、再配置テーブルの作成と設定も行います。

上記のコードでは、一部の行が。でコメント化されてい/******** */ます。これらの行は、のマージを処理しexample-embedます。コメントアウトされている場合は、obfd単にのコピーとして作成されますibfd。私はこれをテストしました、そしてそれはうまく働きます。ただし、これらの行をコメントに戻すと、問題が発生し始めます。

完全なマージを行うコメントなしのバージョンでも、出力ファイルが生成されます。この出力ファイルを調べてobjdump、両方の入力のすべてのセクション、コード、およびシンボルテーブルが含まれていることを確認できます。ただし、次のようにobjdump文句を言います。

私のシステムで1708は、次のelf.cとおりです。

elf_dynsymtabのマクロelf-bfd.hです:

私はELFレイヤーに精通していませんが、これは動的シンボルテーブルを読み取る際の問題であると思います(または、おそらく存在しないと言っています)。とりあえず、必要な場合を除いて、ELFレイヤーに直接手を伸ばさなくても済むようにしています。私のコードまたは概念のいずれかで、私が間違っていることを誰かに教えてもらえますか?

役立つ場合は、リンカーコマンド生成のコードまたはサンプルバイナリのコンパイル済みバージョンを投稿することもできます。


これは非常に大きな質問であると認識しており、そのため、私を助けてくれる人には適切に報酬を与えたいと思います。誰かの助けを借りてこれを解決することができれば、500以上のボーナスを授与できてうれしいです。

0 投票する
4 に答える
11405 参照

gdb - マウンテン ライオンで gdb が失敗する

gdb の 7.x バージョンをコンパイルしようとしましたが、うまくいきませんでした。実行可能ファイル (http://sourceware.org/gdb/wiki/BuildingOnDarwin) をコード署名しました。

以下のバージョンでは、これらの問題がありました。

7.5,7.4,git clone: gbd の起動時に、アプリケーションと別のシステム ライブラリのロード コマンド 0x2a (およびその他) が不明です。たとえば、ベクトルを印刷しようとすると、「main(int, char**)」のフレームベースが見つかりませんでした。

7.3 (macports および gdb-website から): アプリケーションの起動時に、ブレークポイントの設定に失敗し、実行が続行されます。

システムllvm-gcc、gcc4.7、およびsvn-gcc4.8を使用してコンパイルしました。Mountain Lion に gdb をインストールできた人はいますか?

0 投票する
0 に答える
183 参照

c - gaddr2line 使用時の BFD 不明コマンド

gaddr2lineバックトレースシンボルのよりきれいなバージョンを印刷するために使用しようとしています。backtrace()を使用しgaddr2lineて実行することにより、アドレスを取得してからアドレスを取得していますpopen。Linux での使用は問題なく動作しますが、OS X でのaddr2line使用時に何らかの理由で奇妙なエラーが発生します。Mac OS でこれを試すと、GDB に関するいくつかの投稿を見たので、homebrew でインストールしようとしましたが、うまくいきませんでした。助けて。gaddr2lineBFD: ... : unknown load command ...

これが私のコードです:

出力は次のとおりです。

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

c - bfd データ構造を使用したオブジェクト ファイル内のセクション数

私の質問は、bfd と、次のコードでセクション数がどのように機能するかに関するものです。bfd 構造の gdb デバッガー内のコードとダンプ、およびその中のセクション構造を以下に示します。また、以下の bfd および bfd-> セクションのデータ構造定義も含めました。私の質問は次のとおりです: なぜこのコードを実行すると (実行可能ファイルは getsections と呼ばれます): >section_count、番号は 4218960 ですか? Linux コマンド objdump -h getsections.o を使用すると、14 個のセクション (.text、.data、.bss、.rodata、.debug_info、.debug_abbrev、.debug_loc、.debug_aranges、.debug_line、.debug_str、.コメント、.comment.SUSE.OPTS、.note-GNU-stack、.eh_frame)。私' Web 上の BFD ドキュメントで見つけたものを読みましたが、オブジェクト ファイル構造が objdump (14 セクション) で表示されるものとはかけ離れているため、ここで何が間違っているのかわかりません。どんな助けでも大歓迎です。ありがとう。

number_of_sections() にブレークポイントを設定すると、bfd のダンプは次のようになります。

abfd->sections のダンプには、何もないように見えます。

bfd 構造は次のようになります。

bfd->sections 構造 (sec 構造) は次のようになります。

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

c - デバッグ シンボルから変数のスタック オフセットを取得する

デバッグ情報付きのプログラムをビルドすると ( gcc -g)、gdb関数内のローカル変数のアドレスを教えてくれます。したがって、デバッグ シンボルには、これを計算するのに十分な情報 (つまり、 からのオフセットebp)が含まれている必要gdblibbfdあります。

ただし、libbdfのドキュメントには、これについて何も記載されていないようです。libbfdこの情報を教えてもらえますか?