5

過去 3 日間、Win7 32 ビット マシンで仮想 Ubuntu (12.04) と CodeSourcery Sourcery G++ ARM ツールチェーンを使用して、TechNexion Blizzard ボード (不明なバージョンの Angstrom を実行) 用に Mono 2.11.4 をクロスコンパイルしようとしてきました。 、しかし、ほとんど/まったく成功していません。Web 上のすべてのチュートリアルに従いましたが、うまくいきません。

CodeSourcery Sourcery G++ ツールチェーンと Scratchbox2 (最新の git ソースからコンパイル) がインストールされ、動作しています。Scratchbox2はそれを使用してセットアップしました

sb2-init armv7 /home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc

正しいディレクトリ (~/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc) にある間。

シンプルな「Hello world」(cpp) をコンパイルし、コンパイルしてボード上で実行できます。Ubuntu の場合:

file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

Mono 2.11.4 のソースをダウンロードし、指示の 1 つに従いました。最初の部分 (ネイティブ マシン上) は正常に動作し、エラーは発生しません。ただし、2 番目の部分 (ARM 用にコンパイル) を実行すると、./configure は期待どおりに動作しますが、make は " ../lib/mini[some_file ] is incompatible with arm output" で失敗します。これらのファイルのファイルは、それらが確かに Intel 80386 実行可能ファイルであると述べていますが、その理由はわかりません。

そのため、次のステップはmake cleanを実行して手順を繰り返すことでしたが、それでも同じ結果が得られました。

次に、代わりに./configureを実行し、すべてを sb2 内に作成しようとしましたが、最初はうまくいくように見えました。しかし、その後、いくつかのエラーがポップアップし、ビルドが壊れました:

./.libs/libmini.a(libmini_la-mini-arm.o): In function `mono_arch_init':
/home/dev/source/host-mono/mono-2.11.4/mono/mini/mini-arm.c:689: undefined reference to `debugger_agent_single_step_from_context'
/home/dev/source/host-mono/mono-2.11.4/mono/mini/mini-arm.c:689: undefined reference to `debugger_agent_breakpoint_from_context'
/home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld: .libs/libmono-2.0.so.1.0.0: hidden symbol `debugger_agent_single_step_from_context' isn't defined
/home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld: final link failed: Nonrepresentable section on output

私が間違っていることについてのアイデア、または見逃した可能性のあるチュートリアルに関するヒントはありますか?

//アンダース

4

2 に答える 2

0

ネイティブコードのコンパイルにはScratchBoxを使用することをお勧めします

[sbox-ARMEL: ~] > mkdir cross
[sbox-ARMEL: ~] > cd cross
[sbox-ARMEL: ~] > tar xzf ../mono-x.xx.tar.gz

[sbox-ARMEL: ~] > cd arm-mono-x.xx
[sbox-ARMEL: ~] > ./configure --disable-mcs-build
[sbox-ARMEL: ~] > make 
[sbox-ARMEL: ~] > make install DESTDIR=`pwd`/tmptree

反対側で新しいターミナルを開き、マネージコードをビルドします。

$ mkdir host-mono
$ cd host-mono
$ tar xzf ../mono-1.xx.tar.gz

$ cd mono-1.xx
$ ./configure
$ make
$ make install DESTDIR=`pwd`/tmptree
于 2012-11-04T05:50:26.257 に答える
0

クロスコンパイルするときは、コンパイルするヘッダーとライブラリに十分注意する必要があります。そうしないと、ライブラリに対するバイナリの非互換性が原因で、実行時に奇妙で直感に反するクラッシュが発生する可能性があります。これを言うと、Linux ARM ディストリビューションはバイナリ互換で非常に安全に動作しますが、通常はパフォーマンスが犠牲になります。

開発ホストのヘッダーとライブラリに対してビルドしている可能性は十分にあります-したがって、アーキテクチャの不一致です。

ビルド済みの opkg イメージが正常に機能することに気付くかもしれません。Angstrom は、ビルド済みのパッケージを提供します。Angstrom パッケージ リポジトリからネットワーク インストールするのと同じくらい簡単かもしれません。

ソースからビルドする必要がある場合、Angstrom 用のビルド環境を取得し、それを使用して mono をビルドすることが、問題の簡単な解決策の 1 つです。これを行う最も簡単な方法は、Angtrom オンライン イメージ ビルダーからビルド済みのイメージ (および開発イメージ) を取得することです。運が良ければ、ボードに 1 つ存在します。

于 2012-11-05T02:05:02.573 に答える