无法为ARM交叉编译Mono

5
在过去的三天里,我一直在尝试使用虚拟Ubuntu(12.04)和CodeSourcery Sourcery G ++ ARM工具链在我的Win7 32位机器上为TechNexion Blizzard板(运行未知版本的Angstrom)交叉编译Mono 2.11.4,但几乎没有成功。我已经按照网上的每个教程进行了操作,但它仍然无法正常工作。
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的源代码,并按照说明进行操作。在本机上完成第一部分操作时,没有出现任何错误。但是,在运行第二部分(编译ARM)时,./configure如预期工作,但是make却失败并显示"../lib/mini[some_file] is incompatible with arm output"。文件中的file表明这些文件确实是Intel 80386可执行文件,但我不知道为什么。

因此,下一步是运行make clean,然后重复步骤,但结果仍然相同。

接着我尝试在sb2内部运行整个./configuremake过程,起初似乎可以工作。但随后出现了一些错误导致构建失败:

./.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

有没有关于我做错了什么的想法,或者有没有我可能错过的教程提示?//Anders

为什么选择Mono 2.11.4而不是Mono 3.0?11是一个奇数,因此意味着“不稳定”。 - knocte
当然,我可以尝试使用2.10.9,但我认为它也不会编译。但是,我会尝试的。 3.0版本仍处于测试阶段,所以现在不是一个选择。 - user1143242
如果Mono 3.0可以编译而旧版本不行,那宁可选前者也不要什么都没有,对吧? ;) 另外,你在哪里看到说3.0是beta版的呢? - knocte
1
Mono下载页面上,它写着Beta版本:3.0,但也许他们只是指预编译的OSX二进制文件。我会检查源代码。 - user1143242
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

2
那么Scratchbox比Scratchbox2更好用吗? 当我进行一些严肃的谷歌搜索时,我有点感觉是相反的(即Sb2更好)。 - user1143242

0

在交叉编译时,您需要非常小心地选择要编译的头文件和库,否则可能会因为与库的二进制不兼容性而导致奇怪和反直观的运行时崩溃。尽管如此,Linux ARM发行版通常会以二进制兼容性为重,这往往会牺牲一些性能。

很可能您正在使用开发主机的头文件和库进行构建,因此出现了架构不匹配的情况。

您可能会发现预构建的opkg映像可以正常工作。Angstrom为您提供预构建的软件包。这可能只需要从Angstrom软件包存储库进行网络安装即可解决问题。

如果您确实需要从源代码构建,则解决问题的一个简单方法是获取Angstrom的构建环境并使用它来构建mono。最简单的方法是从Angtrom在线映像构建器获取预构建的映像(和开发映像)。希望您的板子上存在这样的映像。


很不幸,该板块未列在Narcissus页面上,但我将不得不深入挖掘并查看是否有任何“兼容性”。 - user1143242
我在测试Beagleboard时经常使用构建器,但是当包含Mono时,我从来没有成功过。不知道为什么,它就是不起作用...我以为在一个看起来工作正常的Scratchbox2中编译是安全的。就像我所说的:我可以编译简单的程序(甚至是Sqlite3),但是Mono却失败了。 - user1143242
我已经在使用预构建的Mono(使用opkg安装),但不幸的是它是2.6.3版本。我需要2.10.x来运行我的.NET 4.0代码。2.10.8存在作为预构建,但仅适用于比我使用的Angstrom更新的版本,因此也许我应该专注于升级Angstrom? - user1143242
过去我曾在OMAP3和OMAP4系统上运行过mono。然而,它是系统镜像的一个巨大补充!实际上只有内核和引导程序是特定于板子的,所以如果你已经有了一个(看起来你已经有了),你只需要为正确的ARM架构版本构建一个Angstrom映像。 - marko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接