Внедрение разделов в сценарий GNU ld; совместимость скриптов между версиями binutils.

Я создаю что-то вроде вопроса Как собрать данные из разных файлов .a в один массив? Как сохранить разделы в файлах .a с помощью ld-скрипта? , т.е. массивы, составленные во время компоновки вне элементов из разных объектных файлов.

В моем случае существует несколько массивов, каждый из которых находится в своем собственном разделе .ld_comp_array_ *, где * соответствует имени массива. Затем я беру сценарий компоновщика по умолчанию с помощью ld --verbose и изменяю его, помещая все эти разделы (отсортированные, чтобы элементы разных массивов не смешивались) в раздел вывода:

KEEP (*(SORT_BY_NAME(.ld_comp_array*)))

и все работает нормально.

Затем все становится немного сложнее, потому что приложения, использующие эту функцию, могут быть созданы для различных платформ - до сих пор я успешно пробовал AVR Xmega в качестве целевой платформы, а также 32-разрядную Windows и Linux. 32- и 64-битные для модульного тестирования, и список открыт (в ближайшем будущем, вероятно, будут добавлены новые платформы).

Однако для каждой конкретной платформы сценарии компоновщика по умолчанию отличаются от сценариев на других платформах, и в настоящее время я вставляю разделы .ld_comp_array * вручную - можно ли сделать это как-то автоматически? Единственное решение, о котором я подумал, - это разобрать сценарий по умолчанию и вставить приведенное выше описание раздела ввода, но это кажется слишком тяжелым.

Я мог бы сделать это вручную, если бы не было относительно простого решения, но я не уверен, могут ли скрипты по умолчанию, полученные из локальной версии ld, сломаться на другой версии binutils. Может ли кто-нибудь уточнить, безопасно это или нет?

В случае, если это можно сделать автоматически, можно ли «вставлять» спецификацию секции ввода всегда непосредственно в секцию .text, предполагая, что массивы должны быть «неизменяемыми»?

13
задан Community 23 May 2017 в 11:53
поделиться