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

0

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

linkerCmdLine = $ (exe) -Wl, - start-group -nostdlib -Map = test_mapfile.map -l: libc.a -l: libgcc.a -l: libm.a -Wl, --end-group -o $ (выход)

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

Зачем??

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

\u201ClinkerCmdLine\= $ (exe) -Wl, --start-group -nostdlib -Map\=./99_output/PUZ_GPF.map --gc-sections -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 $ (output)"

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

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

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

Теги:
linker
linker-flags

1 ответ

3

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

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

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

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

Поэтому я думаю, что

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню