使用 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的问题?
【问题讨论】:
我使用./newfile
或 sh 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编译的Mono可执行文件?
如何从 CUDA C++ 创建和使用动态库“.so”并在 Linux 环境 (CentOS) 下的 C# 代码中使用它?