С моей цепочкой инструментов DIY (см. « Построение IDE в классе с Eclipse для ARM ») я получаю полную цепочку инструментов. Мне не нужно собирать эту цепочку инструментов из исходников для Windows, так как все двоичные файлы хорошо скомпилированы и доступны. Но есть одна проблема, с которой я сталкиваюсь время от времени: поскольку библиотеки, предоставляемые ARM, не поставляются с включенными источниками и отладочной информацией, я получаю сообщение «Источник недоступен для…» в отладчике:
Решение состоит в том, чтобы получить исходные тексты библиотек C / C ++ с сайта панели запуска ARM и собрать их локально так, как мне нужно.
Сборка библиотек в Windows
Я перестраиваю библиотеки на моей машине с Windows 7 64bit. К сожалению, я не нашел ни одного хорошего шага или учебника, как это сделать где-либо (вот почему я документирую свои выводы здесь, иначе я просто мог бы указать на существующий учебник). Хотя это будет (или должно?) Быть возможно повторно -соберите все предоставляемые ARM бинарные файлы, меня интересует только создание библиотек newlib и newlib-nano, так что я могу включить отладочную информацию и исходную информацию.
На самом деле, кажется, что делать подобные вещи на машине с Windows еще сложнее, чем в Linux: все файлы и скрипты make настроены для системы Linux, поэтому для того, чтобы это было встроено на мою машину, нужны дополнительные шаги и инструменты. Ну что ж….
Настройка инструментов и сред
Первым шагом является настройка среды, загрузка и установка необходимых инструментов и файлов.
Настройка инструментов arm-none-eabi
Поскольку я хочу собирать библиотеки с помощью предоставленных инструментов arm-none-eabi (компилятор, компоновщик и т. Д.), Я должен убедиться, что они найдены в процессе сборки.
: idea: Обычно я не хочу двоичные файлы GNU в моем глобальном системном пути. Установка глобальных переменных среды — это путь к катастрофе, на мой взгляд. В моей среде инструментов Eclipse я ссылаюсь на цепочку инструментов локально из папки IDE / tools. Ну да ладно, похоже, что по крайней мере для сборки библиотек GNU мне снова придется порвать с принципами ?
MinGW и MSYS
Процесс сборки предполагает использование среды и утилит Linux. Чтобы запустить его на хосте Windows, необходимо установить соответствующую среду. Это MinGW (минималистский GNU для Windows) и MSYS (набор утилит оболочки). Процесс сборки должен запускаться из оболочки MinGW, и его нельзя запустить из обычного приглашения Windows DOS.
Перейдите на http://www.mingw.org/ и загрузите установщик (ссылки на левой стороне):
В диспетчере установки MinGW убедитесь, что установлены эти инструменты (отмечены зеленым квадратом):
Позже нам нужно использовать оболочку MinGW / MSys, и ее нужно запускать с помощью ярлыка. Итак, из msys.bat создайте ярлык на рабочем столе или в меню «Пуск»:
Позже я буду запускать оболочку из этого ярлыка:
Документацию о MSYS можно найти по адресу http://www.mingw.org/wiki/MSYS.
Системный ПУТЬ
У меня есть путь, где у меня есть компилятор (arm-none-eabi-gcc.exe), добавленный в конец моей системной переменной PATH. Для моей DIY IDE это isc: \ tools \ IDE \ gcc \ bin
c:\tools\IDE\gcc\bin
рука-ни-EABI-куб.см
Следующая вещь странная: каким-то образом процесс сборки библиотеки ищет файл arm-none-eabi-cc.exe. Если не найден, он сообщит об ошибке позже в процессе сборки, что arm-none-eabi.cc.exe не был найден.
Другие также сообщали об этой проблеме (см. Http://stackoverflow.com/questions/3660672/getting-error-on-compiling-newlib ). Чтобы решить эту проблему, я скопировал файл arm-none-eabi-gcc.exe и назвал его arm-none-eabi-cc.exe.
Установка источников библиотеки
С https://launchpad.net/gcc-arm-embedded загрузите пакет с исходным кодом (на данный момент это gcc-arm-none-eabi-4_8-2014q2-20140609-src.tar.bz2), а затем распакуйте его.
В этом уроке я распаковал файлы в папку с именем lib_build внутри моей цепочки инструментов:
C:\Tools\IDE\gcc\lib_build\gcc-arm-none-eabi-4_8-2014q2-20140609
В нем несколько zip-файлов, но мне нужны только распакованные newlib-nano-2.1.tar.bz2 и newlib.tar.bz2. Я распаковал их в папку ‘src’ (см. Скриншот выше).
Исправление сборки библиотеки
К сожалению, сборка не работает из коробки (по крайней мере, под Windows). Я обнаружил две проблемы, которые нужно исправить, чтобы успешно запустить сборку:
- Необходимо изменить окончание строки для MakeInfo в файле .texi.
- Исправьте правила файла make в файле Makefile.in
Исправление для MakeInfo
В 64-битной системе Windows, кажется, существует давняя проблема, с которой MakeInfo терпит неудачу:
Unknown index 'fn' and/or 'cp' in ...
MakeInfo создает документацию и, похоже, не может прочитать информацию о библиотеке (пока она работает в Linux). См. Https://sourceware.org/bugzilla/show_bug.cgi?id=14678 для получения подробной информации об этой ошибке. Проблема очень вероятна, потому что у makeinfo есть проблема с окончаниями строки Windows. Открыть файл
src\newlib-nano-2.1\etc\standards.texi
в Eclipse и преобразовать разделители строк файла в стиль Unix, затем сохранить файл:
Сделайте то же самое для файла newlib
src\newlib\etc\standards.texi
Исправление файла библиотеки Makefile.in
Существует проблема с правилами make file в части libgloss:
*** No rule to make target '../../../../../newlib-nano-2.1/libgloss/arm/../config/default.hm', needed by 'Makefile'. Stop.
Обходной путь (см. Это обсуждение ) заключается в исправлении файла ‘Makefile.in’:
src\newlib-nano-2.1\libgloss\arm\cpu-init\Makefile.in
Детали патча:
From: Agustin Henze <[email protected]> Date: Fri, 3 Jan 2014 11:29:55 -0300 Subject: [PATCH] Fix wrong path to libgloss/config/default.mh --- libgloss/arm/cpu-init/Makefile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libgloss/arm/cpu-init/Makefile.in b/libgloss/arm/cpu-init/Makefile.in index 547c58d..d63149f 100644 --- a/libgloss/arm/cpu-init/Makefile.in +++ b/libgloss/arm/cpu-init/Makefile.in @@ -18,6 +18,7 @@ libdir = @libdir@ tooldir = $(exec_prefix)/$(target_alias) objtype = @objtype@ +host_makefile_frag = $(srcdir)/../../config/default.mh INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -80,7 +81,7 @@ info: install-info: clean-info: -Makefile: Makefile.in ../config.status @host_makefile_frag_path@ +Makefile: Makefile.in ../config.status ${host_makefile_frag_path} $(SHELL) ../config.status --file cpu-init/Makefile ../config.status: ../configure -- 1.8.5.2
Либо примените файл исправления, либо откройте Makefile.in в редакторе и добавьте:
host_makefile_frag = $(srcdir)/../../config/default.mh
Внизу файла измените строку Makefile на:
Makefile: Makefile.in ../config.status ${host_makefile_frag_path}
Makefile.in Patch Часть 2
Сделайте то же самое для этого файла make в источниках библиотеки newlib:
src\newlib\libgloss\arm\cpu-init\Makefile.in
Благодаря двум исправлениям, примененным как к newlib-nano, так и к newlib, я смог собрать библиотеки на следующем шаге.
Строим библиотеки
Building each of the libraries (newlib and newlib-nano) is a multi-step process:
- Configure the build
- Run the make file to build
- Run the make file to install/copy the files
The question is: what are the correct parameters to configure the build?
The answer is: have a look at the build-toolchain.sh provided in the source package, and locate the parameters for the newlib-nano and newlib packages:
I have created two shell scripts which will do the necessary calls for me, but you can execute the commands one-by-one on the shell too:
This is the build script for the newlib-nano:
# Script to build newlib and newlib-nano # IMPORTANT: # - make sure the cross-tool chain is present in the PATH # - untar newlib-nano-2.1.tar.tar.bz2 # - untar newlib.tar.bz2 TARGET=arm-none-eabi ROOT=/C/tools/IDE/gcc/lib_build/ BUILDDIR_NATIVE=$ROOT/install-native.newLibnano echo Creating build directory... mkdir newlib-nano.build echo Entering build directory... cd newlib-nano.build # run configure program to configure the build echo Configuring newlib-nano build... ../gcc-arm-none-eabi-4_8-2014q2-20140609/src/newlib-nano-2.1/configure \ --target=$TARGET \ --prefix=$BUILDDIR_NATIVE/target-libs \ --disable-newlib-supplied-syscalls \ --enable-newlib-reent-small \ --disable-newlib-fvwrite-in-streamio \ --disable-newlib-fseek-optimization \ --disable-newlib-wide-orient \ --enable-newlib-nano-malloc \ --disable-newlib-unbuf-stream-opt \ --enable-lite-exit \ --enable-newlib-global-atexit \ --disable-nls echo Building newlib-nano... make -j echo Installing... make install
And the same for the newlib:
# Script to build newlib # IMPORTANT: # - make sure the cross-tool chain is present in the PATH # - untar newlib.tar.bz2 TARGET=arm-none-eabi ROOT=/C/tools INSTALLDIR_NATIVE=$ROOT/install-native.newLib INSTALLDIR_NATIVE_DOC=$INSTALLDIR_NATIVE/share/doc/gcc-arm-none-eabi echo Creating build directory... mkdir newlib.build echo Entering build directory... cd newlib.build # run configure program to configure the build echo Configuring newlib build... ../gcc-arm-none-eabi-4_8-2014q2-20140609/src/newlib/configure \ --target=$TARGET \ --prefix=$INSTALLDIR_NATIVE \ --infodir=$INSTALLDIR_NATIVE_DOC/info \ --mandir=$INSTALLDIR_NATIVE_DOC/man \ --htmldir=$INSTALLDIR_NATIVE_DOC/html \ --pdfdir=$INSTALLDIR_NATIVE_DOC/pdf \ --enable-newlib-io-long-long \ --enable-newlib-register-fini \ --disable-newlib-supplied-syscalls \ --disable-nls #echo Building newlib-nano... make -j #echo Installing... make install
Чтобы собрать библиотеки, запустите msys.bat с ранее созданным ярлыком и cd (изменить каталог) в папку, в которую мы распаковали исходный пакет, и запустите указанные выше сценарии оболочки или выполните команды в командной строке.
Если делать это прямо в командной строке, я покажу это здесь для newlib-nano.
Создайте папку ‘newlib-nano.build’
mkdir newlib-nano.build
Cd (изменить каталог) в эту папку.
cd newlib-nano.build
Запустите команду настройки:
../newlib-nano-2.1/configure --target=arm-none-eabi --prefix=/C/tools/newlib-nano-arm-none-eabi --disable-newlib-supplied-syscalls --enable-newlib-reent-small --disable-newlib-fvwrite-in-streamio --disable-newlib-fseek-optimization --disable-newlib-wide-orient --enable-newlib-nano-malloc --disable-newlib-unbuf-stream-opt --enable-lite-exit --enable-newlib-global-atexit --disable-nls
Then do a make witih
make -j
and finally install it with
make install
The needed configuration options can be taken from the ‘build-toolchain.sh’ present in the root of the source zip file.
The build is then started with
make -j
The build process takes about 30 minutes.
If finished successfully, use
make install
To ‘install’ the libraries into the folder specifed with –prefix in the configuration settings.
Assembling the Libraries
Now I have the two libraries built:
- newlib-nano in lib_build\install-native.newLibnano\target-libs\arm-none-eabi\lib
- newlib in lib_build\install-native.newLib\arm-none-eabi\lib
The newlib-nano libs have a *_s.a extension, so I rename them with a shell script:
NEWLIB_NANO_LIB=./install-native.newLibnano/target-libs/arm-none-eabi/lib INST_LIB=./build.install/arm-none-eabi/lib echo Creating directories mkdir ./build.install cd ./build.install mkdir ./arm-none-eabi cd ./arm-none-eabi mkdir ./lib cd ./lib mkdir ./armv6-m mkdir ./armv7-ar mkdir ./armv7e-m mkdir ./armv7-m mkdir ./cpu-init mkdir ./fpu mkdir ./thumb cd ../.. echo Rename newlib-nano files mv $NEWLIB_NANO_LIB/libc.a $(NEWLIB_NANO_LIB)/libc_s.a mv $NEWLIB_NANO_LIB/libg.a $NEWLIB_NANO_LIB/libg_s.a mv $NEWLIB_NANO_LIB/armv6-m/libc.a $(NEWLIB_NANO_LIB)/armv6-m/libc_s.a mv $NEWLIB_NANO_LIB/armv6-m/libg.a $NEWLIB_NANO_LIB/armv6-m/libg_s.a mv $NEWLIB_NANO_LIB/armv7-ar/libc.a $NEWLIB_NANO_LIB/armv7-ar/libc_s.a mv $NEWLIB_NANO_LIB/armv7-ar/libg.a $NEWLIB_NANO_LIB/armv7-ar/libg_s.a mv $NEWLIB_NANO_LIB/armv7e-m/libc.a $NEWLIB_NANO_LIB/armv7e-m/libc_s.a mv $NEWLIB_NANO_LIB/armv7e-m/libg.a $NEWLIB_NANO_LIB/armv7e-m/libg_s.a mv $NEWLIB_NANO_LIB/armv7-m/libc.a $NEWLIB_NANO_LIB/armv7-m/libc_s.a mv $NEWLIB_NANO_LIB/armv7-m/libg.a $NEWLIB_NANO_LIB/armv7-m/libg_s.a mv $NEWLIB_NANO_LIB/fpu/libc.a $NEWLIB_NANO_LIB/fpu/libc_s.a mv $NEWLIB_NANO_LIB/fpu/libg.a $NEWLIB_NANO_LIB/fpu/libg_s.a mv $NEWLIB_NANO_LIB/thumb/libc.a $NEWLIB_NANO_LIB/thumb/libc_s.a mv $NEWLIB_NANO_LIB/thumb/libg.a $NEWLIB_NANO_LIB/thumb/libg_s.a
And then move the newlib libraries over the newlib-nano libraries (merge):
mv -r $NEW_LIB/* $NEWLIB_NANO_LIB/*
With this, I have a new ‘lib’ folder I can use. I rename my original gcc/arm-none-eabi/lib one to lib.orig and copy my new library folder:
With this, I have my new library in place, and can go back to the original state if necessary.
Debugging the Library with Source Code
The the benifit of all the work: I can now debug and step through the library code with source files displayed:
? ? ?
Summary
It takes some time and knowledge to build the newlib and newlib-nano libraries from the sources. But doing so, I can build the libraries with debug information. What is missing now is a good way to provide my custom optimization options for the library build, and an automated way/script to build my set of library files.
Having the ability to re-build the library sources the way I want is a huge advantage of using open source libraries and tools. Yet another reason the swap out proprietary libraries as shown in this post :-).
Happy Libraring ?