C# 无法在CentOS amd64上执行二进制文件
我正在尝试在CentOS上运行一个简单的程序。 该方案:C# 无法在CentOS amd64上执行二进制文件,c#,linux,bash,.net-core,x86-64,C#,Linux,Bash,.net Core,X86 64,我正在尝试在CentOS上运行一个简单的程序。 该方案: using System; namespace helloworld { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); returnHello(); } static string
using System;
namespace helloworld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
returnHello();
}
static string returnHello()
{
return "hwdy ha";
}
}
}
我的发布设置为:
我不确定我在这里遗漏了什么,对我来说,似乎该文件针对的是正确的操作系统,但我无法在CentOS中执行该文件。感谢您的帮助。谢谢不要在二进制可执行文件上运行bash,直接用
/helloworld
运行它
bash
是一个shell脚本解释器,拒绝读取非文本文件。e、 g
$ bash /bin/ls
/bin/ls: /bin/ls: cannot execute binary file
如果
/helloworld
不起作用,也可以尝试strace./helloworld
和ldd./helloworld
来检查嵌入在可执行文件中的错误ELF解释器(动态链接器)路径。TLDR:您需要切换到更新的.NET Core操作系统,如CentOS 7或Debian 9
首先,根据/etc/*release
输出,您正在使用Debian wheezy(又名)。有几件事需要注意:这是在2013年发布的,生命结束于2016年。换句话说,你使用的是一个任何人都不支持的操作系统。.NET Core不支持它。Debian本身不支持它。(CentOS肯定不支持)
其次,每个.NETCore版本都有一个它支持的平台列表(以及特定版本的平台)。这些平台的旧版本缺乏功能、兼容性,或者其他一些使.NETCore不适合在那里运行的东西
.NET核心2.1。对于Debian,它只支持Debian 9(我假设,更高版本发布时也支持)
由于.NET Core支持Debian 9,因此它利用了C库(glibc
)中的许多功能,这些功能需要最新版本的glibc
。Debian 7没有最新版本的glibc,因此无法运行.NET Core 2.1应用程序
您应该尝试更新版本的Debian、CentOS或其他Linux发行版。我知道.NETCore2.1在RHEL(以及CentOS的扩展)上运行良好。它应该在Debian和Ubuntu的最新版本上运行良好
有两种方法可以修改.NET Core并解决此错误,但它相当先进,会使您无法更新到新的.NET Core点版本,因此我不推荐它:您可以引导.NET Core本身(如重新编译.NET Core本身)支持Debian 7,然后使用它来运行应用程序。您尝试过CPU吗?是的,很抱歉我没有写。这是什么版本的CentOS?6?@OmairMajid,当我运行“uname-or”时,我得到了3.2.0-3-amd64 GNU/Linux。我不能完全确定它是否为6。请尝试
cat/etc/*-release
。谢谢。我尝试了./helloworld,但权限被拒绝,然后我尝试了“ldd./helloworld”,得到了“/usr/lib/x86_64-linux-gnu/libstdc++.so.6:找不到版本`GLIBCXX_3.4.18'(为./helloworld所需)”。对于“strace./helloworld”,我得到了strace:command-not-found。我查看了上面的注释,然后运行了“chmod+x helloworld”,我想我缺少了可执行权限。现在当我运行./helloworld时,我只得到了“/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`GLIBCXX_3.4.18`找不到(由./helloworld要求)”,我在go中制作了相同的helloworld程序(名为:helloworldgo),并为linux amd64构建了它。我想看看哪个版本的linux更容易构建。用./helloworldgo运行go版本运行得很好@彼得,谢谢你指出这一点。@Patrick:是的,“权限被拒绝”肯定是因为缺少+x
权限strace
和ltrace
是调试此类低级问题的有用工具(查看实际的系统调用进程正在进行,例如它们正在查看的路径。strace-e file./hello
通常很有用)。我建议安装strace
;所有主流Linux版本都会打包它。你的库版本错误显示了一个C++库ABI版本在构建主机和你试图运行它的地方之间的不匹配。与libc
不同,libstdc++
在不增加.so.6
到不同文件名的情况下以不兼容的方式进行更改,因此他们进行符号版本控制,以提供动态链接器错误,而不是难以调试的神秘崩溃。您好,我希望我能更新那台机器,然而不幸的是,这个建议对我来说是不可能的。不过,我非常感谢你的推荐。我工作的公司担心更新这台机器会导致遗留软件出现其他问题,因此拒绝允许这样做。我发现我可以为这台机器成功地构建Go程序,所以我有一个解决方案。再次感谢你!