ld
なのでバグではありません その仕様のように動作します。 ld
の man ページ 2.28 読み取り:
リンカーがオブジェクト ファイルの形式を認識できない場合、リンカー スクリプトであると見なされます。この方法で指定されたスクリプトは、リンクに使用されるメイン リンカー スクリプト (デフォルトのリンカー スクリプトまたは -T を使用して指定されたスクリプト) を拡張します。この機能により、リンカは、オブジェクトまたはアーカイブのように見えるファイルに対してリンクすることができますが、実際には単にいくつかのシンボル値を定義するか、「INPUT」または「GROUP」を使用して他のオブジェクトをロードします。この方法でスクリプトを指定しても、メイン リンカー スクリプトが拡張されるだけで、メイン スクリプトの後に追加のコマンドが配置されます。 -T オプションを使用してデフォルトのリンカー スクリプトを完全に置き換えますが、「INSERT」コマンドの効果に注意してください。
TL;DR ☺。簡単に言えば:ほとんどの場合、ユーザーは使用しているリンカー スクリプトを認識していません。これは、「メイン スクリプト」(=デフォルト スクリプト) ) は、ツール チェーンによって提供されます。メイン スクリプトは、コンパイラによって生成されたセクションの組み込み関数を頻繁に参照しており、それを変更するにはロープを学ぶ必要があります。ほとんどのユーザーはそうしません。
独自のスクリプトを提供する一般的な方法は、-T
を使用することです。 オプション。そうすれば、メイン リンカー スクリプトは無視されます スクリプトがリンケージの制御を引き継ぎます。ただし、すべてをゼロから作成する必要があります。
マイナーな機能を追加するだけの場合は、仕様をファイルに書き込んで、そのファイル名を ld
のコマンド ラインに追加します。 (または gcc / g++) なし -T
オプション。そうすれば、メインのリンカ スクリプトが引き続き主要な作業を行いますが、ファイルがそれを補強します。このアプローチを使用すると、このスレッドのヘッダーのメッセージを受け取り、意図せずに破損したオブジェクトを提供した可能性があることを通知します。
この混乱の原因は、追加ファイルの役割を指定する方法がないことです。これは ld
に別のオプションを追加することで簡単に解決できます -dT
のように 「d」のオプション デフォルトのスクリプトファイル」:-sT
を導入する 「」のオプション 補足スクリプトファイル」.
これは特定の LD バージョンのバグです。今は無視するか、ディストリビューションに LD の更新があるかどうかを確認してください。 (パッケージ binutils)
http://www.freepascal.org/faq.var#unix-ld219