Это не ошибка, потому что ld
ведет себя как его спецификация. Страница руководства ld
2.28 гласит:
Если компоновщик не может распознать формат объектного файла, он будет считать, что это сценарий компоновщика. Сценарий, указанный таким образом, дополняет основной сценарий компоновщика, используемый для ссылки (либо сценарий компоновщика по умолчанию, либо тот, который указан с помощью -T). Эта функция позволяет компоновщику связываться с файлом, который выглядит как объект или архив, но на самом деле просто определяет некоторые значения символов или использует «INPUT» или «GROUP» для загрузки других объектов. Указание сценария таким образом просто дополняет основной сценарий компоновщика дополнительными командами, размещенными после основного сценария; используйте параметр -T, чтобы полностью заменить сценарий компоновщика по умолчанию, но обратите внимание на эффект команды «INSERT».
TL;DR ☺. В двух словах: в большинстве случаев пользователи не знают об используемом ими скрипте компоновщика, поскольку «основной скрипт» (= сценарий по умолчанию) предоставляется цепочкой инструментов. Основной скрипт в значительной степени ссылается на встроенные функции разделов, сгенерированных компилятором, и вам нужно изучить веревки, чтобы изменить его. Большинство пользователей этого не делают.
Обычный подход к предоставлению собственного сценария — через параметр -T
. Таким образом, основной скрипт компоновщика игнорируется, и ваш скрипт берет на себя управление компоновкой. Но приходится писать все с нуля.
Если вы просто хотите добавить небольшую функцию, вы можете записать свои спецификации в файл и добавить имя файла в командную строку ld
(или gcc/g++) без параметра -T
. Таким образом, основной скрипт компоновщика по-прежнему выполняет основную работу, но ваш файл дополняет ее. Если вы используете этот подход, вы получите сообщение заголовка этого потока, чтобы сообщить вам, что вы, возможно, непреднамеренно предоставили сломанный объект.
Источник этой путаницы в том, что нет возможности указать роль дополнительного файла. Эту проблему можно легко решить, добавив к ld
еще один параметр, аналогичный параметру -dT
для «dфайла сценария по умолчанию»: введите параметр -sT
для «sдополнительный файл сценария».
person
hermannk
schedule
15.01.2019