問題タブ [linker-scripts]
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 - リンカー スクリプトのロケーション カウンター
リンカー スクリプトでのロケーション カウンターの動作は理解していると思っていましたが、そうではないと思います。理解していることを確認するために簡単なテストを行いました。ライブラリー呼び出しなしで単純な C プログラムを作成し、gcc でコンパイルしました。次に、最初に位置カウンターを値に設定したリンカー スクリプトを使用してリンクしました。プログラムはこちら
以下はリンカースクリプトです
私はそれを実行したくありませんでしたが、objdump の出力を確認しただけです。objdump -s
エルフで行うと、開始アドレスが0x8048000として表示されるはずだと考えていました。ただし、開始アドレスは常に 0000 と表示されます
その上、同じく 0000 から始まるコメント セクションがあります。何が起こっているのかわかりません。
これは、リンカー スクリプトを使用しない場合の objdump の出力です (まだライブラリはありません)。
linker - 予期しないリンカーセクションの出力場所
ld
Linuxでカーネルのアセンブリファイルに対してコマンドを使用しようとしています。grubで起動するには、1Mbアドレスの後にある必要があります。したがって、私のリンクスクリプトには、アドレス0x00100000に向かうテキストが含まれています。
これが私が使用しているリンカースクリプトです:
私の質問は出力ファイルについてです。ファイルのバイナリを見ると、テキストセクションは0x1000から始まります。スクリプト内のテキストの場所を変更し、0x500などの0x1000未満のアドレスを使用すると、テキストはそこから始まります。しかし、0x1000を超えると、丸められます(0x2500はテキストを0x500に配置します)。
テキストを0x100000にするように指定すると、出力ファイルに含まれるべきではありませんか?または、やるべきことがもっとあることを指定するバイナリの別の部分がありますか。カーネルの起動に問題があるので質問していますが、今のところ、リンカーの出力を理解しようとしているだけです。
linux-kernel - リンカ スクリプトがメモリを浪費する
ここに私の問題があります。標準の arm7nommu-uClinux カーネルをリンクする次のリンカー スクリプトがあります。
私のハードウェア シミュレータのメモリ アーキテクチャは、1 つの sdram と 1 つのフラッシュ メモリで構成されています。コードのセクションを分割し、(たとえば) .text セクションをフラッシュに、.data セクションを特定のアドレスの sdram に配置したいと考えています。そのために、リンカー スクリプトを次のように変更しました。
すべてのセクションが必要な場所にマップされているため、正常に動作しますが、通常の出力ファイル (前のリンカー スクリプトとリンク) が約 800Kb の場合、出力ファイルは約 429Mb です!...なぜですか? 私を助けてください!
前もって感謝します。
c - 実行可能ファイル内のグローバル const 変数のオフセット
独自のグローバル定数を変更して、実行可能ファイルの状態を保存したいと考えています。完全に自己完結型の実行可能ファイルを用意するためだけに。
頭に浮かぶいくつかの解決策/ハック:
- libelf を使用し、プログラムにそれ自体を解析させてオフセットを見つけます。
- 特定のマーカーを追加し、実行可能ファイルで検索するだけです。これはクロスプラットフォームでもあると思いますか?
- オブジェクト ダンプ ユーティリティを使用して、実行可能ファイル内のアドレスを特定します。これはおそらく、プロジェクト ビルドの後処理として常に実行する必要があります。
リンカーにこの情報を提供してもらうのはいいことです。
リンカーに実行可能ファイルの読み取り専用セクションのオフセットを提供させることは可能ですか?
ありがとう
assembly - .foo : { *(.*) } はリンカ スクリプトで何を意味しますか?
512 バイトの起動可能なプログラムを作成していますが、512 バイトのプログラム イメージの最後の 2 バイトに 0xAA55 を挿入する必要があります。だから私はそれをしました。これで、リンカー スクリプトは非常にシンプルになります。この構文が何を意味するのか興味がありました
例としてあげました。.foo セクションはありません。その前に、プログラム カウンターを次のように変更します。
したがって、このディレクティブの後は
これは何をしますか?
compiler-construction - リンカー スクリプトを介して i386 リンカーに OVERLAY を実装する方法
GDB リファレンス マニュアルからオーバーレイの例をリンクしようとしています。この例は d10v プロセッサをターゲットにしていますが (よく知られていません)、x86_64 または i386 アーキテクチャの例をコンパイルすることで、デバッガがオーバーレイで動作することを示したいと思います。
次のセクションをリンカースクリプトにインポートしてみました。最初に、StackOverflow から学んだ手法を使用してリンカー スクリプトを抽出しました。
$> gcc a.c -Wl,-verbose
このリンカー スクリプトを次のように変更し、.ovly0{0-3} および .data0{0-3} セクションを追加しました。
このスクリプトの関連部分は次のとおりです。
このスクリプトを使用してプログラムをコンパイルすると、最終的に実行可能なオブジェクトが作成されますが、オーバーレイをロードしようとするとSEGFAULTになります。興味深いのはOBJDUMP
、2 つの関数「foo」と「bar」の両方に同じ VMA アドレス (0x1001000) が与えられ、それぞれに割り当てられたロード アドレスがあることです。
OBJDUMP の関連部分は次のとおりです。
誰かがリンカーのオーバーレイ機能を使用したことがあるかどうかを知りたいのですが、もしそうなら、誰かがこれのデモンストレーションを作成できましたか? 私が取り組んでいる組み込みデバッガーにはこれが必要です。
この分野で何か助けていただければ幸いです。
ありがとうございました、
ムマン613
linker - アームローダースクリプトの意味
output_format、output_arch、entry ...を取得します。これは、出力がelf32-littlearmなどになることを意味している可能性があります。
しかし、セクションの部分は私が得られないものです。
これ '。='が始まりです。
と '。= ALIGN(4)'および.text:{*(。text)}...。
誰かがこのT_Tで私を助けることができます
読んでくれてありがとう。
g++ - LD_LIBRARY_PATH と -rpath の違いは何ですか
ライブラリをリンクする場合、-rpath を使用して動的ライブラリのアドレスを ld に渡します。私の質問は、LD_LIBRARY_PATH にアドレスを設定した場合、リンク プロセスで -rpath フラグが必要ですか?
linker - GNU リンカーとリンカー スクリプト: リンカーが正しい LMA を生成しない
リンカースクリプトに次の行があります
eROData はフラッシュからのアドレスであり、値 0x1000xxxx を想定しています
リンク後、リンカーが VMA と LMA の両方をセクション JumpTable に割り当てていることに気付きました。これは、リスト ファイルからのリストです。
.data セクションにはそのような問題はありません。
これは既知の GNU リンカの問題ですか?
編集:セクション「.JumpSection」がCファイルで定義されている場合、LMAが正しく割り当てられていることに気付きました。
セクションがアセンブリ ファイルで定義されているため、この問題に直面しています。
以前にこの問題に直面したことがありますか?
編集 - 解決策: .JumpSection を正しい属性で定義する必要があることがわかりました: .section ".JumpSection","ax",%progbits
そうして初めて、リンカは正しく動作します。