Есть ли способ заставить линкер сортировать эти объекты?
Нет, особенно если учесть, что критерии упорядочения могут быть произвольными.
Однако вы не на самом деле не нужно сортировать объекты: вы можете сортировать массив указателей на объекты (созданные во время инициализации) и выполнять последующий поиск по этому массиву.
Я знаю, что могу легко вывести дамп object_section, сортируйте его (по собственному приложению) и обновляйте с помощью objcopy, но это полностью испортит опыт отладки и прямой вызов любого объекта, потому что обновление содержимого раздела не обновит адреса символов (или, возможно, я ошибаюсь).
Это не только вещь objcopy
испортит. Это также испортит правильность : ваш Data
член указывает на некоторые другие данные, что означает, что с каждым экземпляром связаны записи о перемещении. Если вы сортируете TObjectParams
экземпляров без обновления записей перемещения, ваши указатели Data
будут указывать на неправильные данные конфигурации после objcopy
.
Обновление:
это решение частично удовлетворяет.
Если вы можете включить данные конфигурации напрямую в TObjectParams
, они станут больше, а накладные расходы указателей уменьшатся.
Если сами данные конфигурации не имеют указателей на другие данные, то вы можете напрямую отсортировать содержимое раздела и полностью исключить накладные расходы.
Если вы не можете избавиться от указателей , тогда вам придется написать собственный инструмент для манипулирования ELF, который будет сортировать данные и связанные записи перемещения. Такой инструмент может также обновить раздел символов для устранения неполадок.
Однако я думаю, что существует значительно более простое решение, по крайней мере, в случае, когда в данном .o
есть единичные случаи TObjectParams
. файл (или если для данного .o
гарантированно имеются только последовательные файлы ID
s и .o
, которые не перекрываются в содержащихся в них ID
s):
- Put все
TObjectParams
в отдельном разделе, как вы делаете сейчас. Связать двоичный файл. Это создаст двоичный файл с несортированным разделом, и единственная причина для этой ссылки - получить список объектов, которые вошли в этот двоичный файл.
Если вы уже ведете такой список отдельно, этот шаг можно пропустить.
Для каждого объектного файла в списке, начиная с шага 2 (foo.o
), используйте objcopy
, чтобы получить два новых объекта: один только с интересующим разделом (foo_w.o
) и один с этим разделом удален (foo_x.o
).
Сортировать список {foo,bar,baz}_w.o
по ID
, содержащемуся внутри.
Выполните окончательную ссылку, используя {foo,bar,baz}_x.o
в любом порядке и {foo,bar,baz}_w.o
в отсортированном порядке. Компоновщик обычно не переупорядочивает содержимое раздела, и эта ссылка должна создавать желаемый конечный двоичный файл.