Я пишу скрипт компоновщика для LD, чтобы собрать все разделы .init_array
для того, чтобы вызвать конструктор всех глобальных объектов, заявленных в моей прошивке.
Все работает нормально, если у меня нет глобального объекта, на который нет ссылок, в статическом
библиотека. В этом случае, несмотря на то, что я использую макрос KEEP, как указано ниже, объект, на который нет явной ссылки, он отбрасывается в конечном двоичном файле. (независимо от того, использую я -gc-секции или нет).
Если тот же самый объект, на который нет ссылок, находится вне статической библиотеки, то есть
пойманный общей строкой сценария компоновщика, он включается.
.init_array :
{
_init_array_start = .;
KEEP (*core*:*(SORT(.init_array*)))
KEEP (*core*:*(.init_array))
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE (_init_array_end = .);
} > flash
Библиотека называется libcore.a. Другие объекты, явно указанные в libcore.a, включаются.
Любая помощь о том, как это исправить, будет очень признателен.
заранее спасибо
Статические библиотеки на самом деле ar
архив, содержащий несколько .o
файлы и индекс. Индекс используется для определения того, какой .o
файлы для ссылки в зависимости от того, на какие символы ссылалась основная программа. Как таковой, если нет символов из .o
файл ссылки, компоновщик не будет даже нагрузка .o
рассматриваемый файл, поэтому скрипт компоновщика никогда не попадет в него.
Предполагая, что вы используете GNU LD, вы можете использовать ld
«s -r
флаг для объединения нескольких .o
файлы в один libcore.o
файл, и используйте его как единственный .o
файл в архиве. Недостатком этого является то, что вы потенциально можете использовать ненужный код, который в противном случае был бы пропущен при пропуске .o
файлы. Кроме того, вы также можете добавить фиктивные ссылки из всех других .o
файлы в архиве на .o
файл с вашим статическим конструктором.
Других решений пока нет …