Синтаксис компоновщика: компоновщик не использует все флаги компоновщика во время компоновки

У меня есть проект makefile. Я использую gnu gcc и в качестве компоновщика я использую gcc со следующим аргументом:

linkerCmdLine = $ (exe) -Wl, - начальная группа -nostdlib -Map=test_mapfile.map -l:libc.a -l:libgcc.a -l:libm.a -Wl,- конечная группа -o $(выход)

Во время процесса компоновки компоновщик не использует все эти флаги: Флаг -Map=test_mapfile.map не используется

Зачем??

Существует файл настроек проекта, в котором также хранятся настройки компоновщика.

\ u201ClinkerCmdLine \ = $ (exe) -Wl, --start-group -nostdlib -Map \ =. / 99_output / PUZ_GPF.map --gc-section -l\:libc.a -l\:libgcc.a -l\:libm.a -Wl,- конечная группа -o $(вывод)\u201D

Как правильно сохранить настройки?

Отредактировано:

С файлом карты работает нормально, но у меня действительно проблема с файлом компоновщика. Я использую только следующий флаг:

"linkerCmdLine = $ (exe) -Wl, --script = C: /workspace/test_project/test_linker_file.ld -static -o $(вывод)"

Я получаю эту ошибку в окне консоли:

arm-none-eabi-gcc.exe: ошибка: нераспознанный параметр командной строки '--script=C:/workspace/test_project/test_linker_file.ld'

Я не понимаю почему, потому что файл карты и файл.ld относятся к флагам компоновщика.

1 ответ

-Wl, префикс передает только текущий аргумент с запятыми, разделяющими аргументы компоновщика. Итак, чтобы пройти -z defs, вы бы использовали -Wl,-z,defs,

Этот механизм работает только для истинных флагов, т.е. когда позиция в командной строке не имеет значения. -l параметры не являются флагами, и драйвер компилятора gcc собирает их в отдельный список и передает их в одном блоке.

Так что эта техника не работает для той командной строки, которую вы хотите. С другой стороны, -nostdlib тормозит -lc -lgcc -lm это будет по умолчанию.

Обычно в спецификациях gcc есть сценарий (скрипт для драйвера компилятора) для использования --start-group а также --end-group вокруг стандартных библиотек при статической компоновке (что, по-видимому, и нужно).

Так что я думаю, что

linkerCmdLine=$(exe) -Wl,-Map=test_mapfile.map -static -o $(output)

должно работать для вашего случая.

Другие вопросы по тегам