問題タブ [linaro]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
216 参照

c++ - Linaro ツールチェーンが ARMv5 バイナリの作成に失敗する

C++11 をサポートするようにコンパイラをアップグレードしようとしています。ターゲット マシンのカーネルは 2.6.33.20 です。

この目的のために、https: //releases.linaro.org/components/toolchain/binaries/ にあるビルド済みバイナリ、つまりバージョン 5.5.0 を使用しようとしています。

些細なテストプログラム

コマンドで正常にコンパイルされますarm-linux-gnueabi-g++ -o test -static-libstdc++ -std=gnu++11 main.cpp

実行可能ファイルを実行するfileと、test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=2d49dc2492f7fb2ee5992f7614604aac370e42f7, with debug_info, not stripped.

file コマンドを同じソースに対して実行しますが、古い (C++11 より前の) コンパイラでコンパイルすると、次の結果が得られます。test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.14, not stripped

readelf -A古い(動作中の)コンパイラのyieldの出力:

一方、新しいコンパイラによって生成された新しいコンパイラは、次の結果をもたらします。

-mcpu=arm10tdmiこれに続いて、上記のコマンドにフラグを追加しました(結果はarm-linux-gnueabi-g++ -mcpu=arm10tdmi -o test main.cpp) ですが、readelf の出力は同じままです。ARM フラグを使用する-march=arm5vt-mtune=arm10tdmi、まったく同じ結果になります。

これは、コンパイラがアーキテクチャ フラグを無視し (または、ARM5 のビルドをサポートしていない可能性があります)、ARM7 のビルドを主張していることを示唆しています。

ツールチェーン 4.9 も試しましたが、結果は同じでした。

補足として: Ubuntu 14.04 に同梱されている arm-linux-gnueabi-g++ は (C++11 をサポートして) 動作することが知られていますが、使用するフォルダーにパックする方法が見つからないようです。譲渡可能なツールチェーンとして。

編集: old_timer の入力に従って、次のコマンドを使用して、コンパイルをオブジェクト ファイル (main.o) にリダイレクトしました。arm-linux-gnueabi-g++ -mcpu=arm10tdmi main.cpp -c

結果のオブジェクト ファイルで実行readelf -Aすると、次の出力が得られます。

ただし、これを使用して実際の実行可能ファイルを作成しようとするとarm-linux-gnueabi-g++ -mcpu=arm10tdmi main.o -o test、readelf の出力が、上に投稿した ARMv7 の出力に戻ります。

これは、コンパイラ自体が -mcpu スイッチを理解して使用することを示唆していますが、リンカーは次に進み、それを ARMv7 バイナリに変換します。