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

4
如此线程这里所述,我正在使用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代码的结果。在原始系统(Ubuntu)上,该文件是可执行的。然而,每当我在Apache Web服务器上调用newfile时,我会收到以下错误:

无法执行二进制文件

同样,在执行 file newfile 时,它指出

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

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

...静态链接...

不是吗?有人知道为什么服务器上的文件无法执行吗?是因为32位/64位的问题吗?


我使用./newfilesh newfile通过PHP调用应用程序。我已经尝试了这两个选项,并使用了三个PHP命令exec/passthru/system。每次都会出现相同的错误无法执行二进制文件(我在apache错误日志中读取错误信息)。 - tyrex
1
你能展示一下 file newfile 吗?你的服务器系统是32位的吗? - wRAR
好主意。服务器上 file newfile 的输出是 ELF 64-bit LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接 (使用共享库),未剥离。至于服务器系统,我需要找出它是 32 位还是 64 位,并将信息反馈给您。当我在构建机器 (Ubuntu) 上使用相同的命令时,它会给出相同的输出,加上 for GNU/Linux 2.6.15。也许 mkbundle 没有按照我的要求完成工作,即没有将所有链接库包含到一个文件中?! - tyrex
1
根据此链接,服务器有一个32位内核,而我在64位内核上使用mkbundle命令。这可能是问题吗?我已相应地编辑了问题。 - tyrex
1个回答

7

mkbundle 从 64 位 Mono 生成的是 64 位可执行文件,而你无法在 32 位内核上运行 64 位可执行文件。由于 mkbundle 没有生成 32 位二进制文件的选项,所以理论上您需要使用 32 位 Mono 生成可执行文件(虚拟机中安装 32 位系统可能更容易一些,建议这样做)。


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

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