crosstool-ngを使用したLinux上のOS Xでのクロスコンパイル





この記事では、クロスツールチェーンcrosstool-ngのアセンブリを自動化するための素晴らしいツールについて説明します。これは、自尊心のある組み込み開発者にとってほとんど不可欠なツールです。 arm-linux用にx86-linuxからソフトウェアを真剣に構築する必要がある場合は、おそらく聞いたことがあるでしょう。



このガイドでは、アーキテクチャによるクロスコンパイルではなく、システムによるクロスコンパイル-Darwinでの Linuxビルドについて説明します。



免責事項

OSでcrosstool-ngを構築するためのインターネットに関する記事がいくつかあります 。たとえば、 benmont.com公式マニュアルなどです。 ただし、一部の記事では多くのエラーや古い情報があり、他の記事では一般的な機能のみが説明されています。 ここでは、2013年7月にツールチェーンを正常に構築したパスを説明します。



準備する

この部分は、OS X- MacPortsまたはHomebrewで使用するパッケージマネージャーによって異なります。 私はずっと前に自分でポートウェイを選んだので、これに基づいて書きます。



1.大文字と小文字を区別するファイルシステム
ここではすべてが簡単です。OSXにはユーティリティDisk Utilityがあり 、これを使用して新しいパーティションを作成します。 5 GB以上かかります。







2.ツール
MacPortsがインストールされていることが前提です。 次のパッケージをインストールします。



ncurses lzma libtool binutils gsed gawk grep gcc48
      
      





システム上にあるgccのバージョンを確認しましょう: sudo port select --list gcc mp-gcc48が必要です-sudo port select --set gcc mp-gcc48コマンドでデフォルトで選択します。



3. crosstool-ngのインストール
ツールキット自体の収集は非常に簡単です。公式の指示を使用します。



 hg clone http://crosstool-ng.org/hg/crosstool-ng cd crosstool-ng ./bootstrap
      
      





公式の指示を中断せざるを得ないkconfig / zconf.hash.cファイルに十分な行がありません

 #include <stddef.h>
      
      





 ./configure \ --with-objcopy=/opt/local/bin/gobjcopy \ --with-objdump=/opt/local/bin/gobjdump \ --with-readelf=/opt/local/bin/greadelf \ --with-sed=/opt/local/bin/gsed \ --with-libtool=/opt/local/bin/glibtool \ --with-grep=/opt/local/bin/grep \ --with-install=/opt/local/bin/ginstall make sudo make install
      
      





これにより、 ct-ng/usr/local/bin



インストールされます。 ホームディレクトリct-ng:リビジョンに応じて/usr/local/lib/ct-ng.hg+default-2685dfa9de14



このディレクトリで、 スクリプト/関数ファイルを編集し、Darwinの行をLinuxの行に置き換えます。

 --- scripts/functions.orig 2013-07-09 22:15:12.000000000 +0400 +++ scripts/functions 2013-07-06 04:28:41.000000000 +0400 @@ -460,7 +460,7 @@ mode="$(stat -c '%a' "$(dirname "${dir}")")" ;; Darwin|*BSD) - mode="$(stat -f '%Lp' "$(dirname "${dir}")")" + mode="$(stat -c '%a' "$(dirname "${dir}")")" ;; *) CT_Abort "Unhandled host OS $CT_SYS_OS"
      
      





これは、ct-ngが誤ってOS Xの元のstatではなくGNUセットのgstatのバージョンを使用しているためです。ローカルコードの美しさと優雅さを賞賛し 、ファイルを閉じます。



bash-completionct-ng.compスクリプトをコピーすることもできます。

次に、すばらしいクロスツールチェーンとそのsysrootが偽造される一時フォルダーを選択する必要があります。 /Volumes/Unixen/ct-config



あります。フォルダに移動して設定を開始します。



Crosstool-ngのセットアップ

構成を開始する前に、テンプレートから構成を継承します。 x86_64-unknown-linux-gnuに興味があります:



 cd /Volumes/Unixen/ct-config ct-ng x86_64-unknown-linux-gnu ct-ng menuconfig
      
      





その後、ツールを設定するメニューが表示されます。



1.パスとその他のオプション
Local /Volumes/Unixen/src



