問題タブ [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.
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 バイナリに変換します。