ARM v7平台上的ARM v5共享库(ftd2xx) - 硬与软浮动问题

时间:2013-03-09 02:21:18

标签: architecture arm backwards-compatibility beagleboard

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

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

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

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

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

编辑2:

问题似乎是软性与硬性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=softmfloatabi=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

2 个答案:

答案 0 :(得分:3)

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

代码可能运行速度稍慢,可能比所需要的要大一些,但是它应该可以在没有因非法指令等原因而崩溃的情况下工作。除了极少数例外,ARM代码向后兼容以前的指令集。

如果代码在您的平台上不起作用,那么很可能还缺少对USB子系统等的访问权限。

答案 1 :(得分:2)

请参阅ARM926处理器上straceldd的{​​{3}}输出。 pastebin内的二进制文件有多个处理器。确保您使用release/build/arm926。我可以在ARM926 CPU上运行statictest二进制文件,使用eglibc和Linux 2.6.36。

ldd输出,需要以下库。

  • libdl.so.2 - 动态加载。
  • librt.so.1 - 实时图书馆
  • libpthread.so.0 - pthreads
  • libgcc_s.so.1 - gcc helpers。
  • libc.so.6 - eglibc library
  • 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找不到它兼容。在这种情况下,请在PC主机上使用man ld-linux以查看ld-linux.so环境变量。具体来说,LD_DEBUGLD_ASSUME_KERNEL可能有助于诱导加载程序加载二进制文件。