Внедрение разделов в GNU ld скрипт; Совместимость скриптов между версиями binutils. - PullRequest
12 голосов
/ 29 июля 2011

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

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

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

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

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

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

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

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

1 Ответ

17 голосов
/ 29 августа 2011

Я нашел удовлетворительное решение для этой проблемы.GNU ld имеет опцию INSERT, которая позволяет внешне поддерживаемому сценарию не переопределять сценарий по умолчанию, а просто добавлять новый раздел в позиции относительно некоторого раздела, существующего в сценарии по умолчанию.

Так что в моем случае сценарий прошелдля компоновщика может быть просто:

SECTIONS
{
  .rodata.ld_comp_array :
  {
    *(SORT_BY_NAME(.ld_comp_array*))
  }
}
INSERT AFTER .rodata;

Подробнее о опции INSERT: http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...