Я нахожусь на (очень) ранних стадиях разработки контроллера полета БПЛА на BeagleBone Black. Я должен отметить, что я довольно новичок в том, что касается BBB, Linux и встраиваемых систем. Я сосредоточился на теории управления — это моя первая попытка практической реализации вне Matlab Simulations. Моя текущая система выглядит следующим образом:
Хост-> Windows 8.1 x64 под управлением Eclipse Luna (4.4.0)
Цель -> BeagleBone Black rev. B работает Ubuntu 13.10
Целевая информация
root@arm:~# uname -a
Linux arm 3.8.13-bone32 #1 SMP Fri Dec 13 20:05:25 UTC 2013 armv7l armv7l armv7l GNU/Linux
Целевая версия gcc
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.8/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.8.1-10ubuntu9' --with-bugurl=file:///usr/shar
e/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8
--enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --w
ith-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enabl
e-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --ena
ble-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr
/lib/jvm/java-1.5.0-gcj-4.8-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf --
with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/ja
va/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-
a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-checking=release --build=arm-lin
ux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
Я установил Источник Codebench Lite набор инструментов и я использую GNU Создать файл. Я настроил среду Eclipse в соответствии с инструктивным видео, предоставленным Майклом Янцем (ссылка удалена из-за лимита — если вы заинтересованы в поиске «Кросс-компиляция и удаленный просмотр для BeagleBone» на YouTube) с некоторыми незначительными изменениями, чтобы запустить его на моем система. Эти трюки состояли в основном из удаления флагов связывания «—specs = rdimon.specs» и «-lrdimon», так как я продолжал получать «нет такого файла или каталога» при компиляции. С этими двумя флажками простая программа «Hello ARM World» компилируется без проблем.
После передачи скомпилированного файла ELF в мою BeagleBone, настройку разрешений и флагов исполняемого файла через:
chmod ugo-x Test6.elf
и запустить его через:
./Test6.elf
Я получаю следующее сообщение:
root@arm:/home/ubuntu/RDKTestProgs# ./Test6.elf
bash: ./Test6.elf: No such file or directory
Сначала я думал, что несоответствие между моей 64-битной хост-системой и 32-битной GNU Make не должно быть проблемой, но чтобы устранить мои сомнения, я нашел 64-битный файл GNU Make (ссылка удалена из-за ограничения), хотя я ‘ Я не уверен в его целостности. В любом случае оба файла GNU Make дают одинаковый результат при попытке выполнить программу на BBB.
Просматривая несколько постов, я обнаружил инструменты «readelf», «strace» и «strings», которые дали следующие результаты.
Readelf:
root@arm:/home/ubuntu/RDKTestProgs# readelf -d Test6.elf
Dynamic section at offset 0x858 contains 27 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000c (INIT) 0x8550
0x0000000d (FINI) 0x87a0
0x00000019 (INIT_ARRAY) 0x10848
0x0000001b (INIT_ARRAYSZ) 8 (bytes)
0x0000001a (FINI_ARRAY) 0x10850
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x00000004 (HASH) 0x8168
0x00000005 (STRTAB) 0x82bc
0x00000006 (SYMTAB) 0x81bc
0x0000000a (STRSZ) 444 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x10958
0x00000002 (PLTRELSZ) 72 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x8508
0x00000011 (REL) 0x84f8
0x00000012 (RELSZ) 16 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x8498
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0x8478
0x00000000 (NULL) 0x0
root@arm:/home/ubuntu/RDKTestProgs# strings Test6.elf
/lib/ld-linux.so.3
libc.so.6
abort
__libc_start_main
__aeabi_atexit
libstdc++.so.6
__gmon_start__
_Jv_RegisterClasses
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSt8ios_base4InitD1Ev
_ZNSolsEPFRSoS_E
_ZNSt8ios_base4InitC1Ev
_ZSt4cout
libm.so.6
libgcc_s.so.1
__aeabi_unwind_cpp_pr0
__aeabi_unwind_cpp_pr1
GLIBCXX_3.4
GCC_3.5
GLIBC_2.4
?8FAFJF
x`9`{h
Hello ARM World!
Strace:
root@arm:/home/ubuntu/RDKTestProgs# strace ./Test6
strace: Can't stat './Test6': No such file or directory
root@arm:/home/ubuntu/RDKTestProgs# strace ./Test6.elf
execve("./Test6.elf", ["./Test6.elf"], [/* 22 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ exited with 1 +++
Строки:
root@arm:/home/ubuntu/RDKTestProgs# strings Test6.elf
/lib/ld-linux.so.3
libc.so.6
abort
__libc_start_main
__aeabi_atexit
libstdc++.so.6
__gmon_start__
_Jv_RegisterClasses
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSt8ios_base4InitD1Ev
_ZNSolsEPFRSoS_E
_ZNSt8ios_base4InitC1Ev
_ZSt4cout
libm.so.6
libgcc_s.so.1
__aeabi_unwind_cpp_pr0
__aeabi_unwind_cpp_pr1
GLIBCXX_3.4
GCC_3.5
GLIBC_2.4
?8FAFJF
x`9`{h
Hello ARM World!
Я искал в своем BeagelBoneBlack 4 файла общей библиотеки, указанные в функции «readelf», и обнаружил, что они действительно присутствуют. Проблема, однако, в том, что некоторые из этих файлов находятся в каталоге usr / lib / arm-linux-gnueabihf /, тогда как другие находятся в каталоге / lib / arm-linux-gnueabihf #. Чтобы исправить это, я создал символические ссылки на файлы, не найденные в каталоге / usr / lib / arm-linux-gnueabihf /. Это все еще не решило проблему. Поэтому я создал символические ссылки на файлы, не найденные в каталоге / lib / arm-linux-gnueabihf /. Опять не повезло.
Есть ли способ проверить, какой каталог используется при выполнении? Что еще может отсутствовать в файле Test6.elf? Я в растерянности на данный момент. Любые советы или рекомендации будут с благодарностью! Ура!
Постскриптум Мне также удалось проверить GLIBCXX_3.4, GLIBC_2.4 и GCC_3.5, как показано ниже, но, опять же, некоторые из них относятся к файлам в / usr / lib / arm-linux-gnueabihf, другие находятся в / lib / рука-Linux-gnueabihf. Еще раз спасибо!
root@arm:/lib/arm-linux-gnueabihf# strings libgcc_s.so.1 | grep GCC
GCC_3.0
GCC_3.3
GCC_3.3.1
GCC_3.3.4
GCC_3.4
GCC_3.4.2
GCC_4.0.0
GCC_4.2.0
GCC_4.3.0
GCC_4.7.0
GCC_3.5
root@arm:/usr/lib/arm-linux-gnueabihf# strings libstdc++.so.6.0.18 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.4
GLIBC_2.17
GLIBCXX_DEBUG_MESSAGE_LENGTH
И, наконец, вот программа «Hello ARM World»
//============================================================================
// Name : main.cpp
// Author : RDK
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++
//============================================================================
#include <iostream>
using namespace std;
//
// Print a greeting message on standard output and exit.
//
// On embedded platforms this might require semi-hosting or similar.
//
// For example, for toolchains derived from GNU Tools for Embedded,
// to enable semi-hosting, the following was added to the linker:
//
// --specs=rdimon.specs -Wl,--start-group -lgcc -lc -lc -lm -lrdimon -Wl,--end-group
//
// Adjust it for other toolchains.
//
int
main()
{
cout << "Hello ARM World!" << endl;
return 0;
}
Право на! Так что у меня все работает. Вот мои шаги, надеюсь, они здоровы и не вызовут у меня проблем в будущем.
От эта почта, Я попытался выяснить, где Test6.elf ожидал найти загрузчик linux для динамически связанных библиотек. Это дало:
root@arm:/home/ubuntu/RDKTestProgs# readelf -l ./Test6.elf | grep ld-linux
[Requesting program interpreter: /lib/ld-linux.so.3]
Я проверил мой /lib
папка и достаточно ld-linux.so.3
файл отсутствовал. Вместо этого я нашел это в /lib/arm-linux-gnueabihf/
папка
Поэтому я создал символическую ссылку в папке / lib через:
ln -s /lib/arm-linux-gnueabihf/ld-linux.so.3 /lib/ld-linux.so.3
И бум! Оно работает. Что я до сих пор нахожу странным, так это то, что ldd ./Test6.elf
все еще возвращается:
root@arm:/home/ubuntu/RDKTestProgs# ldd ./Test6.elf
not a dynamic executable
Есть ли для этого веская причина или это как-то нормально? — Это не кажется мне правильным.
Я также заметил, что мои текущие настройки компилятора (и, следовательно, набора инструментов) для Float ABI установлены на soft, но мой BeagleBoneBlack работает под управлением arm-linux-gnueabihf — hard float. Это вызовет у меня проблемы в будущем? Должен ли я искать другой набор инструментов?
Ура!
У меня была похожая ситуация с библиотекой под названием «ibstdc ++. So.6». Я разрабатываю в Eclipse на Ubuntu 14.04 и внедряю на beaglebone с Debian. У меня никогда не было этой проблемы раньше, когда я использовал для разработки на Eclipse Ubuntu 12.04 и развертывания на Amstrong.
Я решил проблему, прочитав приведенные выше ответы, и установил кросс-компилятор на arm-linux-gnueabihf-g ++. Кажется, что библиотека, которую я пропустил, просто включена в версию компилятора с плавающей запятой, а не в версию с плавающей запятой. Измените настройки кросс-компилятора на Eclipse и решите проблему.