Статьи

GNU Libs с отладочной информацией: перестройка библиотек GNU ARM

С моей цепочкой инструментов 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

В диспетчере установки MinGW убедитесь, что установлены эти инструменты (отмечены зеленым квадратом):

Менеджер установки MinGW

Менеджер установки MinGW

Позже нам нужно использовать оболочку MinGW / MSys, и ее нужно запускать с помощью ярлыка. Итак, из msys.bat создайте ярлык на рабочем столе или в меню «Пуск»:

Создать ярлык для msys.bat

Создать ярлык для msys.bat

Позже я буду запускать оболочку из этого ярлыка:

Ярлык на рабочем столе Windows

Ярлык на рабочем столе Windows

Документацию о 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). Я обнаружил две проблемы, которые нужно исправить, чтобы успешно запустить сборку:

  1. Необходимо изменить окончание строки для MakeInfo в файле .texi.
  2. Исправьте правила файла make в файле Makefile.in

Исправление для MakeInfo

В 64-битной системе Windows, кажется, существует давняя проблема, с которой MakeInfo терпит неудачу:

Unknown index 'fn' and/or 'cp' in ...

Ошибка MakeInfo

Ошибка MakeInfo

MakeInfo создает документацию и, похоже, не может прочитать информацию о библиотеке (пока она работает в Linux). См. Https://sourceware.org/bugzilla/show_bug.cgi?id=14678 для получения подробной информации об этой ошибке. Проблема очень вероятна, потому что у makeinfo есть проблема с окончаниями строки Windows. Открыть файл

src\newlib-nano-2.1\etc\standards.texi

в Eclipse и преобразовать разделители строк файла в стиль Unix, затем сохранить файл:

Преобразование разделителей файлов в Unix

Преобразование разделителей файлов в 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.
Нет правила, чтобы сделать цель для libgloss

Нет правила, чтобы сделать цель для libgloss

Обходной путь (см. Это обсуждение ) заключается в исправлении файла ‘Makefile.in’:

src\newlib-nano-2.1\libgloss\arm\cpu-init\Makefile.in

Детали патча:

From: Agustin Henze <tin@debian.org>
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.in Patch Часть 1

Makefile.in Patch Часть 1

Внизу файла измените строку Makefile на:

Makefile: Makefile.in ../config.status ${host_makefile_frag_path}

Makefile.in Patch Часть 2

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:

  1. Configure the build
  2. Run the make file to build
  3. 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:

Опции конфигурации Newlib-nano

Newlib-nano configuration options

параметры конфигурации newlib

newlib configuration options

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:

Сценарии сборки

Build Scripts

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
Сделать команду

Make command

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:

Новая папка библиотеки с оригиналом в качестве резервной копии

New Library Folder with Original as Backup

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:

Библиотека отладки с исходным кодом

Debugging Library with Source Code

🙂 🙂 🙂

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 🙂