2

リンカー スクリプトを使用して ctor のような関数リストを作成する方法を説明する私の回答に対する素晴らしいコメントは、最近の GNU ld が、-Wl,-T...およびINSERT BEFORE/を使用して新しいセクションをシステム リンカー スクリプトに移植するためのサポートを大幅に改善したことを指摘しましたINSERT AFTER。これにより、他のリンカー スクリプトのトリックについて考えるようになりました。

ネットワーク カード ファームウェアの場合、リンカ スクリプトを修正して、ファームウェアのランタイム モジュールをグループ化し、すべてのモジュールが競合せずに L1 キャッシュに配置できる連続したブロックに配置されるようにしました。ストラグラー ( でグループ化できなかった.o部分) をクリーンアップするために、個々の関数でセクション属性を使用しました。パフォーマンス カウンターは、実際に機能することを確認しました (L1 命令キャッシュ ミスをほとんどゼロに減らしました)。

リンカー スクリプトを使用して、他にどのような巧妙なことを達成しましたか?

4

1 に答える 1

3

特定のプラットフォームでは、説明しない理由で、ロード後に破棄できる実行可能ファイルのセクションが必要でした。残念ながら、実行可能ファイルのメモリのマッピングを解除することはできなかったため、リンカーのトリックに頼らざるを得ませんでした。

私がやったことは、bssをエイリアスする実行可能ファイルのセクションを導入することでした。そうすれば、十分に早い段階でコードをこっそり持ち込めると仮定して、データをコピーしてbssを再初期化でき、エイリアスセクションが実行可能ファイルの合計bssよりも小さい限り、特権に費用はかかりませんでした。crtをまったく変更できず、コードを挿入できる最初のポイントはまだtlsの初期化(いくつかのbssを使用)後だったという点でいくつかの問題がありますが、回避することは不可能ではありません。

私はまだそれがうまくいったことに少し驚いています、私はすべてのプログラムセクションがロードされた後にbssがcrtによって初期化されたと思ったでしょう。ローダーまたはcrtソースにアクセスできるプラットフォームでは試していません。

于 2010-11-12T17:15:37.123 に答える