Использование LTO с arm-none-eabi и newlib-nano - PullRequest
0 голосов
/ 06 июня 2018

Я работаю над голым железом для проекта STM32F103 и использую GNU ARM Embedded версии 7-2017-q4-major .Я сейчас компилирую с помощью GNU ARM Eclipse.

Я нахожусь в точке, где мне нужно начать оптимизацию проекта для скорости, и в качестве первого шага я, конечно, попытался включить все флаги оптимизатора.,Все остальное прошло нормально, но когда я пытаюсь включить Link Time Optimization с помощью -flto, я получаю ошибки компоновщика на последнем этапе:

Invoking: Cross ARM C++ Linker
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -O3 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -Wall -Wextra  -g3 -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"Project.map" -Xlinker --cref --specs=nano.specs -o "Project.elf"  ./tiny-mt/tinymt/tinymt32.o  ... .o   
/Users/me/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/libg_nano.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
/Users/me/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/libg_nano.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
collect2: error: ld returned 1 exit status
make: *** [Project.elf] Error 1

Это, вероятно, связано с тем, что newlib-nano не компилируется сLTO?

Так как мне заставить это работать?Я полагаю, что я мог бы попробовать скомпилировать newlib-nano самостоятельно и добавить необходимые флаги (и изменить инструменты на использование -gcc-ar и т. Д.), Но я представляю / надеюсь, что кто-то уже сделалэтот?Моего гугл-фу оказалось недостаточно, чтобы найти что-нибудь полезное.

1 Ответ

0 голосов
/ 06 июня 2018

nosys.specs указывает, что ссылка -lnysys должна обеспечивать реализации заглушки для _fstat и _isatty и других стандартных / posix функций.
Из опции ручной ссылки gcc:

-llibrary
Поиск библиотеки с именем библиотека при связывании....
Имеет значение, где в команде вы пишете эту опцию;компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке.Таким образом, 'foo.o -lz bar.o' ищет библиотеку 'z' после файла foo.o, но перед bar.o.Если bar.o ссылается на функции в 'z', эти функции могут быть не загружены.

Так что, если вы переместите --specs=nano.specs в конец команды ссылки, ваши источники будут ссылаться на -lnosys и правильно использовать _isatty и _fstat реализации из библиотеки libnosys.Вот так:

arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -O3 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -Wall -Wextra  -g3 -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"Project.map" -Xlinker --cref -o "Project.elf"  ./tiny-mt/tinymt/tinymt32.o  ... .o --specs=nano.specs

Я могу предположить, что newlib-nano, скомпилированный без LTO, не имеет к этому никакого отношения.Я использую несколько проектов с LTO с newlib-nano, и они работают просто отлично.Обычно LTO работает действительно хорошо, удаляет слои функций абстракции, предсказуемо, действительно хорошо оптимизирует, но у меня есть только 2 года опыта его использования.Я использую -Ofast -flto -fno-fat-lto-objects, если мне действительно нужна скорость (и я могу жить с нестандартным поведением).

...