問題タブ [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.
grammar - 正式な ld リンカー スクリプトの構文はどこにありますか?
リンカースクリプトの正式な文法を探しています。lex と yacc に与えられたものに似たものですが、他の yacc バゲージにはありません。のソース コードを直接見れば、yacc のような文法を見つけることができるかもしれませんld
。でも今はやりたくない。
この質問とその回答を見たことがありますが、のマンページを参照していますld
。マンページは大部分は問題ありませんが、ややあいまいな方法で指定されています。たとえば、割り当てからこのスニペットを取得します: シンボルの定義:
たとえば、アドレスが .data という名前の出力セクションの最後のバイトである絶対シンボルを作成するには、次のようにします。
をどのように解釈し...
ますか?
これは一例です。苦労の末、この 1 つのことを十分に正確に解釈できるかもしれません。しかし、そのような例はたくさんあります。私の質問は次のとおりです。リンカ スクリプトに利用できる、より適切で正式な仕様はありますか? The C Language
Ritchie and Kernighanの本の付録にある C 文法のようなものですか?
gcc - c - .data を別のセクションに送信する
特定の C ファイル用に生成されたセクションのシンボルを取得し、最終的な実行可能ファイル.data
の別のセクション (例: ) に配置したいと考えています。.mydata
例えば、
デフォルトでは、 と の両方がセクションmy_str
にmy_special_str
表示され.data
ます。ただし、 を生成するときは、代わりに に表示さspecialdata.o
れるものをすべて に送信したいと考えています。.data
.mydata
を使用し__attribute__((section(".mydata")))
てこの効果を達成できることは承知していますが、これを構造体のポインターメンバーの指定された初期化子に適用する方法がわかりません (この質問のコードを簡略化しました)。その代わりに、リンカ スクリプトを使用して、特定のファイルのすべてのデータを特別なセクションに送信できるのではないかと考えています。
このリンカー スクリプトを試しました ( link.lds
):
を使用しgcc -c specialdata.c -T link.lds -o specialdata.o
ますが、の出力にobjdump -x specialdata.o
は.data
セクションが表示されますが、セクションは表示されません.mydata
。
私は何を間違っていますか?
c++ - GCC がグローバル インスタンスのコンストラクターへの呼び出しを (ターゲットに応じて) 異なるセクションに配置するのはなぜですか?
空でないコンストラクターを持つグローバル インスタンスの簡単な宣言がいくつかあります。これらのコンストラクターは、起動時に自動的に呼び出されます。Linux 上の C++ をさまざまなマイクロコントローラー ターゲットにクロスコンパイルしています。
はどうかと言うと
- アーム-なし-eabi-gcc-4.8.4
- rx-elf-gcc-4.8-GNURX_v14.03 (GCC 4.8.3)
コンストラクターへの呼び出しはセクションに入れられ.init_array
ます。マップ ファイルは次のようになります。
.init_array 0x00007cb8 0x4 libmotor.o
.init_array 0x00007cbc 0x4 libaudio.o
はどうかと言うと
- mips-elf-gcc-4.8.2
- avr-gcc-4.8.1
- msp430-gcc-4.6.3
これらの呼び出しは.ctors
セクションに入ります:
.ctors 0x000000009d011508 0x4 libmotor.o
.ctors 0x000000009d01150c 0x4 libaudio.o
コンパイルは で行われ-ffunction-sections -fdata-sections
、リンカは を取得し--gc-sections
ました。
すべてのバイナリが機能しますが、すべての呼び出しを同じセクションに入れたいと思います (リンカー スクリプトのメンテナンスを簡素化するため)。
- ターゲット セクションが異なるのはなぜですか?
- コマンド ライン オプションを使用してデフォルト セクションを変更することはできますか?
- コマンド ライン オプションが終了しない場合: GCC コンパイル時にデフォルト セクションを定義することは可能ですか?
c - void 式のアドレスを取得せずにリンカーのみのシンボルを参照する安全な方法はありますか?
void*
ファイルには、次のように使用される一連の void 宣言があります。
これらは、次のようにバイナリ パーティショニングを参照するシンボル (つまり、ポインター) としてリンカー スクリプトによってのみ提供されます。
これにより、次の警告が生成されます。
質問 http ://stackoverflow.com/questions/27263344 への回答に従って、これを次のように変更しました (ポインターを受け取る関数はunsigned long*
とにかく使用します)。
元の定義ではサイズがゼロ (または未定義) であることが示唆されていましたが、現在の定義ではそうではなく、質問27263344への回答とは異なり、論理的に意味のある「実際の基になるデータ型」はありません。
基本的に、有効なポインターを定義しましたが、有効な値を指していないため、逆参照することはできません。
警告を回避するためのより安全または望ましい方法はありますが、スペースが割り当てられているという考えがなければ、逆参照できませんか?
gcc - gcc が使用する実際のデフォルト リンカー スクリプトと設定
gcc が使用する実際のリンカー スクリプトと設定はどこにありますか?
私が試したこと:
具体的にするために、小さなプログラムを考えてみましょう: empty.c
静的にビルドし、結果を見てください。
セグメントにグループ化され、さまざまな権限のメモリ領域に配置されたさまざまなセクションに注意してください。
それでは、このリンクがどのように行われたかについて、できるだけ多くの情報を取得してみましょう。
しかし、スクリプトは長いですが、前述のインポート情報のほとんどが欠落しています。
どのセクションを異なる負荷セグメントに集めるかをどのように知るのでしょうか?
PHDRS コマンドはありません。SEGMENT_START の使用は、このシステムの標準セグメントが別の場所で定義されていることを示唆していますが、関連するセグメントとともにリストされているセクションはありません。
さらに、これらのセグメントをどこにロードするか、またはこれらのメモリ領域にどのような権限があるかをどのように知るのでしょうか?
MEMORY コマンドはありません。繰り返しになりますが、このシステムの標準メモリ領域が別の場所で定義されている場合、使用するメモリ領域をリストするセクションはありません。
マイクロコントローラ用のデフォルト リンカ スクリプトを見たことがありますが、それらは信じられないほど詳細でした。ただし、この出力は、より多くのスクリプトと設定がどこかにあることを示唆しています。
これらの他のリンカー スクリプトの定義と設定はどこに保存されますか?
linux - --gc-sections の後にリンカー変数を更新する
私は cortex-a9 ボードに小さなバイナリを書き、次のようなリンカー スクリプトを定義しました。
しかし、--gc-sections
未使用のセクションが機能して削除された後、機能__heap_start
する前の値のままの--gc-sections
ようです(コードで出力し、ldフラグを確認します):
arm-linux-gnueabihf-gcc -mcpu=cortex-a7 -msoft-float -nostdlib -Wl,--gc-sections -Wl,--print-gc-sections -Wl,-Ttext,0x04000000 -T csrvisor.lds - WL,-Map,binary.map
未使用のセクションを削除__heap_start
した後、正しい値に変更する方法を知っている人はいますか?--gc-sections