2013-03-09 26 views
6

Ich brauche ein Programm, das ftd2xx auf meinem BeagleBoard xM rev C unter Ubuntu 12.04 verwendet. Ich versuche, die ARM-Bibliothek libftd2xx.so verwendet zu verwenden. libFTDI ist keine Option.ARM v5 shared library (ftd2xx) auf ARM v7 plattform - hart vs soft float ausgabe

Der Unterschied, den ich bemerkte, kommt aus dem Laufen readelf -hA auf libftd2xx.so vs anderen Bibliotheken auf dem BeagleBoard, die arbeiten. Der Arch-spezifische Abschnitt gibt den Betriebssystemnamen als "ARM926EF-S" für ftd2xx anstelle von "7-A" für andere Bibliotheken und CPU_arch als "v5TEJ" anstelle von "v7" an.

Ich nehme an, dies bedeutet, dass die Bibliothek für den ARM v5 Befehlssatz bestimmt ist, und das BeagleBoard läuft ARM v7. Gibt es eine Möglichkeit, ftd2xx zum Laufen zu bringen?

Edit: Mir wurde gesagt, ARM7 ist abwärtskompatibel mit ARM5, aber das löst mein Problem nicht.

Eine andere Sache zu beachten ist, dass das Ausführen ldd libftd2xx.so auf dem BeagleBoard die Abhängigkeiten nicht auflistet, aber not a dynamic executable ausgibt, während es auf anderen Bibliotheken funktioniert.

EDIT 2:

Das Problem scheint mit einem weichen vs hart Schwimmer ABI zu sein. Ich habe ein gnueabihf Bild auf dem BeagleBoard xM. Wenn ich versuche, ein Beispielprogramm mit dem statischen libftd2xx.a zu kompilieren, erhalte ich viele von ihnen:

/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)

Wenn ich mit mfloat-abi=soft oder mfloatabi=softfp zu kompilieren versuchen, erhalte ich

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

Ich habe auch versucht, mit arm-linux-gnueabi anstelle von arm-linux-gnueabihf zu kompilieren, aber das resultierende Programm wird nicht auf dem BeagleBoard ausgeführt. Kann ich etwas tun oder ist es unmöglich?

--------- SOLUTION ----------------

Nach einiger Mühe, FTDI versorgte mich mit einem harten Schwimmer Version ihrer Bibliothek, die funktioniert. Ich reicht es hier nach vielen Menschen individuell sie angefordert haben:

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

+0