ディレクトリ/Volumes/Unixen/src



)およびPrefixディレクトリ/Volumes/Unixen/${CT_TARGET}



/Volumes/Unixen/${CT_TARGET}



を指定することが重要です。作成することを忘れないでください/Volumes/Unixen/src







2. Cコンパイラ
ここでは、機能を有効にしてビルドするときのGCCの動作がわからないため、JavaとFortranのサポートをオフにしました。 [] libstdc ++をgccバイナリに静的にリンクしないようにしてください。そうしないとエラーが発生します

 collect2: error: ld returned 1 exit status ld: library not found for -lcrt0.o
      
      





3.デバッグ機能
ここでは、 dmallocltraceのサポートを無効にする必要があります。そうしないと、解決できない問題が発生します。 gdbセクションで、 [] Native gdbを無効にし、必要でない場合は[*] Pythonスクリプトを有効にします (Pythonの問題ですが、解決策は低くなります)。 私はgdbバージョン(7.3.1)を使用しています



4.コンパニオンライブラリ
次のライブラリバージョンは厳密にここにあります。そうでない場合は、コンパイルエラーとオートツールがあります。これらのバージョンを入力して選択しました。

  * GMP version (5.0.2) * MPFR version (3.1.2) * PPL version (0.11.2) * CLooG version (0.15.11) * MPC version (1.0.1)
      
      





ツールチェーンアセンブリ

ほとんどすべての準備が整いました。 ビルドプロセス中に次のエラーが発生する場合があります(カーネルバージョンは私のものです)。

 [ERROR] /Volumes/Unixen/ct-config/.build/src/linux-3.8.11/arch/x86/tools/relocs.c:8:17: fatal error: elf.h: No such file or directory
      
      





したがって、信頼できるソースからelf.h取得することにより、事前にこれを処理します。 手元にない場合は、 elf.hを使用してください。 /usr/include



入れ/usr/include







また、開いているファイルの制限を修正する必要があります( RE:Libc iconvdataコンパイルの問題 ):

 ulimit -n 1024
      
      





ビルド中にgdbでエラーが発生した場合、 [*] Pythonスクリプトを有効にする前に無効にしていない場合:

 configure: error: python is missing or unusable
      
      





次に、 行をコメントアウトして.build / gdb-* / gdb / python / python-config.pyファイルを編集します

 # if getvar('LINKFORSHARED') is not None: # libs.extend(getvar('LINKFORSHARED').split())
      
      





すべて準備完了のようです。

 ct-ng build
      
      





i5を搭載したMacbook Airでは、アセンブリに約69分かかり 、おそらくいくつかのエラーが途中でポップアップします。 そのため、コンピューターから離れても機能しません。



おわりに







/ボリューム/ Unixen $ du -csh ct-config /
 4,0G ct-config/ 4,0G 
      
      





/ボリューム/ Unixen $ x86_64-unknown-linux-gnu / bin / x86_64-unknown-linux-gnu-gcc -v
 Using built-in specs. COLLECT_GCC=x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/Volumes/Unixen/x86_64-unknown-linux-gnu/libexec/gcc/x86_64-unknown-linux-gnu/4.7.3/lto-wrapper Configured with: /Volumes/Unixen/ct-config/.build/src/gcc-4.7.3/configure --build=x86_64-build_apple-darwin12.4.0 --host=x86_64-build_apple-darwin12.4.0 --target=x86_64-unknown-linux-gnu --prefix=/Volumes/Unixen/x86_64-unknown-linux-gnu --with-sysroot=/Volumes/Unixen/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot --enable-languages=c,c++ ..... Target: x86_64-unknown-linux-gnu Thread model: posix gcc version 4.7.3 (crosstool-NG hg+default-2685dfa9de14)
      
      





あなたは何かを収集しようとすることができます:

 cd linux-source-3.9 export PATH=$PATH:/Volumes/Unixen/x86_64-unknown-linux-gnu/bin export C_INCLUDE_PATH=/usr/include:/opt/local/include:/Volumes/Unixen/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot/usr/include make ARCH=x86_64 CROSS_COMPILE=x86_64-unknown-linux-gnu- all -j4
      
      





成功した

Xlabがありました。



All Articles