2013-03-09 48 views
6

我需要在運行Ubuntu 12.04的BeagleBoard xM rev C上運行使用ftd2xx的程序。我正在嘗試使用ARM庫libftd2xx.so提供的。 libFTDI不是一個選項。ARM v7平臺上的ARM v5共享庫(ftd2xx) - 硬vs軟問題

我注意到的差異來自libftd2xx.so上運行readelf -hA與BeagleBoard上的其他庫的工作。特定於arch的部分爲ftd2xx提供的操作系統名稱爲「ARM926EF-S」,而不是其他庫的「7-A」,CPU_arch的操作系統名稱爲「v5TEJ」,而不是「v7」。

我假設這意味着該庫是爲ARM v5指令集設計的,並且BeagleBoard正在運行ARM v7。有什麼方法可以讓ftd2xx工作嗎?

編輯:我被告知ARM7向後兼容ARM5,但這並不能解決我的問題。

另一件需要注意的事情是在BeagleBoard上運行ldd libftd2xx.so沒有列出依賴項,但打印出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=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

+0

這是什麼工作不完全?你在哪裏運行'ldd',在主機上?嘗試'readelf | grep Shared'。您可能需要支持arm的LD或其他東西。 (http://stackoverflow.com/questions/6150000/cross-compiler-ldd)你應該嘗試挖掘更多的信息,比如使用strac,檢查日誌等。你是否從ftdi站點讀了README文件? – auselen 2013-03-13 07:56:17

+0

我在BeagleBoard上運行'ldd',所以它應該已經通過ARM版本(它在/ usr/lib中的ARM庫上工作)。我閱讀了自述文件並聯繫了FTDI無濟於事。我看過strace,但我不知道如何解釋它。 – 2013-03-13 17:51:19

+0

將strace粘貼到某處然後... – auselen 2013-03-13 18:01:02

回答

3

v5TEJ是V7-A指令集的一個子集。

代碼可能會運行得慢一點,可能比需要的大一點,但它應該仍然工作,而不會由於非法指令等崩潰。除了極少數例外,ARM代碼向後兼容先前的指令集。

如果代碼在您的平臺上無法正常工作,那很可能是其他事情,比如缺少對USB子系統等的訪問權限。

+0

在二進制上運行ldd會返回w/no輸出。 strace表明它正在尋找它最終找到的圖書館。然後,它有幾個調用lseek並最終退出代碼1.如果有幫助,我可以用完整的輸出更新我的答案。 – 2013-03-09 18:01:26

+0

我編輯了我的問題,以包括'ldd libftd2xx.so'不打印出依賴關係,這在我的腦海裏排除了權限問題。 – 2013-03-12 21:07:21

2

請在ARM926處理器上看到我的pastebin輸出爲stracelddlibftd2xx1.1.12內的二進制文件具有多個處理器。確保您使用的是release/build/arm926。我可以使用eglibc和Linux 2.6.36在ARM926 CPU上運行statictest二進制文件。

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上這不太可能不存在。還有一個最有可能用於查找非標準USB描述符的libd2xx_table.so

最後,更有效地描述問題會有幫助。你試圖運行一些程序,並沒有輸出?或者你運行該程序,它有一個例外?如果二進制程序無法運行,那麼您的原始假設可能是正確的。較舊的2.6.32內核(或ld-linux.so)可能會找到兼容的ARM926EJ-S,但您的較新的Ubuntu 12.04不會兼容它。在這種情況下,在PC主機上使用man ld-linux可查看ld-linux.so環境變量。具體而言,LD_DEBUGLD_ASSUME_KERNEL可能有助於指導加載器加載二進制文件。

+0

感謝您的幫助 - 靜態測試無法運行,請參閱我的編輯2.它看起來像是一個艱難還是軟浮動問題 - 我可以做什麼? – 2013-03-16 02:46:50

+0

你可以用'softfp'和'arm-linux-gnueabi'工具靜態鏈接所有東西。或者,您可以從'arm-linux-gnueabi'工具安裝其他共享庫(如上面列出的'/ opt/lib/softfp'),並將'LD_LIBRARY_PATH'設置爲指向它們。 'hard-float'與'soft'非常合理。 – 2013-03-16 03:43:21

+0

對不起,我不確定我是否理解,你能澄清我應該嘗試的嗎?如果我用'arm-linux-gnueabi'交叉編譯statictest,程序不會在BeagleBoard上執行。 – 2013-03-16 03:53:31