Зачем указывать целевую архитектуру для компоновщика? - PullRequest
0 голосов
/ 12 октября 2019

Я работал над использованием системы сборки Meson для встроенного проекта. Поскольку я работаю на встроенной платформе, я написал собственный скрипт компоновщика, а также вызов для компоновщика. У меня не было проблем, пока я не попытался связать в newlib свой проект, когда у меня начались проблемы со связью. Непосредственно перед тем, как я заработал, последней ошибкой было undefined reference to main, которое, как я знал, было явно в проекте.

В связи с этим я попытался добавить -mcpu=cortex-m4 к своему вызову компоновщика (я использую gccчтобы связать, мне говорят, что это довольно типично, вместо прямого вызова ld). Это сработало! Теперь мой единственный вопрос - «почему»?

Возможно, я что-то упускаю из-за того, как на самом деле работает процесс компоновки, но, учитывая, что я просто создаю файл ELF, я не думал, что было бы важно указатьархитектура процессора для компоновщика. Это вещь newlib, или gcc просто делал за кадром магию для меня, чего я раньше не видел?

Для справки вот мой проект (этоне завершено)

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Такие опции компоновщика гарантируют, что соответствующая стандартная библиотека и стартовый код связаны, когда они имеют значения по умолчанию, а не явно указаны или переопределены.

Одна цепочка инструментов ARM поддерживает различные архитектуры ARM варианты и варианты;они могут быть большими или байтовыми, иметь различные наборы инструкций - ARM, Thumb. Thumb-2, ARM64 и т. Д., А также различные расширения, такие как SIMD или DSP. Для компоновщика требуется информация об архитектуре, чтобы выбрать правильную библиотеку для связи как для производительности, так и для двоичной совместимости.

0 голосов
/ 12 октября 2019

Как правило, вы всегда должны ссылаться через драйвер компилятора (формы ссылки команды gcc), а не через прямой вызов ld. Если вы разрабатываете «голое железо» для конкретной конкретной цели, можно определить набор необходимых вам аргументов компоновщика и использовать ld напрямую, но есть много вещей, о которых позаботится драйвер компилятора, и обычно лучшечтобы позволить это. (Если у вас нет единой фиксированной цели, существует неограниченное количество комбинаций возможностей, и вы ни в коем случае не можете воспроизвести все настоящие и будущие, которые могут вас заинтересовать.)

Вы все равно можете передавать любые параметры, которые вам нравятсякомпоновщик, например, пользовательские скрипты компоновщика, через -Wl,... формы выбора.

Что касается того, почему уровень ISA конкретной целевой архитектуры может иметь значение для компоновки, компоновка - это не тупой процесс простого склеивания двоичных фрагментов. Связывание может включать в себя исправление (перемещение) или даже генерацию (спасибо за удаленные цели перехода и т. Д.) Кода, и в этом случае компоновщику может потребоваться заботиться о том, на какой конкретный уровень / вариант ISA он нацелен.

...