問題タブ [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.
c++ - addr2line からの間違った行番号
C++ プログラムのバックトレースで呼び出しの正確な行を見つけようとしています。現在、これらの行を使用して (backtrace の man ページから) トレースを取得しています。
bt_strings で、フォームの行を見つけます
次に、アドレス (16 進文字列) を取得し、addr2line に入力します。その結果、明らかに間違った行番号が表示されることがあります。インターネット検索でこの投稿にたどり着きました。
行が実際にどこにあるか、またはシンボルが現在の行に移動した行数を示します。
編集:-g -O0
これは、最適化なしで明示的にコンパイルすると発生します。コンパイラはgcc 4.6.3
私が見逃している別のコンパイラフラグはありますか?
私の問題は次のとおりです。これを自動化する必要があります。バックトレースを作成し(完了)、ファイルを抽出し(完了)、行番号を抽出する(失敗)プログラムが必要です。
もちろん、出力を呼び出しreadelf
て解析することもできますが、正確に何が起こったかによって出力がシンボルごとに異なるため、これはあまり適していません。シンボルのアドレスが 1 行に表示され、次の行に行オフセットに関する情報が表示されることがあります。
総括する:
実行時にプログラム内からバックトレースで関数呼び出しの正確な行番号を取得するエレガントな方法はありますか?
編集:コード例:
コンパイルして実行:
出力:
たとえば 0x400ef0 を addr2line でテストすると、結果が得られます
これは正しいファイルですが、行番号が間違っています。実際のアプリケーションでは、行番号は前後に何行も異なる場合があります。
編集:でコンパイルする-S
と、関連する部分が次のようになります。
と同様に表示されるaddr2line
のは、 の後の行に示されているように、リターン アドレスですcall
。「エントリ」行、つまり前に表示されているものを取得したいと思います!
compilation - Objcopy、どのようにバイナリ出力を作成しますか?
私はbinutilsやgccantに慣れていないので、いくつかの一般的な質問があります。これについては、マニュアルには記載されていません。
Cとアセンブリ(nasm構文)を使用しており、出力に生のバイナリファイルが必要です。まず、コードをパラメーターを使用してobjecファイルにコンパイルします。
次に、セグメントを必要な順序に並べるだけの簡単なスクリプトを使用して、すべてのファイルをリンクします。
そして、生のバイナリを取得するには、objcopyを使用します
全体として、 .textセグメントと.dataセグメント、および32ビットコードのみを含むバイナリファイルが必要です。
1.この方法で欲しいものを手に入れることはできますか?
2.それを行う他の方法はありますか?(簡単でも複雑でも)
助けてくれてありがとう。
Asmコードのコンパイルに問題はなく、Cコードのほとんどすべての問題があります。
c - binutils/bfd.h に config.h が必要ですか?
私はBFDライブラリを使用しようとしているので、パッケージをインストールbinutils-dev
して含めました:
私のコードからなどを呼び出しbfd_openr
ています。bfd_close
最近、パッケージをアップグレードしましたが、ここからエラーが発生します。
bfd.h:
...含める必要がありますconfig.h
-しかし、私はautoconfを使用していません。
間違ったヘッダー ファイルをインクルードしていませんか? binutils-dev はどのように使用するのですか?
ここにデモプログラムがあります:
次のようにコンパイルして実行してみてください。
gcc - Solaris 10 で Binutils Build を使用すると失敗する
Solaris 10 で最新の binutils-2.22 を正常にビルドしてインストールしました。
しかし、次のようなインストール済みプログラムを使用しようとするとld
、or
実行時エラーが発生します。
エラーを広範囲に検索しましたが、すべてのヒットは私の問題とは無関係のようです。
私が読ん__clz_tab
だことから、「libgcc」に関連しているようです。
少なくとも libgcc にはシンボルが含まれていますclz
。
アイデアはありますか?
arm - GCC ARM VFP 命令を操作するための正しいインライン アセンブリ制約は何ですか?
Google NDKv8b に付属のツールチェーン (gcc-4.6) を使用して、倍精度レジスタ (d8) の値を ARM プラットフォームの C 変数にロードしたいと考えています。私の ARM マシンは Samsung Galaxy S2 です (VFPv3 と NEON が搭載されています)。GCC のドキュメントによると、インライン アセンブリで VFP 倍精度レジスタを使用するには、"w" 制約を使用する必要があります。だから私はこのようなことを試しました(OK、プログラム全体のロジックをあまり調べないでください):
まあ、それはコンパイルさえしません:
どうすればこれを達成できますか?
ありがとう!
linux - ELF ダイナミック ローダー シンボル ルックアップの順序付け
動的再配置を解決するときのシンボル検索の検索順序は何ですか?
共有ライブラリのシンボルを解決するとき、ローダーは最初に「メイン実行可能ファイル」を検索します(メイン実行可能ファイルが定義をオーバーライドできるようにするため...)、または何ですか?
linux - ELF 移転 - これらのシンボルはどこから来たのですか?
私の Debian x86 32 ビットでは、 readelf -r /usr/lib/libstdc++.so.6 | を実行すると、grep pthread を実行すると、次の出力が得られます。
ただし、 /usr/lib/libstdc++.so.6 libpthread の依存関係を一覧表示すると、一覧には表示されません。
これらの依存関係は動的ローダーによってどのように解決されるのでしょうか? __gmon_start__ で同様の問題を見つけました。大まかに言えば、このシンボルの定義はどこですか?
g++ - --as-needed でリンクすると、FFTW への参照が解決されない
説明できないリンクの問題があります。このプログラムには、fft.cpp というファイルに FFTW 関数への参照が含まれています。リンク コマンドは次のとおりです (残りのオブジェクト ファイルはスキップしました)。
余分な -Wl,-Bstatic -Wl,-Bdynamic オプションは、ビルド システムとして使用する Waf によって生成されます。Ubuntu 12.04 に付属するデフォルトのツールチェーン (GCC 4.6.3、binutils 2.22) を使用します。
問題は、リンカが FFTW 関数への参照を検出および解決しないことです。実行すると、プログラムは次のメッセージで中止されます。
の出力ldd
は、FFTW がまったくリンクされていないことを示しています。
nm
FFTW への参照が含まれていることがの出力に示されているため、これは明らかにリンカの障害です。
--as-needed
これは、Ubuntu 12.04以降デフォルトで渡されるリンカーオプションに何らかの形で関連している可能性があることがわかりました-実際、-Wl,--no-as-needed
コマンドラインに追加すると、問題はなくなります。ただし、この回避策は必要ありません。--as-needed
リンカーがFFTWを有効にすると正しくリンクしない理由がわかりません。誰でもこれに光を当てることができますか?これはリンカーのバグですか?FFTW ライブラリだけが影響を受けるのはなぜですか?
c - 「__gmon_start__」シンボルとは何ですか?
私はこのコードを次のようにコンパイルしていますgcc hello.c -o hello -O3
:
再配置をリストすると、次のようになります。
このファイルにシンボルをリストすると、次のようになります。
gmon_start
gprof と何か関係がありますか? -pg
orでコンパイル/リンクしていなくても、そのシンボルの再配置があるのはなぜ-g
ですか? このシンボルを解決するライブラリはどれですか?
gcc - JVM で GCC と binutils を実行する
コンパイラが出力として x86/ARM/MIPS バイナリを生成するように、JVM の上で GCC コンパイラ スイートと binutils を実行する方法があるかどうか疑問に思っていました。これはクロスコンパイルに似ていますが、ホスト システムはネイティブ ホスト システムではなく JVM になります。コンパイラのターゲットは、x86/ARM/MIPS/GCC がサポートするすべてのものです。
これは、ターゲット システムにクロスコンパイラを使用する必要がある少なくとも組み込みプログラマにとって有益です。現在、ホスト システム用に GCC をビルドし、ターゲット命令セット (ISA) 用に再度ビルドする必要があります。GCC が JVM で実行される場合、Linux、Windows、BSD、Unix、または JVM をサポートするシステムで実行されているかどうかに関係なく、コンパイラを変更せずに実行できます。
これは、実行環境として JVM のみをサポートする必要があるため、GCC コンパイラ スイートをさまざまなホスト システムに移植するのにも役立つ可能性があります。
コメントやアイデアはありますか?