問題タブ [binutils]
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.
assembly - objdump から情報を取得する方法
Linux で実行可能ファイルからダンプされた情報を読み取るときに問題が発生します。情報は次のとおりです。
2 つの質問があります。
- アドレス 804a0ea と 804a0f4 はどういう意味ですか? プロセスのアドレス空間の仮想アドレス?
- ... とはどういう意味ですか? アドレス 804a0f0 で命令を取得するにはどうすればよいですか?
前もって感謝します。
コードのこの部分に関する詳細情報:
誰かが私に手を差し伸べてくれることを願っています.:-)
c++ - gccを使用してC++から構築されたELFバイナリを考えると、その中のあるタイプのサイズをどのように決定できますか?
これを取得するためにbinutilsツールを使用する方法はありますか?例えば:
それで:
a.outを分析してsizeof(MyInt)を取得するにはどうすればよいですか?GDBはそれを行うことができますが、大きなバイナリでは非常に遅いため、GDBは使用したくありません。
gcc - binutilsリンカーを使用して静的ライブラリ間の再帰的な依存関係を処理するにはどうすればよいですか?
既存のシステムをWindowsからLinuxに移植しています。ビルドは複数の静的ライブラリで構成されています。libBのオブジェクトにシンボル(libAで定義)が見つからないというリンクエラーが発生しました。リンカーラインは次のようになりました
g ++ test_obj.o -lA -lB -o test
もちろん問題は、リンカがlibAからのシンボルを必要としていることを検出するまでに、すでにそれを通過しており、再スキャンしないため、シンボルが取得のために存在していても、単にエラーになることです。
私の最初のアイデアはもちろん、リンクを(-lB -lAに)スワップして、後でlibAをスキャンし、libAにあるlibBから欠落しているシンボルをピックアップすることでした。しかし、実際にはlibAとlibBの間に再帰的な依存関係があることがわかりました。Visual C ++リンカーがこれを何らかの方法で処理すると想定しています(デフォルトで再スキャンされますか?)。
私が検討したこれに対処する方法:
共有オブジェクトを使用します。残念ながら、これはPICコンプライアンスを要求するという観点からは望ましくなく(これはパフォーマンスに敏感なコードであり、GOTを保持するために%ebxを失うと本当に害があります)、共有オブジェクトは必要ありません。
問題を回避して、すべてのオブジェクトの1メガarを構築します。
再帰的な依存関係を回避するためにコードを再構築します(これは明らかに正しいことですが、最小限の変更でこのポートを実行しようとしています)。
これに対処する他のアイデアはありますか?binutilsリンカーに、シンボルが欠落しているときにすでに調べたライブラリの再スキャンを実行するように説得する方法はありますか?
c - Binutils をビルドしようとすると、C コンパイラが実行可能ファイルを作成できない
Linux をゼロからビルドしようとしていますが、現在は5.4 章で、Binutils のビルド方法が説明されています。binutils 2.20 のソース コードがありますが、それをビルドしようとすると、次のようになります。
それは私にエラーを与えます:
私のconfig.logはpastebin.comで見ることができます: http://pastebin.com/hX7v5KLn
Ubuntu 10.04 をインストールし、GCC を再インストールして G++ をインストールしました。また、ビルドは「lfs」と呼ばれる非ルート、非管理者ユーザー (Linux From Scratch でも説明されています) によって、システムがインストールされている場所とは異なるパーティションで行われます。
誰でも私を助けることができますか?ありがとう
linux - dlopen() を使用した共有オブジェクトの動的ロード
私はプレーンな X11 アプリに取り組んでいます。
デフォルトでは、私のアプリは libX11.so と標準の gcc C および数学ライブラリのみを必要とします。このアプリは、Xfixes、Xrender、および ALSA サウンド システムで機能を拡張できます。ただし、これら (Xfixes、Xrender、および ALSA) の機能はオプションです。
この動作を実現するために、ランタイム ローディングを使用しています。つまり、libXfixes、libXrender、および libasound を dlopen() する必要があります。
したがって、アプリはそのようなライブラリがなくても機能します。
今私の質問:
これらはディストリビューションごとに異なることがわかりました。
たとえば、openSUSE 11 では、次のように名前が付けられます。
- libXfixes.so
- libXrender.so
- libasound.so
ただし、Ubuntu では、次のように、名前にバージョン番号が付いています。
- libXfixes.so.3
- libXrender.so.1
- libasound.so.2
したがって、「libXfixes.so」を開こうとすると、Ubuntu では失敗しますが、lib は明らかにそこにあります。バージョン番号が添付されているだけです。では、私のアプリはこれをどのように処理すればよいでしょうか?
アプリで最初に /usr/lib/ を手動でスキャンして、どのライブラリがあるかを確認し、次に適切なものを選択する必要がありますか? または、誰かがより良いアイデアを持っていますか?
みんなありがとう、
アンディ
c - 関数呼び出しを追加すると、リンク時に他のシンボルが未定義になる可能性がありますか?
リンカ スクリプトの問題と思われる問題のトラブルシューティングを誰かが手伝ってくれることを願っています。
新しい関数への呼び出しを追加した後、奇妙な問題が発生しました。関数呼び出しがなければ、オブジェクト ファイルは正しくリンクされますが、新しい関数呼び出しを追加すると、別のオブジェクト ファイルからシンボルへの未定義の参照が取得されます (objdump を使用して実際に存在することを確認しました)。
また、奇妙なことに、関数呼び出しが存在する場合、最初に ld -r (再配置可能な出力を提供するため) を使用してすべてのオブジェクト ファイルをリンクし、次にリンク スクリプトを使用すると、未定義の参照はありませんが、リンク スクリプトは無視されているようです。出力バイナリに正しいエントリ ポイントがありません。
私の(クロスコンパイラ)ldバージョン:
> i586-elf-ld --version
GNU ld (GNU Binutils) 2.20.1.20100303
「欠落」シンボルが存在することを証明しようとする私の試み:
> i586-elf-ld -T link.ld -o kernel32.bin kernel_loader.o main.o stdio.o common.o gdt.o gdt.bin -y putch
NB (この出力を作成したとき、nasm コンパイル済みアセンブラーに gdt.bin というファイル名を使用していましたが、実際には別の .o ファイルです)
適切なオブジェクト ファイルに「見つからない」シンボルが表示されます。
> i586-elf-objdump -ht stdio.o
stdio.o: ファイル形式 elf32-i386
そして、未解決の参照を持つオブジェクト ファイル:
> i586-elf-objdump -ht main.o
私のリンクスクリプト(関連するかどうかはわかりません):
main.c の putch への呼び出しをコメントアウトすると、代わりに puts への未定義の参照が取得されます... gdt_install への呼び出しを削除すると、エラーは発生しません!
gdt_install は C ファイルにありますが、gdt_install は gdt.asm で定義されている関数を呼び出します。
原因をさらに診断するために、エラーを再現しようと試行錯誤してきました。gdt_install() 関数呼び出しをソース コードの特定の場所に移動すると、エラーは発生せず、すべて正常に動作します。
呼び出しを最初の puts() 呼び出しの上に移動すると、puts の未定義の参照を受け取ります!:
次に、呼び出しを putch() の上に移動すると、未定義の putch への参照が発生します (最初に呼び出しがあった場所です)。
最後に、init_video() の上で、init_video への未定義の参照が発生します。
一体何がこのエラーを引き起こしているのでしょうか? gdt_install 呼び出しが何らかの形で他のシンボルを「破損」しているようです...ドキュメントでそれへの参照を見つけることができませんでしたが、 gdt_install 関数呼び出しがリンカーの「境界」をオーバーランさせて破損させる可能性がある方法はありますか?他のコード?
このような問題に遭遇した人はいますか、それともさらに調査するためのアイデアはありますか? 私は osdev フォーラムに投稿しました: http://forum.osdev.org/viewtopic.php?f=1&t=22227しかし、あまり運がありませんでした。
ありがとう
編集:
関連性があるかどうかはわかりませんが、リンク時にリンクスクリプトを省略すると、以前のエラーはすべて消えます... (ただし、エルフバイナリを理解しないため、ブートローダーはカーネルを呼び出すことができません)。
要求に応じて、前処理の前後の main.c ファイルを示し、コンパイルされた main.o ファイルから逆アセンブルします。
前処理前:
前処理後:
もう一度編集します:
-g3 を提案してより良い逆アセンブリ出力を提供してくれた nategoose に感謝します。
そして今、きれいなmakeからの新しい出力:
編集 3
要求どおり、stdio.o での nm -s の出力は次のとおりです。
編集 4 要求に応じて、ソース ファイル全体を以下に示します。ファイルを zip 形式でアップロードしました: http://www.owenstephens.co.uk/media/files/kernel.zip継続的な関心と支援に感謝します。
メイクファイル:
リンク スクリプト:
main.c:
common.c:
stdio.c:
gdt.c:
gdt.asm:
インクルード/common.h:
インクルード/stdio.h:
インクルード/gdt.h:
すべての .o ファイルを含む共有ライブラリを「objdump -t」した場合の出力 (kernel_loader を除く、したがって未定義の _start シンボル。
linux - addr2line からフルパスを取得する
いくつかのデバッグ タスクを自動化しようとしています。場合によっては、$ra
[これは MIPS マシンです] の値とスタックの一部を 16 進アドレスとして出力します。デバッグ中に、それらをペアaddr2line
に変換するために使用します。file:line
この手順を自動化したい。
問題は、 addr2line が__FILE__
コンパイル時の値と同等のファイル名を返すことです。つまり、コンパイラに渡されるファイルの名前です。これは通常foo.c
、時々src/foo.c
です。私のプロジェクトには合計で数百のディレクトリがあるため、これだけではファイルを一意に識別できない場合があります ( 、 などがある場合があります1/foo.c
) 2/foo.c
。決定論的であったとしても、引数ごとに画面で検索を開始するのはかなり非効率的です [ハッシュ テーブルを作成して保存できると思いますが、これを単純な bash スクリプトとして保持したいと思います]。
GDB は適切なファイルを取得しているようです。デバッグ シンボルを含む実際のソース ファイルを見ると、ファイル名の直後に__FILE__
[つまり、__FILE__
issrc/foo.c
であり、実際には にある場合、ファイルに表示されるフル パスがあるように見えることも/home/me/projects/something/comp1/src/foo.c
わかり/home/me/projects/something/comp1
ます。これをプログラムで取得するにはどうすればよいですか?
ありがとう。
visual-studio - objdumpELFおよびWindows
私はこのテーマ、つまりELFやLinux関連のものにかなり慣れていません。ELFファイルを書き込もうとしていますが、WinXPで書きたいと思っています。
私の質問は、これはコンパイルを含めてMS Visual Studioで実行できますか?私の理解では、ELFファイルはWindowsOSでコンパイルできません。まあ、少なくともそれは私のグーグルの研究が私に発見したものです。Linux OSをセットアップして、そこでコンパイルする必要がありますか?
objdumo(GNU binutilsの一部)を使用してWindowsXP上のELFファイルを分析できますか?
ヘルプとリンクは大歓迎です。
macos - Mac / iPhone に相当する objcopy はありますか?
objcopy --redefine-syms
オブジェクト ファイル (.o) 内のシンボルの名前を、Mac で binutils のツールに相当するものに変更したいと考えています。
いいえarm-apple-darwin10-objcopy
。私は MacPorts のarm-elf-binutils
ポートを試し、また少し遊んでみましたが、うまくotool
いきsegedit
ませんでした。
アイデアはありますか?
gdb - gdb\bfd: 子変数のアドレスまたはサイズまたはオフセットを取得します
gdb と libbfd を使用して、elf ファイルからグローバル変数情報を取得し、表示しています。libbfd から次のデータを取得できます: グローバル変数の名前、アドレス、およびサイズ。gdb と gdb\MI (ptype、whatis、-var-create & -var-list-children) を使用して、変数とその子の型を取得します。
すべての子の親からアドレス\サイズ\オフセットを取得するにはどうすればよいですか?
例えば
この型の変数 A がアドレス 0x000100 にある場合、A.count がサイズ 0x1 の 0x000100 にあり、A.time がサイズ 0x1 の 0x000101 にあることを示したいと思います。
編集: gdb は DWARF 情報を読み取ることができると読みましたが、gdb からこの情報を取得する方法がわかりません。