問題タブ [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.
c - GNUBinutilsのバイナリファイル記述子ライブラリ-フォーマット例
タイトルのように。私はBFDのELFのコードを読んでみましたが、それは軽い読みではありません。また、ドキュメントから何かを取得しようとしましたが、それがどのように機能するかを確認するための例が必要になります。実行可能形式を定義する方法を知るために、誰かが私にいくつかの簡単な例を教えてもらえますか?
編集:質問を適切に作成しなかったようです。「独自の実行可能フォーマット仕様を作成する方法」や「優れたELFドキュメントはどこにありますか?」ではなく、「GNU BFDを使用して独自の実行可能フォーマットを実装するにはどうすればよいですか?」
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.c
example-target
example-embed
example-target
私のシステムでは、生成されるリンカーコマンドは次のとおりです。
(セクション名の衝突を避けるために、セクション名の前に.new
usingを付けていることに注意してください。)objcopy --prefix-sections=.new example-embedobj
次に、新しい実行可能ファイルを生成するためのコードを作成しました(objcopy
とSecurity Warrior
bookの両方からコードを借用しました)。新しい実行可能ファイルには次のものが必要です。
- のすべてのセクション
example-target
とのすべてのセクションexample-embed
example-target
からのすべてのシンボルとのすべてのシンボルを含むシンボルテーブルexample-embed
私が書いたコードは次のとおりです。
このコードの機能を要約すると、出力ファイル()を生成するために2つの入力ファイル(ibfd
および)が必要です。embedbfd
obfd
- 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以上のボーナスを授与できてうれしいです。
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 をインストールできた人はいますか?
c - gaddr2line 使用時の BFD 不明コマンド
gaddr2line
バックトレースシンボルのよりきれいなバージョンを印刷するために使用しようとしています。backtrace()
を使用しgaddr2line
て実行することにより、アドレスを取得してからアドレスを取得していますpopen
。Linux での使用は問題なく動作しますが、OS X でのaddr2line
使用時に何らかの理由で奇妙なエラーが発生します。Mac OS でこれを試すと、GDB に関するいくつかの投稿を見たので、homebrew でインストールしようとしましたが、うまくいきませんでした。助けて。gaddr2line
BFD: ... : unknown load command ...
これが私のコードです:
出力は次のとおりです。
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 構造) は次のようになります。
c - デバッグ シンボルから変数のスタック オフセットを取得する
デバッグ情報付きのプログラムをビルドすると ( gcc -g
)、gdb
関数内のローカル変数のアドレスを教えてくれます。したがって、デバッグ シンボルには、これを計算するのに十分な情報 (つまり、 からのオフセットebp
)が含まれている必要gdb
がlibbfd
あります。
ただし、libbdf
のドキュメントには、これについて何も記載されていないようです。libbfd
この情報を教えてもらえますか?