使用 mkbundle 从 C# 源代码创建 Linux 可执行文件时出现问题

Posted

技术标签:

【中文标题】使用 mkbundle 从 C# 源代码创建 Linux 可执行文件时出现问题【英文标题】:Problems while creating a Linux-executable file from C# sourcecode using mkbundle 【发布时间】:2012-03-02 01:20:08 【问题描述】:

正如thread 和here 中提到的,我正在使用mkbundle -o newfile oldfile.exe --static(操作系统:Ubuntu 11.10 64 位,Mono:2.10.5)创建一个可以在 Apache Web 服务器(操作系统:Debian GNU/Linux 32 位)。这里,oldfile.exe 是使用 mcs oldfile.cs 编译 C#-Hello-World-Code 的结果。在原始系统(使用 Ubuntu)上,该文件是可执行的。但是,每当我在 Apache Web 服务器上调用 newfile 时,我都会收到错误消息:

无法执行二进制文件

另外,当file newfile 它说

ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),未剥离

我怀疑如果 mkbundle 按预期工作,那么它应该已经读取

...静态链接...

不应该吗?任何人都知道为什么该文件在服务器上不可执行?是不是因为32bit/64bit的问题?

【问题讨论】:

我使用 ./newfilesh newfile 使用 php 调用应用程序。我已经使用三个 PHP 命令exec/passthru/system 尝试了这两个选项。每次发生相同的错误cannot execute binary file 时(我在 apache-error-log 中读取错误)。 你能显示file newfile吗?你的服务器系统是 32 位的吗? 好主意。服务器上 file newfile 的输出是 ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped 。至于服务器系统,我必须确定它是 32 位还是 64 位,然后会返回该信息。当我在构建机器(Ubuntu)上使用相同的命令时,它会给出相同的加号for GNU/Linux 2.6.15。也许,mkbundle 没有做我想做的事,即没有将所有链接的库包含在一个文件中?! 根据this link,服务器有一个 32 位内核,而我在 64 位内核上使用 mkbundle-command。这可能是问题吗?我相应地编辑了问题。 【参考方案1】:

mkbundle 来自 64 位 Mono 生成 64 位可执行文件,您无法在 32 位内核上运行 64 位可执行文件。由于mkbundle 没有生成 32 位二进制文​​件的选项,您显然需要使用 32 位 Mono 生成可执行文件(理论上您可以在 64 位系统上安装 32 位 Mono,但这并不容易,所以我建议在某个地方安装一个 32 位系统,可能在 VM 中)。

【讨论】:

是的,基本上 mkbundle 依赖于嵌入构成您正在使用的运行时一部分的静态或共享库。

以上是关于使用 mkbundle 从 C# 源代码创建 Linux 可执行文件时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

mkbundle - Linux man page

我是否需要特殊许可才能分发使用mkbundle编译的Mono可执行文件?

将 ul li 转换为字符串列表 c#

如何从 C# 中的代码构建 HTML

用于从配置文件创建数组的可扩展 C# 代码

如何从 CUDA C++ 创建和使用动态库“.so”并在 Linux 环境 (CentOS) 下的 C# 代码中使用它?