2013-03-09 2 views
6

Мне нужно запустить программу, которая использует ftd2xx на моем BeagleBoard xM rev C, работающем под Ubuntu 12.04. Я пытаюсь использовать библиотеку ARM libftd2xx.so при условии, что . libFTDI не вариант.Общая библиотека ARM v5 (ftd2xx) на платформе ARM v7 - проблема жесткого против мягкого плавания

Отличие, которое я заметил, происходит от запуска readelf -hA на libftd2xx.so и других библиотек на BeagleBoard, которые работают. Секция, специфичная для арки, дает имя ОС как «ARM926EF-S» для ftd2xx вместо «7-A» для других библиотек и CPU_arch как «v5TEJ» вместо «v7».

Я предполагаю, что это означает, что библиотека предназначена для набора команд ARM v5, а на BeagleBoard работает ARM v7. Есть ли способ заставить ftd2xx работать?

Редактировать: Мне сказали, что ARM7 обратно совместим с ARM5, но это не решает мою проблему.

Еще одна вещь, которую следует отметить, заключается в том, что запуск ldd libftd2xx.so на BeagleBoard не отображает зависимости, но выводит not a dynamic executable, тогда как он работает с другими библиотеками.

EDIT 2:

Проблема, кажется, с мягкой против жесткого поплавка ABI. У меня есть gnueabihf изображение на BeagleBoard xM. Когда я пытаюсь скомпилировать пример программы со статическим libftd2xx.a, я получаю много из них:

/usr/bin/ld: error: static_link_uses VFP register arguments, libftd2xx.a(file.o) does not
/usr/bin/ld: failed to merge target specific data of file libftd2xx.a(file.o)

Если я пытаюсь скомпилировать с mfloat-abi=soft или mfloatabi=softfp, я получаю

In file included from /usr/include/stdio.h:28:0,
from main.c:12:
/usr/include/features.h:324:26 fatal error: bits/predef.h: No such file or directory
compilation terminated

Я также попытался скомпилировать с arm-linux-gnueabi вместо arm-linux-gnueabihf, но результирующая программа не выполняется на BeagleBoard. Есть ли что-нибудь, что я могу сделать, или это невозможно?

--------- РЕШЕНИЕ ----------------

После некоторых неприятностей, FTDI предоставил мне жесткий вариант поплавка их библиотеки, которая работает. Я снабдив его здесь после того, как многие люди по отдельности просили его:

https://s3.amazonaws.com/hayk-public/arm926-hf.zip

+0

Что это не работает? где вы запускаете 'ldd', на хосте? попробуйте 'readelf | grep Shared'. Вам может понадобиться ldd с поддержкой руки или что-то в этом роде. (http://stackoverflow.com/questions/6150000/cross-compiler-ldd). Вы должны попытаться копать больше информации, например, используя strac, проверку журналов и т. д. Вы читали README с сайта ftdi? – auselen

+0

Я запускаю 'ldd' на BeagleBoard, поэтому он должен быть уже версией ARM (он работает с библиотеками ARM в/usr/lib). Я прочитал readme и связался с FTDI безрезультатно. Я посмотрел на strace, но я не знаю, как это интерпретировать. –

+0

Вставить strace в то место, где ... – auselen

ответ

3

v5TEJ является подмножеством A v7-набора команд.

Код может работать немного медленнее и может быть немного больше, чем требуется, но он должен, тем не менее, работать без сбоев из-за незаконных инструкций или так далее. За очень немногими исключениями ARM-код обратно совместим с предыдущими наборами команд.

Если код не работает на вашей платформе, это очень вероятно, что-то вроде отсутствия прав доступа к подсистеме USB или так.

+0

Запуск ldd на двоичные возвращает w/no output. strace показывает, что он ищет библиотеку, которую он в конечном итоге находит. Затем он имеет несколько вызовов lseek и, в конечном счете, выходит с кодом 1. Если это помогает, я могу обновить свой ответ с полным выходом. –

+0

Я отредактировал мой вопрос, включив в него тот факт, что 'ldd libftd2xx.so' не печатает зависимости, которые, как мне кажется, исключают проблемы с разрешениями. –

2

См. Мой вывод pastebin для strace и ldd на процессоре ARM926. Бинарные файлы внутри libftd2xx1.1.12 имеют несколько процессоров. Убедитесь, что вы используете release/build/arm926. Я могу запустить двоичный файл statictest на процессоре ARM926, с eglibc и Linux 2.6.36.

С вывода ldd необходимы следующие библиотеки.

  • libdl.so.2 - динамическая загрузка.
  • librt.so.1 - в режиме реального времени библиотека
  • libpthread.so.0 - Pthreads
  • libgcc_s.so.1 - НКУ хелперов.
  • libc.so.6 - библиотека eglibc
  • ld-linux.so.3 - загрузчик разделяемой библиотеки Linux.

Функциональная ldd не требуется, и следующая команда должна отобразить библиотеки,

LD_TRACE_LOADED_OBJECTS=1 LD_WARN=yes LD_BIND_NOW=yes LD_VERBOSE=yes \ 
/lib/ld-linux.so.3 ./libftd2xx.so.1.1.12 

Убедитесь, что statictest бинарной работы. Если да, попробуйте установить LD_LIBRARY_PATH на адрес release/build/arm926/libftd2xx.so.1.1.12. На выходе strace пути /lib/tls/v5l и /lib/tls являются предпочтительными по сравнению с /lib. Все перечисленные выше библиотеки должны быть в /lib. Вы можете попробовать ln (жесткая ссылка) на это место. Кроме того, с вывода strace должна быть установлена ​​файловая система /proc/bus/usb. Это вариант конфигурации ядра. /sys/bus/usb/devices широко используется для поиска устройств; маловероятно, что этого не хватает на вашем Ubuntu 12.04 ARM Linux. Существует также libd2xx_table.so, который, скорее всего, используется для поиска нестандартных дескрипторов USB.

И, наконец, было бы полезно описать проблему более подробно. Вы пытаетесь запустить какую-то программу, и нет выхода? Или вы запускаете программу, и у нее есть исключение? Если двоичный файл statictestARM не работает, ваше исходное предположение может быть правильным. Возможно, что более раннее ядро ​​2.6.32 (или ld-linux.so) находит ARM926EJ-S, но ваш новый Ubuntu 12.04 не считает его совместимым. В этом случае используйте man ld-linux на ПК-хосте, чтобы увидеть переменные окружения ld-linux.so. В частности, LD_DEBUG и LD_ASSUME_KERNEL могут быть полезны для укорачивания загрузчика для загрузки двоичных файлов.

+0

Спасибо за помощь - статический тест не запускается, см. Мое редактирование 2. Это похоже на жесткую проблему с мягким поплавком - все, что я могу сделать? –

+0

Вы можете статически связывать все с инструментами 'softfp' и' arm-linux-gnueabi'. Кроме того, вы можете установить другие разделяемые библиотеки (перечисленные выше в виде '/ opt/lib/softfp') из инструментов' arm-linux-gnueabi' и установить для них 'LD_LIBRARY_PATH', чтобы указать на них. 'hard-float' против' soft' имеет смысл. –

+0

Извините, я не уверен, что понимаю, вы можете уточнить, что я должен попробовать?Если я перекрестно скомпилирую statictest с 'arm-linux-gnueabi', программа не будет выполняться на BeagleBoard. –

Смежные вопросы