c# - Mono native 二进制包无法在较新的 Linux 内核中加载 libc

标签 c# linux ubuntu mono

我正在尝试将 C# Mono 应用程序构建为 native 二进制文件,以便它可以在没有任何依赖项(例如 Mono)的 Linux 系统上运行。

为了确保某些向后兼容性,我使用 Ubuntu 12.04 来构建 native 二进制文件。我必须从源代码构建 Mono 3.x,因为 Ubuntu 12.04 只有 Mono 2 的包。我记录了 that process here ,如果您有兴趣的话。

我正在使用 mkbundle捆绑 Mono 运行时及其依赖项:

mkbundle -c -o WFTOLauncherNative.c -oo bundles.o --static --deps WFTOLauncher.exe Open.NAT.dll

我正在像这样使用 cc 编译器:

cc -o WFTOLauncherNative.exe WFTOLauncherNative.c bundles.o -l:libmono-2.0.a -l:libgdiplus.a -lc -lpthread -lrt -lm -ldl -I /usr/local/include/mono-2.0/

这适用于我构建它的系统 (Ubuntu 12.04)。但是在没有安装 Mono 的 Ubuntu 14.04 上,我收到以下错误:

Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.DllNotFoundException: libc

应用程序的ldd:

scott@ubuntu:/media/strichnet/WFTOLauncher/bin/Release/LinuxNative$ ldd WFTOLauncherNative.exe
    linux-vdso.so.1 =>  (0x00007fffd0ffe000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa6c794a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa6c7d27000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa6c772c000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa6c7523000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa6c721d000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa6c7019000)

到目前为止,我的直觉是 Mono 在这里出了问题——我认为它依赖于 Mono DllMap 配置从 libc 映射到 libc.so.6,但它失败了。关于 SO 和 answer here 也有类似的问题看起来很有前途,但由于我的目标是创建一个独立的 native 程序集,这不是我可以接受的解决方案。

我已将默认的 Mono 3 配置文件从/etc/mono/config 复制到二进制目录并将其重命名为 WFTOLauncher.exe.config 和 WFTOLauncherNative.exe.config(以防万一)。这没有帮助。

这里有完整的 Mono 调试跟踪:https://gist.github.com/strich/e71b23421cdbe941b4f4

最佳答案

问题的根本原因是 Mono 正在寻找 libc.so,而操作系统只有 libc.so.6。 Mono 需要一个 DllMap 配置文件来理解如何翻译它。

问题的解决方案是将默认的 Mono3 DllMap 配置文件添加到与我的二进制文件相同的目录中。遗憾的是,Mono 似乎没有为进程全局缓存 DllMap,因此我不得不在被调用的各种模块的不同名称下制作配置文件的多个副本。例如:

Mono.Posix.dll.config
System.Drawing.dll.config
System.Windows.Forms.dll.config

关于c# - Mono native 二进制包无法在较新的 Linux 内核中加载 libc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374413/

相关文章:

c# - 重构乐趣 - 素数

node.js - 在 alpine 中运行 curl 需要很长时间才能开始

linux - 通过控制台使用自定义调色板将图像转换为索引颜色

linux - 使用 shell gitlab-runner ERRO [0000] 时出现 docker 错误

ubuntu - AWS ubuntu 14.04 实例中的虚拟盒安装问题 "Running VirtualBox in a Xen environment is not supported"

bash - 在 bash 中绕过过滤 "."和 "space"

c# - Microsoft Access 列出所有数据库

c# - 创建邮件时在 Outlook 加载项 (C#) 中读取 Outlook 附件内容

c# - 绘制图形的最佳方法是什么?

linux - 仅在键入字符后退格删除 bash 提示