【问题标题】:Cannot cross-compile Mono for ARM [duplicate]无法为 ARM 交叉编译 Mono [重复]
【发布时间】:2014-07-08 20:56:39
【问题描述】:

在过去的三天里,我一直在尝试在我的 Win7 32 位机器和 CodeSourcery Sourcery 上使用虚拟 Ubuntu (12.04) 为 TechNexion Blizzard 板(运行未知版本的 Angstrom)交叉编译 Mono 2.11.4 G++ ARM 工具链,但很少/没有成功。 我已经按照网络上的每个教程进行操作,但它不起作用。

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 的源代码并关注了instructions 之一。第一部分(在本机机器上)运行良好,没有错误。但是,当我运行第二部分(为 ARM 编译)时,./configure 按预期工作,但随后 make 失败并出现 "../lib/mini[some_file] is incompatible with arm output" 。这些文件的文件表明它们确实是 Intel 80386 可执行文件,但我不知道为什么。

所以下一步是运行 ma​​ke clean 并重复这些步骤,但仍然产生相同的结果。

然后我尝试在 sb2 中 ./configurema​​ke 整个东西,起初它似乎工作。但是随后出现了一些错误,构建失败了:

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

关于我做错了什么的任何想法,或者关于我可能错过的教程的任何提示?

//安德斯

【问题讨论】:

  • 为什么是单声道 2.11.4 而不是单声道 3.0? 11 是一个奇数,所以它意味着“不稳定”
  • 当然,我可以尝试使用 2.10.9,但我认为它也不会编译。但是我会尝试。 3.0 仍处于测试阶段,所以现在不能选择。
  • 如果单声道 3.0 编译而旧版本没有编译,宁愿拥有它而不是什么都没有,不是吗? ;) 顺便说一句,您在哪里读到 3.0 被标记为测试版?
  • Mono download page 上显示 Beta 版本:3.0,但也许它们仅表示预构建的 OSX 二进制文件。我会检查源代码。

标签: mono arm cross-compiling embedded-linux


【解决方案1】:

使用 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

【讨论】:

  • 那么Scratchbox比Scratchbox2好用吗?在进行一些严肃的谷歌搜索时,我有种相反的感觉(Sb2 更好)。
【解决方案2】:

在交叉编译时你需要非常小心你编译的头文件和库,否则你会发现自己在运行时遇到奇怪和违反直觉的崩溃,这是由于库的二进制不兼容而导致的。这么说来,Linux ARM 发行版在二进制兼容性方面非常安全——通常以牺牲性能为代价。

很有可能您正在针对您的开发主机头文件和库进行构建 - 因此架构不匹配。

您可能会发现预先构建的 opkg 映像可以正常工作。 Angstrom 为您提供pre-built packages。它可能就像从 Angstrom 软件包存储库进行网络安装一样简单。

如果您发现确实需要从源代码构建,解决问题的一个简单方法是获取 Angstrom 的构建环境并使用它来构建单声道。解决此问题的最简单方法是从the Angtrom online image builder 获取预构建的映像(和开发映像)。运气好的话,你的板子里有一个。

【讨论】:

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