Синтаксис компоновщика: компоновщик не использует все флаги компоновщика во время компоновки
У меня есть проект 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)
должно работать для вашего случая.