Общая библиотека ARM v5 (ftd2xx) на платформе ARM v7 - проблема с жестким и мягким плаванием

Мне нужно запустить программу, которая использует ftd2xx на моем BeagleBoard xM rev C под управлением Ubuntu 12.04. Я пытаюсь использовать библиотеку ARM libftd2xx.so, предоставленную здесь. libFTDI не подходит.

Разница, которую я заметил, происходит от запуска 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, тогда как он работает с другими библиотеками.

РЕДАКТИРОВАТЬ 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


person hayk.mart    schedule 09.03.2013    source источник
comment
Что именно не работает? где вы запускаете ldd, на хосте? попробуйте readelf |grep Shared. Вам может понадобиться ldd с опорой для рук или что-то в этом роде. (stackoverflow.com/questions/6150000/cross-compiler-ldd) Вы должны попытаться докопаться до такая информация, как использование strac, проверка журналов и т. д. Читали ли вы README с сайта ftdi?   -  person auselen    schedule 13.03.2013
comment
Я запускаю ldd на BeagleBoard, так что он уже должен работать с версией ARM (работает с библиотеками ARM в / usr / lib). Я прочитал ридми и безрезультатно связался с FTDI. Я смотрел на strace, но не знаю, как это интерпретировать.   -  person hayk.mart    schedule 13.03.2013
comment
вставьте strace куда-нибудь тогда ...   -  person auselen    schedule 13.03.2013


Ответы (2)


v5TEJ - это подмножество набора инструкций v7-A.

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

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

person Nils Pipenbrinck    schedule 09.03.2013
comment
Запуск ldd для двоичного файла возвращает без вывода. strace показывает, что ищет библиотеку, которую в конце концов находит. Затем он выполняет несколько вызовов lseek и в конечном итоге завершает работу с кодом 1. Если это поможет, я могу обновить свой ответ, добавив полный вывод. - person hayk.mart; 09.03.2013
comment
Я отредактировал свой вопрос, включив в него тот факт, что ldd libftd2xx.so не распечатывает зависимости, что, на мой взгляд, исключает проблемы с разрешениями. - person hayk.mart; 13.03.2013

См. Мои результаты 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 - помощники gcc.
  • 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.

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

person artless noise    schedule 14.03.2013
comment
Спасибо за помощь - статический тест не запускается, см. Мою правку 2. Похоже, проблема с жестким и мягким плаванием - что я могу сделать? - person hayk.mart; 16.03.2013
comment
Вы можете статически связать все с помощью softfp и arm-linux-gnueabi инструментов. В качестве альтернативы вы можете установить другие разделяемые библиотеки (перечисленные выше примерно как /opt/lib/softfp) из инструментов arm-linux-gnueabi и установить LD_LIBRARY_PATH, чтобы они указывали на них. hard-float против soft имеет смысл. - person artless noise; 16.03.2013
comment
Извините, я не уверен, что понимаю, вы можете уточнить, что мне следует попробовать? Если я скомпилирую statictest с arm-linux-gnueabi, программа не будет выполняться на BeagleBoard. - person hayk.mart; 16.03.2013
comment
statictest на самом деле не статичен. Используется только libftd2xx.a, который является статическим. Вышеупомянутые библиотеки динамически связаны. Ваш arm-linux-gnueabi может поставляться со сценарием populate. Это будет искать и копировать общие библиотеки для запуска исполняемого файла. Либо с помощью chroot, либо с настройкой LD_LIBRARY_PATH, чтобы убедиться, что библиотеки не-hardfp найдены. chroot может быть лучше; вы можете установить мини-файловую систему и использовать ее с chroot. Я делаю это, например, с klibc. - person artless noise; 16.03.2013