我需要运行上运行Ubuntu 12.04的BeagleBoard我XM转C使用ftd2xx的程序。 我试图用libftd2xx.so提供的ARM库在这里 。 libFTDI是不是一种选择。
我注意到的差异是由运行readelf -hA
上libftd2xx.so VS上的工作BeagleBoard的其他库。 具体拱形部分提供OS名称为“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:
这个问题似乎是用软VS硬浮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=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
v5TEJ是V7-A的指令集的一个子集。
该代码可以运行有点慢,可能会比需要更大了一点,但它应该不会崩溃因非法指令左右仍然工作。 除了极少数例外ARM代码向后兼容以前的指令集。
如果代码不能在你的平台上工作,它是别人很可能像失踪的访问权限USB子系统左右。
请参阅我的引擎收录输出strace
和ldd
采用ARM926处理器。 内部的二进制文件libftd2xx1.1.12有多个处理器。 确保您使用release/build/arm926
。 我可以运行statictest
的ARM926 CPU上二进制,eglibc和Linux 2.6.36。
从ldd
的输出,需要以下库。
-
libdl.so.2
-动态加载。 -
librt.so.1
-实时库 -
libpthread.so.0
-并行线程 -
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描述符。
最后,这将有助于更具描述性的问题。 您尝试运行一些程序,并没有输出? 或者你运行的程序,它有一个例外? 如果statictest
ARM二进制运行失败,那么你原来的假设可能是正确的。 这可能是旧的2.6.32内核(或ld-linux.so)发现ARM926EJ-S
兼容,但你的新的Ubuntu 12.04没有找到它兼容。 在这种情况下,使用man ld-linux
电脑主机上看到ld-linux.so
环境变量。 具体而言, LD_DEBUG
和LD_ASSUME_KERNEL
可能是有帮助哄加载器加载的二进制文件。
文章来源: ARM v5 shared library (ftd2xx) on ARM v7 platform - hard vs soft float issue