为什么Golang开发的软件单文件直接丢到各种Linux系统就能运行?
创始人
2025-07-09 07:30:22
0

提到跨平台开发,就首先想到C语言,准确的说应该叫ANSI C。

ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。ANSI C 主要标准化了现存的实现, 同时增加了一些来自 C++ 的内容 (主要是函数原型) 并支持多国字符集 (包括备受争议的三字符序列)。ANSI C 标准同时规定了 C 运行期库例程的标准。一些开源项目根据ANSI C标准进行开发后,可移植行就非常好。

但无奈,随着新指令集的CPU不断出现,如果开发者自己要从ANSI C方式去编码,实现减少由于不同软硬件架构的差异对上层应用的影响,那属实要做很大的基础工作。

所以当更加专业的语言Go出来后,由于设计者基于既往设计C语言的成功经验去粗取精,又结合近二三十年来的CPU架构和操作系统、云计算的新趋势,而造出了Go这样的多平台多CPU通吃的语言。正是这种定位,所以Go语言在可执行文件的链接方面就与众不同。

比如当小白不小心把linux系统的底层加载程序 ld-linux.so 文件删掉了,

准备跑路吧~~ 

因为此后系统内所有 C/C++/Python/Nodejs/PHP/Java等语言开发编译的可执行文件,全都启动失败,出现莫名其妙的错误,比如cp命令是存在于 /usr/bin/cp 路径的文件,但此时调用cp,报错No such file or directry 。

这是因为以上Python等所列的语言,本质上都是C语言开发的,它们的可执行文件的底层链接的系统动态库,要想运行都先依赖于 ld-linux.so 帮它们处理好ELF的二进制可执行文件、链接库的代码段落、数据段等内容加载到内存,然后CPU根据二进制指令执行代码逻辑,处理数据,完成计算任务。而这个底层的 ld-linux.so 动态库文件一旦自身不保,那么,其他依赖的软件当然全部异常。

而我们之前编译的Go的main函数测试二进制文件main。仍然能启动。

那么Go语言是如何独步江湖的呢?可以推断,Go的链接方式不使用ld-linux.so。

Go的编译器生成的静态链接的GO应用二进制文件,已包含了可供完整载入内存和需要的所有指令。既然这样,不管是Linux发行版A还是B系统自带的glibC 的版本是否过时,是否过新,跟GO能否正常运行关系不大。GO软件运行所需的都已经自给自足了。也因此Go可以带着它的干粮,不管丢到哪里就可以在那里运行。

当然,这离不开Go语言开发团队背后做了很多底层适配兼容,帮应用开发者省去了这份操心。也让这门语言兑现了它所吹过的牛。

下图为Golang 最新版1.21.5所支持的CPU架构、操作系统信息,实际Go目前能支持的已经超过这些平台范围。部分小众的系统架构也支持,图中未列出。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...