Není to chyba, protože ld
se chová podle jeho specifikace. Manuálová stránka ld
2.28 zní:
Pokud linker nedokáže rozpoznat formát souboru objektu, bude předpokládat, že se jedná o linker skript. Takto zadaný skript rozšiřuje hlavní skript linkeru použitý pro odkaz (buď výchozí skript linkeru nebo skript zadaný pomocí -T). Tato funkce umožňuje linkeru propojit se se souborem, který se jeví jako objekt nebo archiv, ale ve skutečnosti pouze definuje některé hodnoty symbolů nebo používá „INPUT“ nebo „GROUP“ k načtení jiných objektů. Zadání skriptu tímto způsobem pouze rozšíří hlavní skript linkeru o další příkazy umístěné za hlavním skriptem; použijte volbu -T k úplnému nahrazení výchozího skriptu linkeru, ale všimněte si účinku příkazu "INSERT".
TL;DR ☺. Stručně řečeno:Ve většině případů si uživatelé nejsou vědomi skriptu linkeru, který používají, protože „hlavní skript“ (=výchozí skript ) zajišťuje řetěz nářadí. Hlavní skript silně odkazuje na vnitřní části sekcí generovaných kompilátorem a musíte se naučit, jak to změnit. Většina uživatelů ne.
Běžný přístup k poskytování vlastního skriptu je pomocí -T
volba. Tímto způsobem je hlavní skript linkeru ignorován a váš skript převezme kontrolu nad propojením. Vše ale musíte napsat od začátku.
Pokud chcete přidat pouze drobnou funkci, můžete zapsat své specifikace do souboru a připojit název souboru na příkazový řádek ld
(nebo gcc / g++) bez -T
volba. Tímto způsobem hlavní skript linkeru stále dělá hlavní práci, ale váš soubor ji rozšiřuje. Pokud použijete tento přístup, dostanete zprávu v záhlaví tohoto vlákna, která vás informuje, že jste mohli neúmyslně poskytnout poškozený objekt.
Zdrojem tohoto zmatku je, že neexistuje způsob, jak určit roli dalšího souboru. To by se dalo snadno vyřešit přidáním další možnosti do ld
stejně jako -dT
možnost pro „d efault scriptfile”:Zaveďte -sT
možnost pro „s doplňkový soubor skriptu“.
Je to chyba v určitých verzích LD. Prostě to zatím ignorujte, nebo se podívejte, jestli vaše distribuce nemá aktualizaci pro váš LD. (balíček binutils)
http://www.freepascal.org/faq.var#unix-ld219