Was funktioniert nicht genau? Wo führst du 'ldd' auf dem Host? probiere 'readelf | grep Shared'. Sie benötigen möglicherweise eine LDD mit Arm Unterstützung oder etwas. (http://stackoverflow.com/questions/6150000/cross-compiler-ldd) Sie sollten versuchen, mehr für Informationen wie Strac, Überprüfung Protokolle usw. zu graben. Haben Sie die README von ftdi Website gelesen? – auselen

+0

Ich starte 'ldd' auf dem BeagleBoard, also sollte es schon von einer ARM-Version sein (es funktioniert auf den ARM-Bibliotheken in/usr/lib). Ich las die Readme und kontaktierte FTDI ohne Erfolg. Ich habe Strace angeschaut, aber ich weiß nicht, wie ich das interpretieren soll. –

+0

Paste strace zu irgendwo dann ... – auselen

Antwort

3

v5TEJ eine Teilmenge des v7-A-Befehlssatzes ist.

Der Code läuft möglicherweise etwas langsamer und ist möglicherweise etwas größer als erforderlich, sollte aber dennoch funktionieren, ohne dass er aufgrund von ungültigen Anweisungen oder ähnlichem abgestürzt ist. Mit wenigen Ausnahmen ist ARM-Code abwärtskompatibel zu früheren Befehlssätzen.

Wenn der Code auf Ihrer Plattform nicht funktioniert, ist es sehr wahrscheinlich etwas anderes wie fehlende Zugriffsrechte auf das USB-Subsystem oder so.

+0

Running ldd auf die Binär-Returns w/no-Ausgabe. strace zeigt, dass er nach der Bibliothek sucht, die er schließlich findet. Dann hat es ein paar Anrufe zu lseek und endet schließlich mit Code 1. Wenn es hilft, kann ich meine Antwort mit der vollen Ausgabe aktualisieren. –

+0

Ich habe meine Frage bearbeitet, um die Tatsache einzubeziehen, dass 'ldd libftd2xx.so' keine Abhängigkeiten ausdruckt, was meiner Meinung nach Berechtigungsprobleme ausschließt. –

2

Bitte beachten Sie meine pastebin Ausgabe für strace und ldd auf einem ARM926-Prozessor. Die Binärdateien innerhalb libftd2xx1.1.12 haben mehrere Prozessoren. Stellen Sie sicher, dass Sie release/build/arm926 verwenden. Ich kann die statictest-Binärdatei auf einer ARM926-CPU mit eglibc und Linux 2.6.36 ausführen.

Vom Ausgang ldd sind die folgenden Bibliotheken erforderlich.

  • libdl.so.2 - dynamisches Laden.
  • librt.so.1 - Echtzeitbibliothek
  • libpthread.so.0 - pthreads
  • libgcc_s.so.1 - gcc Helfer.
  • libc.so.6 - eglibc Bibliothek
  • ld-linux.so.3 - die Linux-Shared Library Loader.

Ein funktionelles ldd ist nicht erforderlich und der folgende Befehl sollte Bibliotheken anzuzeigen,

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 

Stellen Sie sicher, dass die statictest binäre Arbeit. Ist dies der Fall, versuchen Sie LD_LIBRARY_PATH auf release/build/arm926/libftd2xx.so.1.1.12 zu setzen. Vom strace-Ausgang werden die Pfade /lib/tls/v5l und /lib/tls gegenüber /lib bevorzugt. Alle oben aufgeführten Bibliotheken sollten in /lib sein. Sie können versuchen, ln (harte Verbindung) sie zu dieser Position. Von der strace Ausgabe sollte auch das /proc/bus/usb Dateisystem angehangen werden. Dies ist eine Kernel-Konfigurationsoption. /sys/bus/usb/devices wird häufig verwendet, um Geräte zu finden; Es ist unwahrscheinlich, dass dies auf Ihrem Ubuntu 12.04 ARM Linux fehlt. Es gibt auch eine libd2xx_table.so, die am häufigsten verwendet wird, um nicht-standardmäßige USB-Deskriptoren zu finden.

Schließlich wäre es hilfreich, das Problem besser zu beschreiben. Sie versuchen, ein Programm auszuführen, und es gibt keine Ausgabe? Oder du führst das Programm aus und es hat eine Ausnahme? Wenn die statictestARM Binärdatei nicht ausgeführt werden kann, ist Ihre ursprüngliche Annahme möglicherweise korrekt. Es ist möglich, dass der ältere Kernel 2.6.32 (oder ld-linux.so) ARM926EJ-S kompatibel findet, aber Ihr neueres Ubuntu 12.04 findet es nicht kompatibel. Verwenden Sie in diesem Fall man ld-linux auf einem PC-Host, um die Umgebungsvariablen ld-linux.so zu sehen. Insbesondere können LD_DEBUG und LD_ASSUME_KERNEL hilfreich sein, den Loader zum Laden der Binärdateien zu überreden.

+0

Danke für die Hilfe - der statische Test läuft nicht, siehe meine Bearbeitung 2. Es sieht aus wie ein hartes vs weiches Float-Problem - was kann ich tun? –

+0

Sie können alles mit 'softfp' und den' arm-linux-gnueabi'-Tools statisch verknüpfen. Alternativ können Sie die anderen Shared Libraries (oben in ''/opt/lib/softfp'') aus den 'arm-linux-gnueabi'-Tools installieren und den' LD_LIBRARY_PATH' so einstellen, dass er auf diese verweist. 'Hard-Float' versus' Soft' macht Sinn. –

+0

Sorry, ich bin mir nicht sicher, ob ich verstehe, kannst du klären, was ich versuchen sollte?Wenn ich statictest mit 'arm-linux-gnueabi' kreuz-kompiliere, wird das Programm nicht auf dem BeagleBoard ausgeführt. –