Compiling

ldd:FATAL:從 Executable 呼叫的未解析符號“getopt_long” - 使用 arm 上 QNX 的編譯二進製文件。為什麼?

  • July 9, 2014

Blackberry Playbook已正式達到EOL (2014年4 月),但我已經安裝了BGShellBGSSH-SCP-SFTPTerm48。所以我有一些類似ksh的外殼,看起來像 GNU awk3.1.5、4.1.5和sed,還有其他一些coreutils元素(但沒有)等。我不是 root。基本上我可以在目錄或由 shell 應用程序創建的*$HOME目錄中寫入(*grep``python``tr``Downloads``/accounts/1000/appdata/com.BGShell..blabla/data例如)並且我不能執行所有操作,但我通常可以在上述限制內執行腳本。我感興趣的原因是因為這是cortex-A9上的QNX。:

QNX localhost 6.6.0 2014/03/19-01:28:41EDT OMAP4430_ES2.2_HS_Winchester_Rev:07 armle

所以我通過嘗試利用舊項目1編譯了一些二進製文件。許多事情需要改變才能工作,但它已設置並能夠編譯大多數目標(包括gcccoreutils-8.13)2。總而言之,我使用許多不同的配置標誌變體和一些開發工具的舊版本進行編譯以避免一些錯誤*。*我已經解決了類似的問題:

CFLAGS="-march=armv7-a -marm -fno-strict-aliasing -mtune=cortex-a9 -O2 -pipe -fomit-frame-pointer -mlittle-endian"
AUTOMAKE=automake-1.11: AUTOCONF=: AUTOHEADER=: AUTORECONF=: ACLOCAL=aclocal-1.11: MAKEINFO=makeinfo-4.13a

使用從Motics IDE中的10.3 SDKarm-unknown-nto-qnx8.0.0eabi-gcc連結的交叉編譯器*。*生成的二進製文件如下所示:

ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), BuildID[md5/uuid]=41442b23fecda2d1d7cc5d2c68432a33, not stripped

但是平板電腦上的每一個錯誤都帶有以下消息:

ldd:FATAL: Unresolved symbol "getopt_long" called from Executable

當我使用不同的標誌重新編譯多次並且總是收到該消息時,我想我可能在建構腳本中錯誤連結了編譯器以外的其他東西,因為它是為之前的 sdk 設計的……(這超出了我的專業知識,但也許關於垃圾收集的東西,即collect?)。還是目標平台上的奇異配置?

由於設置(和缺乏經驗),這裡可能有一百萬件事情出錯,但我正在尋找一些線索,所以我應該從這樣的錯誤中理解任何具體的事情嗎?我一般如何回溯問題?


  1. 總之,它是一堆腳本,用於獲取修補編譯安裝到某個目錄,然後將該目錄捆綁到一個 zip 文件,然後生成一個可愛的ruby​​ webrick伺服器,然後您使用平板電腦從中下載腳本和存檔(我不將它用於 250mb 的存檔,我只是使用一些網路文件主機和瀏覽器)。

  2. 我已經從頂層建構配置中刪除了ruby​​ 、fileruby​​ 目標。

這是關於混淆兩個不同的 SDK 1。getopt_long 存在QNX6.6上。但是Playbooklibc上的版本沒有,因為它有*/proc的早期版本。如果我安裝了Playbook OS Native SDK v2.1.0而不是盲目地按照項目中的連結安裝Native SDK v10.3和**BB10*的 2.1 IDE,則該錯誤永遠不會發生 . 該項目的資訊很清楚,但連結沒有連結到正確的 SDK。所以我最終得到的是最有可能在 BB10 上執行的二進製文件,但在不完全具有相同基礎架構的設備上執行。有趣的是,當使用 BB SDK 編譯時,類似的東西grep會起作用,但拒絕回答--version即長選項……


但是使用正確的 SDK 沒有問題。大多數目標已重新編譯2。這一切都發生在Arch Linux x84_64上,其中multilib儲存庫已啟用(並且許多*lib32-*包被拉出)。這是build.sh我用於gcc3的配置塊:

CONFIGURE_CMD="$EXECDIR/gcc/configure
          --host=$PBHOSTARCH 
          --build=$PBBUILDARCH 
          --target=$PBTARGETARCH 
          --srcdir=$EXECDIR/gcc 
          --with-as=ntoarm-as 
          --with-ld=ntoarm-ld 
          --with-sysroot=$BBTOOLS/target/qnx6/ 
          --disable-werror 
          --prefix=$DESTDIR 
          --exec-prefix=$DESTDIR 
          --enable-cheaders=c 
          --enable-languages=c 
          --enable-threads=posix 
          --disable-nls
          --disable-libssp 
          --disable-tls 
          --disable-libstdcxx-pch
          --disable-newlib-supplied-syscalls
          --enable-libmudflap 
          --enable-__cxa_atexit 
          --with-gxx-include-dir=$BBTOOLS/target/qnx6/usr/include 
          --enable-shared
          --disable-subdir-texinfo
          --enable-cross-compile
          --enable-shared
          CC=$PBTARGETARCH-gcc
          CFLAGS='-march=armv7-a -marm -fno-strict-aliasing -mtune=cortex-a9 -O2 -pipe -fomit-frame-pointer -mlittle-endian'
          LDFLAGS='-Wl,-s '
          MAKEOPTS="-j5"
          AUTOMAKE=automake-1.11: AUTOCONF=: AUTOHEADER=: AUTORECONF=: ACLOCAL=aclocal-1.11: MAKEINFO=makeinfo-4.13a

coreutilsgcc工作,我有別名和ls選項:grep``--color

在此處輸入圖像描述

tr最後,我的Playbook上有一個功能性外殼,它提供了對QNX的難得一見!


  1. 感謝Ryan Mansfield @Foundry27 的提醒和*@Emmanuel*的資訊!

  2. 排除目標:file, man, ruby, findutils. 生成的存檔為 80Mib,並且使用ruby webrick伺服器按預期進行部署。

  3. …對於兩者gcccoreutils實際上(在後一種情況下添加到預設值)。目前尚不清楚是否所有選項都是必需的,甚至是推薦的。每個目標都可以通過在適當的目錄中啟動build.sh腳本來單獨建構,即. 建構環境()必須由全域頂級 build.sh 腳本使用選項 ie獲取一次。源被提取到建構它們的目錄中。如果建構成功並且沒有給出任何選項(參見項目根目錄),它將被添加到目錄結構中,該目錄結構將被壓縮到存檔中(將部署到執行BGShell的設備上的 $HOME 目錄中)。還要注意參考bootstrap/target``bootstrap/gcc/build.sh``bbndk-env.sh``-b``build.sh -b /path/to/bbndk-2.10``work/target``lib.sh``pbhome達爾文lib.sh我在我的情況下改為 x86_64。否則,原始項目配置沒有任何改變,即arm-unknown-nto-qnx6.5.0eabi(而不是像 Q.那樣使用帶有 BB10.3 SDK 的 8.0.0 版本)。因此,一旦我們排除了少數有問題的目標,就很容易編譯。

引用自:https://unix.stackexchange.com/questions/141262