7

我需要在运行 Ubuntu 12.04 的 BeagleBoard xM rev C 上运行一个使用 ftd2xx 的程序。我正在尝试使用此处提供的 ARM 库 libftd2xx.so 。libFTDI 不是一个选项。

我注意到的差异来自于readelf -hA在 libftd2xx.so 上运行与在 BeagleBoard 上运行的其他库。arch-specific 部分将 ftd2xx 的操作系统名称指定为“ARM926EF-S”,而不是其他库的“7-A”,并将 CPU_arch 指定为“v5TEJ”而不是“v7”。

我假设这意味着该库适用于 ARM v5 指令集,而 BeagleBoard 正在运行 ARM v7。有什么方法可以让 ftd2xx 工作吗?

编辑:有人告诉我 ARM7 向后兼容 ARM5,但这并不能解决我的问题。

另外需要注意的是,ldd libftd2xx.so在 BeagleBoard 上运行不会列出依赖项,而是打印出来not a dynamic executable,而在其他库上运行。

编辑2:

问题似乎出在软浮动 ABI 与硬浮动 ABI 上。我在 BeagleBoard xM 上有一个 gnueabihf 图像。当我尝试使用静态 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=softor编译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

4

2 回答 2

3

v5TEJ 是 v7-A 指令集的子集。

代码运行速度可能会慢一些,并且可能比要求的大一些,但它应该仍然可以正常工作,而不会因非法指令等而崩溃。除了极少数例外,ARM 代码向后兼容以前的指令集。

如果代码在您的平台上不起作用,则很可能是其他原因,例如缺少对 USB 子系统的访问权限等。

于 2013-03-09T07:32:20.777 回答
2

请在 ARM926 处理器上查看我的pastebin输出。libftd2xx1.1.12中的二进制文件有多个处理器。确保您正在使用. 我可以使用 eglibc 和 Linux 2.6.36 在 ARM926 CPU 上运行二进制文件。stracelddrelease/build/arm926statictest

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请在 PC 主机上使用以查看ld-linux.so环境变量。具体来说,LD_DEBUG可能LD_ASSUME_KERNEL有助于诱使加载程序加载二进制文件。

于 2013-03-14T14:30:43.673 回答