問題タブ [relocation]
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.
gcc - GCCインラインasm:共有ライブラリで直接オペランドとして変数アドレスを使用する方法は?
次のコードは、問題なく実行可能ファイルにコンパイルされます。
しかし、共有ライブラリとして、エラーが発生します:
コンパイル結果:
でコンパイルし-fPIC
ても違いはありません。リンカーが のアドレスへの参照を再配置するように、これを微調整するにはどうすればよいfoo
ですか? asm の即値整数オペランドである必要があります。
更新:メモリオペランドを取る別の命令を使用することになりました。これは、即値オペランドでこれを行う方法が明らかにないためです。
c - シンボルテーブルと再配置テーブルの使用に関する私の理解は正しいですか?
現在、リンク/ロードの概念を理解するのに苦労しています。
シンボルと再配置テーブルの使用に関する次の記述が正しいかどうか教えてください。
- 再配置可能なオブジェクト ファイルでは、シンボル テーブルには、他のオブジェクト ファイルからアクセス/呼び出される変数と関数のエントリが含まれている必要があります。オブジェクトファイルの外で使用されない変数と関数のリストはオプションです。
- これは、プログラムが 1 つのオブジェクト ファイルのみで構成されている場合、シンボル テーブルを省略できることを意味します。
- 再配置可能オブジェクト ファイルでは、再配置テーブルは、ロード中に更新する必要がある、アセンブルされたコードのすべての場所のアドレスを保持します。
- リロケータブルでないオブジェクトファイルでは、リロケーションテーブルを省略できます。ただし、オブジェクトは、命令にハードコードされているアドレス空間にロードする必要があります。
御時間ありがとうございます!
c - オブジェクトファイルの再配置記録を読む方法
C ツールチェーンのリンク段階を理解しようとしています。サンプル プログラムを作成し、結果のオブジェクト ファイルを分析しました。これは、関連するプロセスをよりよく理解するのに役立ちましたが、不明な点がいくつかあります.
ここにある:
パート 1: 初期化された変数の処理。
これらの再配置テーブルのエントリは正しいですか...
2b
... 基本的に、 offset35
および3f
fromに格納されているアドレス.text
は絶対アドレスではなく、.data
?に対する相対アドレス (= オフセット) であることをリンカーに伝えています。これにより、リンカーが
- 再配置不可能なオブジェクト ファイルを作成するために、これらの相対アドレスを絶対アドレスに変換します。
- オブジェクトファイルが他のオブジェクトファイルとリンクされた場合に備えて、それに応じて調整してください。
パート 2: 初期化されていない変数の処理。
初期化されていない変数が初期化された変数とは異なる方法で処理される理由がわかりません。レジスタ アドレスがオペコードに格納されているのはなぜですか。
- 初期化されていないすべての変数 (0x0、0x0、および 0x0) に対して等しく、
- 初期化されたすべての変数 (0x0、0x4、および 0x8) で異なる?
また、再配置テーブル エントリの値フィールドもまったくわかりません。.bss
セクションがそこで参照されることを期待していたでしょう。
gcc - コピー再配置の目的は何ですか?
背景: 実行可能ファイルに、共有オブジェクトで定義された外部データ参照がある場合、コンパイラはコピーの再配置を使用して、.bss セクションにコピーを配置します。コピーの再配置については、次のサイトで詳しく説明しています: http://www.shrubbery.net/solaris9ab/SUNWdev/LLM/p22.html#CHAPTER4-84604
ただし、私の質問は次のとおりです。
共有オブジェクトの外部データ参照と同じように、GOT を介して実装することは可能ですか? 実行可能ファイルは、GOT エントリを介してこの外部コードに間接的にアクセスできます。この GOT エントリには、実行時にこのシンボルの実際のアドレスを詰め込むことができます。GCC がこのように実装しない理由がわかりません。コピーの再配置の利点は何ですか?
arm - AT91RM9200 の内部 ROM から SRAM への U-Boot の再配置
内部 ROM から SRAM への u-boot の再配置を理解しようとしています。以下のコードは、u-boot が ROM から SRAM にコピーされ、pc が _start_armboot にジャンプされることを示しています。ただし、メモリの再マップ操作がコードのどこで行われているのかわかりません。
u-boot-2010.09\arch\arm\cpu\arm920t\start.S からの抜粋
AT91RM9200 のデータシートには、内部 ROM はリセット後にアドレス 0x0000_0000 でアクセスでき、SRAM はアドレス 0x0020_0000 でのみアクセスできると記載されています。リマップ後、SRAM はアドレス 0x0000_0000 でも利用でき、内部 ROM はアドレス 0x0010_0000 でアクセスできます。
u-boot でのリマップ操作を理解し、これに対応するコードを教えてください。
ありがとう
c - GCC リンカ: 指定されたセクションでシンボルを移動する
コード内の一部の関数を実行可能ファイルの特定のセクションに移動することはできますか? もしそうなら、どのように?
gcc でコンパイルされたアプリケーションの場合、Xc を含むより多くのソース ファイルがあります。各オブジェクトは関連するソースからコンパイルされ (Xo は Xc から取得されます)、リンカーは大きな実行可能ファイルを生成します。
Xc の 2 つの関数を実行可能ファイルの特定のセクション (.magic_section など) に配置する必要があります。これが必要な理由は、セクションが残りのセクションとは別のメモリ領域にロードされるためです。
私の問題は、ソース Xc を変更できないことです。それ以外の場合は__attribute__ ((section ("magic_section")))
、関数などに特定のフラグを使用していたでしょう。
リンカーのドキュメントを読み、リンカーのカスタム スクリプトを作成しましたが、特定のシンボルを配置する必要があるセクションを指定できませんでした。なんとかセクション全体を移動することができました。