web-dev-qa-db-ja.com

ldd:FATAL:実行可能ファイルから呼び出された未解決のシンボル「getopt_long」-アーム上のQNX用にコンパイルされたバイナリを使用します。どうして?

Blackberry Playbookが正式に [〜#〜] eol [〜#〜] (2014年4月)に到達しましたが、インストールしました BGShellBGSSH-SCP-SFTP 、および Term48 。だから私はいくつかksh-シェルのように、GNU awk 3.1.5、sed 4.1.5、 grepおよびpythonsomeその他coreutils要素(ただしtr)など。私はルートではありませんです。基本的には、Downloadsディレクトリまたはシェルアプリによって作成された$ HOMEディレクトリに書き込むことができます。 (たとえば、/accounts/1000/appdata/com.BGShell..blabla/data)で、すべてを実行することはできませんが、通常、前述の制約内でスクリプトを実行できます。興味がある理由は、これが [〜#〜 ] qnx [〜#〜] on cortex-A9 。:

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

だから私は 古いプロジェクト を活用しようとしていくつかのバイナリをコンパイルしました1。これを機能させるには多くの変更が必要ですが、セットアップされており、ほとんどのターゲット(gccおよびcoreutils-8.13を含む)をコンパイルできます。2summarizeに、いくつかのエラーを回避するために、configureフラグのさまざまなバリエーションといくつかの開発ツールの古いバージョンを使用してコンパイルしました。私は次のようなものに落ち着きました:

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

10.3 SDKからリンクされたarm-unknown-nto-qnx8.0.0eabi-gccクロスコンパイラを使用します。これはmomentics IDE内にあります。結果のバイナリは次のようになります。

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

さまざまなフラグを使用して何度も再コンパイルし、常にそのメッセージが表示されるので、ビルドスクリプトでコンパイラ以外のものを誤ってリンクした可能性があると考えています(これは私の専門知識を超えていますが、おそらくガベージコレクションについての何か、すなわちcollect?)。それとも、ターゲットプラットフォームのエキゾチックな構成ですか?

セットアップ(および経験不足)のためにここで何百万もの問題が発生した可能性がありますが、いくつかの手がかりを探しているので、そのようなエラーから理解する必要がある特定のことはありますか?


1.要約すると、それはfetchpatchcompileinstall to somedirへの一連のスクリプトです。 bundle 1つのZipファイルへのディレクトリからかわいいRuby webrickサーバーを生成し、タブレットを使用してスクリプトとアーカイブをダウンロードします(私はそれを使用しません250mbのアーカイブ、私はいくつかのWebファイルホストとブラウザを使用します)。

2. Rubyfile、およびRubyターゲットをトップレベルのビルド構成から削除しました。

3
user44370

これは、2つの異なるSDKを混同することについてです1 getopt_long exists on QNX6.6 。しかし、 Playbook libcバージョン それはありません 以前のバージョンの/procがあるためlink を盲目的にたどる代わりに、 Playbook OS Native SDK v2.1.0 をインストールした場合、エラーは発生しませんでした。プロジェクト。 NativeSDK v10.3 と2.1[〜#〜] ide [〜#〜] BB10 の場合。プロジェクトの情報は明確ですが、リンクが適切なSDKにリンクしていません。したがって、私が最終的に得たのは、BB10で実行するように作成されたバイナリである可能性が高いですが、まったく同じインフラストラクチャを備えていないデバイスで実行されます。興味深いことに、grepのようなものは機能しますが、--versionに答えることを拒否しました。つまり、BBSDKでコンパイルした場合の長いオプションです。


しかし、適切なSDKがあれば、問題はありません。ほとんどのターゲットが再コンパイルされました2。これはすべて Arch Linux x84_64 で発生しています。ここで multilib リポジトリが有効になっています(そして多くの lib32-パッケージがプルされました)。これは、私がgccに使用したbuild.sh構成ブロックです。3

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の両方が機能し、lsgrep--colorオプションでエイリアスしました。

enter image description here

最後に、 Playbook trが付いた機能的なシェル。これにより、 [〜#〜] qnx [〜 #〜]


1. Ryan Mansfield @ Foundry27の情報提供と @ Emmanuel の情報提供に感謝します。

2.除外されるターゲット:filemanRubyfindutils。結果のアーカイブは80Mibで、Ruby webrick サーバーを使用して意図したとおりにデプロイしました。

3. ... gcccoreutilsの両方に対して実際に(後者の場合はデフォルトに追加)。すべてのオプションが必須であるか、または推奨されているかは明らかではありません。 build.shスクリプトを適切なbootstrap/targetディレクトリ、つまりbootstrap/gcc/build.shで起動することにより、すべてのターゲットを個別に構築できます。ビルド環境(bbndk-env.sh)は、-bオプション、つまりbuild.sh -b /path/to/bbndk-2.10を使用して、グローバルトップbuild.shスクリプトによって一度ソースされている必要があります。ソースは、それらが構築されているwork/targetディレクトリにフェッチされます。ビルドが成功し、オプションが指定されていない場合(プロジェクトのルートディレクトリのlib.shを参照)、アーカイブに圧縮されるpbhomeディレクトリ構造に追加されます(これは、 BGShell を実行しているデバイスの$ HOMEディレクトリ。また、私の場合は x86_64 に変更したlib.sh Darwin への参照にも注意してください。それ以外の場合は、元のプロジェクト構成、つまりarm-unknown-nto-qnx6.5.0eabiから何も変更されていません(QのようにBB10.3 SDKで8.0.0バージョンを使用するのとは対照的です)。したがって、問題のあるいくつかのターゲットを取り除くと、コンパイルは非常に簡単になります。

0
user44370