2022年5月

外媒关注阿里云向 RISC-V 移植安卓的进展

外媒对阿里云将安卓系统移植到 RISC-V 上的工作表示了关注。阿里云在一年前展示了运行在平头哥的 RISC-V 芯片上的安卓 10 用户界面。现在,阿里云透露,他们正在其 RISC-V 芯片上运行安卓 12,已经可以在其上播放音视频、使用 Wi-Fi 和蓝牙通讯、支持摄像头。此外,还成功实验了 TensorFlow Lite 模型,这意味着将能够运行图像和音频分类以及光学字符识别等工作负载。外媒认为,这将是中国实现减少对其他国家的技术依赖的重要一步。

消息来源:theregister
老王点评:RISC-V 也是开源的,安卓也是开源,在这上面真正搞出成绩来,比卖菜放款有意义多了。

加拿大修订刑法,将宇航员在月球行为纳入监管

在 50 多年前,阿波罗号宇航员在月球表面留下了 96 袋垃圾。只不过他们并不担心因乱丢垃圾而被罚款,毕竟包括月球在内的太空空间基本上没有法律。不过加拿大的法律制定者希望改变这种做法。本周四,加拿大对现有刑法进行了修订,允许起诉加拿大宇航员在月球旅行期间或在月球表面本身犯下的罪行。此前,加拿大的刑法典已经包括了其宇航员在国际空间站的法律规定。

消息来源:gizmodo
老王点评:太空也非法外之地,全球都应该对太空及外太空制定法律。

亚马逊仍是无可争议的公有云之王

有研究结果表明,本季度公有云市场收入达到了 530 亿美元,比上年同期增长 34%。亚马逊、微软和谷歌占据了整个云计算市场的 65% 份额。亚马逊在 2006 年开创了公有云市场,本季度份额为 33%;微软占 22%,谷歌占 10%。而接下来的 10 家公司共同分享 21% 的份额。

消息来源:techcrunch
老王点评:确实无可争议,国内的公有云厂商还有比较长的路要走。

你多半知道,Facebook 因可能从它的“端到端加密”的聊天服务 WhatsApp 那里共享用户数据而 遭到抨击

这些有争议的隐私政策变化使无数人转而使用 WhatsApp 替代品。

注重隐私的人们,早就料到了会有这事。毕竟,Facebook 可是花了 190 亿美元 收购 了 WhatsApp 这样的手机应用,而当时靠它还赚不到什么钱。现在,Facebook 该回本了 —— 回那之前投进去的 190 亿美元的本。他们可能打算把你的数据共享给广告商,这样的话,你看到的广告就会更加个性化(侵入性)了。

要是你受够了 Facebook、Google、Twitter 等科技公司的“我说了算”的态度,那你应该试试一些社交媒体平台的替代品。

这些社交平台的替代品都是开源的,它们都用了端到端或区块链技术来实现去中心化,而且你可能能够自己托管其中一些平台。

开源和去中心化的社交网络

Image Credit: Datonel on DeviantArt

先说句实话,这些替代平台的体验,可能会和你惯用平台的体验有所差异,但这些平台是不会侵犯你的隐私和言论自由的。这就是一种权衡。

1、Minds

  • 用于替代:Facebook 和 YouTube
  • 特点:代码开源、区块链
  • 自托管:否

在 Minds 上,你可以发视频、博客、图片,并设置当前状态。你也能向群聊,或者直接向好友,安全地发送消息或者进行视频聊天。通过热门内容和话题,你可以发现你感兴趣的文章。

还不止这些。你还能通过做贡献来赚取代币,这些代币可以用来升级你的频道。创作者可以从粉丝那里直接得到美元、比特币和以太坊的支付。

Minds

2、Aether

  • 用于替代:Reddit
  • 特点:开源、端到端
  • 自托管:否

Aether 是一个开源、端到端的平台,用于创建自我管理的社区,并可以审查管理记录以及选举版主。

Aether 上的内容,具有存在时间短的性质,并且内容只会留存六个月,除非有人把它保存下来。因为它是端到端的,所以中心服务器不复存在。

Aether 有趣的一点在于它的民主社区。社区可以选举版主,也能投票弹劾版主。

Aether

3、Mastodon

  • 用于替代:Twitter
  • 特点:开源、去中心化
  • 自托管:是

在自由开源软件爱好者中,Mastodon 已经很有名了。我们之前报道过 Twitter 的开源替代品 Mastodon,并且 你也可以在 Mastodon 上关注我们

Mastdon 并不像 Twitter 那样是一个单一网站,它是个由数千个社区组成的网络,这些社区都由不同的组织和个人运营,并且都提供无缝的社交媒体体验。这被称之为“Fediverse”。

你可以托管自己的 Mastodon 实例,并选择将其连接到其他 Mastodon 实例,或者直接加入一个已有的 Mastodon 实例,比如说 Mastodon Social

Mastodon

4、LBRY

  • 用于替代:YouTube
  • 特点:开源、去中心化、区块链
  • 自托管:否

LBRY 的核心是一个基于区块链的去中心化协议。协议顶层,便是由其加密货币驱动的数字市场。

通过 LBRY,创作者可以提供多种数字化内容,例如影片、书籍和游戏。基本上,它是作为 YouTube 的替代而受到推崇的。你可以在 Odysee 上访问这个视频共享平台。

我们之前 报道过 LBRY,你可以去读那篇文章了解详情。

LBRY

5、Pixelfed

  • 用于替代:Instagram
  • 特点:去中心化、区块链
  • 自托管:否

Pixelfed 和 Mastodon 使用了相同的底层开放协议,即 ActivityPub。

因此,你也可以通过 Pixelfed 与 Mastodon 的实例进行互动。我还没有试过,但从理论上讲,你应该可以做到这一点。你应该找到几个活跃的 Pixelfed 实例来注册。

如果你想控制你的数据和隐私,Pixelfed 是 Instagram 的一个简单替代品。你可以控制你的图片的隐私,在平台上没有任何广告。

你可以得到与照片分享平台基本相同的功能。然而,它没有驱动时间线的算法,遵循时间顺序,不收集你的任何数据,以获得个性化的体验。

Pixelfed

6、Peertube

  • 用于替代:YouTube
  • 特点:去中心化、端到端
  • 自托管:否

PeerTube 由法国公司 Framasoft 开发,它是一个去中心化的视频平台。PeerTube 使用了 BitTorrent 协议 以在用户之间共享宽带。

PeerTube 旨在抵制企业的垄断,它不依靠广告,并且也不会追踪你。不过要注意,你的 IP 地址在这里不是匿名的。

目前有许多 PeerTube 的实例,你可以在那里托管你的视频。有些实例需要付费,不过大多数都是免费的。

PeerTube

7、Diaspora

  • 用于替代:Facebook
  • 特点:去中心化、开源
  • 自托管:是

Diaspora 是最早的去中心化社交网络之一。最早可以追溯到 2010 年,当时 Diaspora 就作为 Facebook 的替代品而受到吹捧。最初几年,它确实得到了一些应得的关注,但它只在小众范围内得到了使用。

和 Mastodon 类似,Diaspora 由许多“ 豆荚 pod ” (节点服务器)组成。你可以在一个“豆荚”上注册,或者托管你自己的“豆荚”。科技公司无法拥有你的数据,只有你可以。

Diaspora

8、Dtube

  • 用于替代:YouTube
  • 特点:去中心化、区块链
  • 自托管:否

Dtube 是一个基于区块链的去中心化 YouTube 复制品。之所以说它是 YouTube 复制品,是因为它界面太像 YouTube 了。

Dtube 像其他基于区块链的社交媒体一样,是由 DTube 币(DTC)驱动的。每当有人观看创作者的视频或者与之互动,创作者就会获得 DTC。这些硬币可以用于推广内容,或者通过合作的加密货币交换方来提现。

DTube

9、Signal

用于替代:WhatsApp、Facebook Messenger 特点:开源 自托管:否

与端到端加密的 WhatsApp 聊天不同,Signal 不会跟踪你,不会共享你的数据,也不会侵犯你的隐私。

Signal 一举成名,是在它得到 Edward Snowden 的认可之时。而当 WhatsApp 开始与 Facebook 共享数据时,Elon Musk 又发了关于 Signal 的推文,这便让 Signal 更受瞩目了。

Signal 使用了自己的开源 Signal 协议,以提供端到端加密的消息和通话服务。

Signal

KARMA(已终止)

  • 用于替代:Instagram
  • 特点:去中心化、区块链
  • 自托管:否

这也是一个基于区块链的社交网络,由加密货币驱动。

KARMA 是 Instagram 的一个复制品,它构建于开源区块链平台 EOSIO 之上。每当你的内容获得了点赞和分享,你就会得到 KARMA 代币。你可以用这些代币来推广你的内容,或者通过一个合作的加密货币交换方,来将其转换为现实货币。

KARMA 只能在手机上使用,可以在 Play Store 及 App Store 上获取。

KARMA

还有别的吗?

还有一些其他的服务,它们虽然不是开源或者去中心化的,但也尊重你的隐私与言论自由。

还有一个基于 Matrix 协议的 Element 聊天工具,你也可以试试。

我知道,应该还有几个别的社交媒体平台的替代品。也想分享一下?我可能会把他们加到列表中来。

要是你也得在这个列表中选一个平台,你想选哪个呢?


via: https://itsfoss.com/mainstream-social-media-alternaives/

作者:Abhishek Prakash 选题:lujun9972 译者:Peaksol 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Shortwave 3.0 带来了急需的用户界面改进、添加私人电台的功能以及诸多升级。

Shortave 3.0

Shortwave 是 GNOME 上的一个流行的网络广播播放器。它默认提供了很多电台,总计超过 25000 个,所有这些电台都可以分组组织、进行搜索,还可以投射到其他设备(如 Chromecast)上。

Shortwave 3.0 将这些功能提升至一个全新的水平,有一些相当大的变化。让我们来看看有哪些新功能吧!

Shortwave 3.0 新功能

主要是引入了 Libadwaita,除此之外,Shortwave 3.0 还包括以下更新:

  • 支持 GNOME 42 的深色模式
  • 支持将私人电台添加到库中
  • 支持将电台数据保存到磁盘上
  • 改进了搜索结果的排序

用户界面的变化

图源:Felix Häcker

在过去的几个月里,许多应用程序都在向 Libadwaita 过渡。由于其流畅的视觉效果、集成的开发工作流程以及与 GNOME 的整合,它已经迅速成为所有新应用程序的必备工具。

最新一个升级到 Libadwaita 的应用程序是 Shortwave。因此,它现在有了一个自适应的用户界面,这对类似于 PinePhone 的 Linux 手机可能很有用。

此外,它现在采用了更现代的 Adwaita 设计,我非常喜欢。

随着用户界面的改进,它也支持新的 GNOME 42 的深色模式。下面是它的外观。

Shortwave 3.0 深色模式

保存电台数据

一个有用的新功能是支持将电台数据保存到磁盘上,而无需每次从服务器上接收。

因此,即使一个电台从服务器(radio-browser.info)上删除,它也会保留在应用程序中,并有消息通知用户这一变化。

添加私人电台

以前,你必须依赖 radio-browser.info 库中的可用电台。

现在,你可以从内部网络添加你的私人电台,或者通过 API 密钥添加一个独家/付费流。

其他变化

除了上面列出的那些,Shortwave 3.0 还有一些其他的改进:

  • 显示电台比特率信息,这也可以作为一个排序选项。
  • 在搜索页面上新增了一个按钮,可以对搜索结果进行排序。
  • 大幅度修改了电台对话框,显示信息更加清晰。
  • 在歌曲变化时更新桌面通知,而不是为每首歌曲生成新的单独通知。
  • 即使 radio-browser.info 处于离线/不可用状态,Shortwave 也可以正常使用。

总结

总的来说,Shortwave 3.0 是一个很棒的版本,它既改善了用户体验,又增加了新功能。

如果你想安装它,你可以到它的 Flathub 页面查看安装指南,或者直接在你的终端键入以下命令。

flatpak install flathub de.haeckerfelix.Shortwave

如果你还没有设置 Flatpak,你也可以参考我们的 Flatpak 指南

你尝试过 Shortwave 3.0 了吗?请在下面的评论中分享你的使用体验吧!


via: https://news.itsfoss.com/shortwave-3-0-release/

作者:Jacob Crume 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

软件工程师每周深度工作时间仅为 10 小时

据一份对 600 多名软件工程师的调查,在当前全球疫情的形式下,工程师们每周只剩下大约 10 小时的“深度工作”时间。这使得工程师们更多地转向开源。超过 80% 的开发者至少每个月都会将开源代码引入他们的工作,比如通过 StackOverflow、GitHub 复制代码。而几乎 50% 的受访者每周至少这样做一次。接受调查的工程师普遍认为在家工作的生产力没有提高,68% 的软件工程师认为在现场工作的生产力更高。

消息来源:retool
老王点评:真能认真编程 10 小时也不错,当然,剩下的时间我们也不是在摸鱼。

Canonical 将为 Ubuntu 22.04 LTS 提供测试版的实时内核

Canonical 宣布将开始为 Ubuntu 22.04 LTS 提供一个实时内核,尽管这个实时内核最初只是测试版。Linux 实时补丁已经出现了多年,并慢慢地进入主线内核。一旦所有的实时补丁都被纳入主线,只需在构建时进行切换就可以启用。这个适用于 x86\_64 和 AArch64 的实时内核是为满足低延迟需求和其他保障而定制的。但该实时内核需要通过 Ubuntu Advantage 服务才能启用。

消息来源:phoronix
老王点评:Linux 一直想在实时控制等工业领域取得进展,但是构建实时内核比较麻烦,Ubuntu 这一尝试值得肯定。

运行 Windows 11 的 POS 系统可能需要 40 分钟启动

微软发布了一个补丁,轻描淡写地表示,“我们修复了一个使操作系统启动延迟约 40 分钟的问题”,而没有特别指出这是出现在 POS 系统上的错误。Windows 仍然是许多主要用于零售和餐饮业的 POS 系统的首选操作系统,尽管一些 POS 系统还没有更新到 Windows 11。

消息来源:theregister
老王点评:真有人会把 POS 系统升级到 Windows 11 吗?

Nushell 是一个独特的 Shell,它提供易于阅读的错误信息,以及跨平台支持。在这里可以了解到更多关于它的信息。

即使你对使用终端不感兴趣,Linux 终端也常常使一些繁重的工作变得更加轻松,以及可以让你修复一些东西。因此,可以说,如果你知道自己在做什么,Linux 终端是相当强大的。

这也是事实!但是当你看到一些错误消息就表明出现问题了。如果你没有足够的使用经验,可能不知道如何解决它。

虽然这些错误信息试图向你传达该问题的最佳含义,但不是每个用户都能轻易理解该如何修复。对于初学者来说,这通常需要进行一些研究。但是,如果错误能更清晰一些,用户就能更快地解决它。

不仅仅限于错误信息,例如,你在终端浏览文件时看到的输出结构,也不是最漂亮的。

Terminal listing several files

你明白我的意思吗? 当然,当你有更多不同类型的文件时,这可能变得更加复杂。而且,你无法从基本的 ls 命令的输出中了解到文件的权限、组等。

这就是 Nushell 试图解决的问题。

Nushell:一个默认提供用户友好输出的 Shell

Nushell example screenshot

Nushell 也被称为 Nu,它的理念和灵感来自于 PowerShell、函数式编程语言和现代 CLI 工具等项目。

让我给你举个例子,想象一下你只想让你的输出列出你的主目录内类型为文件的项目,包括隐藏文件。那么,要实现这一点,只要输入下面的命令就可以了:

ls -a | where type == 'file'

Listing only files with Nushell

观察一下,它的语法是多么清晰和简单。现在想象一下,用 Nushell 查找进程和名称 ID、它的状态,以及 CPU 或内存消耗是多么容易。这是它魔法的一部分!

它会尽力以专门组织的方式为你输入的命令提供适合用户的输出。

Nushell 的特点

Error messages in Nu, one of its primary highlights

根据现有的官方信息,它的一些最受欢迎的功能包括:

  • 任何操作系统都通过管道进行控制。 Nu 可以在 Linux、macOS 和 Windows 上工作。换句话说,作为一个灵活的跨平台 shell,具有现代感。
  • 一切都是数据。 Nu 管道使用结构化数据,所以你可以安全地选择、过滤和排序,每次都是同样的方式。
  • 强大的插件。 使用强大的插件系统,很容易扩展 Nu 的功能。
  • 易于阅读的错误信息。 Nu 操作的是类型化的数据,所以它可以捕捉到其他 shell 所没有的错误。当错误发生时,Nu 会告诉你确切的位置和原因。
  • 清晰的 IDE 支持。

你可以看看它的 官方文档,以全面了解它的功能和用法。

在你的系统中安装 Nushell

不幸的是,如果你是一个像我一样的 Ubuntu 用户,你将找不到安装 Nushell 的 APT 仓库。但是,你可以按照它在 GitHub 上的说明,通过安装所需的依赖项来构建它。

幸运的是,有一种方法可以在任何发行版上安装它,即使用 Homebrew。到它的官方网站去了解更多的安装选项。

Nushell

你可以参考我们关于 在 Linux 上安装和使用 Homebrew 包管理器 的教程。当你在 Linux 上成功设置了它,你需要输入以下命令来安装 Nushell:

brew install nushell

Installing nushell with Homebrew

当这个过程完成后,只要输入 nu 就可以启动 Nushell shell。这就完成了!

如果你想把 Nushell 设置为你的默认 shell,你可以用命令 chsh 来做,但是记住,它仍然在开发阶段,这就是为什么我们不推荐它用于日常使用。

然而,在你决定尝试之前,你可以在其网站或 GitHub 页面 上了解关于它的更多信息。

你对这个有趣的 shell 什么看法?请在下面的评论中告诉我你的想法。

题图由 donations welcomePixabay 上发布


via: https://itsfoss.com/nushell/

作者:Marco Carmona 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这些方便的 Go 构建选项可以帮助你更好地理解 Go 的编译过程。

学习一门新的编程语言最令人欣慰的部分之一,就是最终运行了一个可执行文件,并获得预期的输出。当我开始学习 Go 这门编程语言时,我先是阅读一些示例程序来熟悉语法,然后是尝试写一些小的测试程序。随着时间的推移,这种方法帮助我熟悉了编译和构建程序的过程。

Go 的构建选项提供了更好地控制构建过程的方法。它们还可以提供额外的信息,帮助把这个过程分成更小的部分。在这篇文章中,我将演示我所使用的一些选项。注意:我使用的“ 构建 build ”和“ 编译 compile ”这两个词是同一个意思。

开始使用 Go

我使用的 Go 版本是 1.16.7。但是,这里给出的命令应该也能在最新的版本上运行。如果你没有安装 Go,你可以从 Go 官网 上下载它,并按照说明进行安装。你可以通过打开一个命令提示符,并键入下面的命令来验证你所安装的版本:

$ go version

你应该会得到类似下面这样的输出,具体取决于你安装的版本:

go version go1.16.7 linux/amd64

基本的 Go 程序的编译和执行方法

我将从一个在屏幕上简单打印 “Hello World” 的 Go 程序示例开始,就像下面这样:

$ cat hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}

在讨论更高级的选项之前,我将解释如何编译这个 Go 示例程序。我使用了 build 命令,后面跟着 Go 程序的源文件名,本例中是 hello.go,就像下面这样:

$ go build hello.go

如果一切工作正常,你应该看到在你的当前目录下创建了一个名为 hello 的可执行文件。你可以通过使用 file 命令验证它是 ELF 二进制可执行格式(在 Linux 平台上)。你也可以直接执行它,你会看到它输出 “Hello World”。

$ ls
hello  hello.go

$ file ./hello
./hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

$ ./hello
Hello World

Go 提供了一个方便的 run 命令,以便你只是想看看程序是否能正常工作,并获得预期的输出,而不想生成一个最终的二进制文件。请记住,即使你在当前目录中没有看到可执行文件,Go 仍然会在某个地方编译并生成可执行文件并运行它,然后把它从系统中删除。我将在本文后面的章节中解释。

$ go run hello.go
Hello World

$ ls
hello.go

更多细节

上面的命令就像一阵风一样,一下子就运行完了我的程序。然而,如果你想知道 Go 在编译这些程序的过程中做了什么,Go 提供了一个 -x 选项,它可以打印出 Go 为产生这个可执行文件所做的一切。

简单看一下你就会发现,Go 在 /tmp 内创建了一个临时工作目录,并生成了可执行文件,然后把它移到了 Go 源程序所在的当前目录。

$ go build -x hello.go

WORK=/tmp/go-build1944767317
mkdir -p $WORK/b001/

<< snip >>

mkdir -p $WORK/b001/exe/
cd .
/usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK \
/b001/exe/a.out -importcfg $WORK/b001 \
/importcfg.link -buildmode=exe -buildid=K26hEYzgDkqJjx2Hf-wz/\
nDueg0kBjIygx25rYwbK/W-eJaGIOdPEWgwC6o546 \
/K26hEYzgDkqJjx2Hf-wz -extld=gcc /root/.cache/go-build /cc \
/cc72cb2f4fbb61229885fc434995964a7a4d6e10692a23cc0ada6707c5d3435b-d
/usr/lib/golang/pkg/tool/linux_amd64/buildid -w $WORK \
/b001/exe/a.out # internal
mv $WORK/b001/exe/a.out hello
rm -r $WORK/b001/

这有助于解决在程序运行后却在当前目录下没有生成可执行文件的谜团。使用 -x 显示可执行文件确实在 /tmp 工作目录下创建并被执行了。然而,与 build 命令不同的是,可执行文件并没有移动到当前目录,这使得看起来没有可执行文件被创建。

$ go run -x hello.go


mkdir -p $WORK/b001/exe/
cd .
/usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/b001 \
/exe/hello -importcfg $WORK/b001/importcfg.link -s -w -buildmode=exe -buildid=hK3wnAP20DapUDeuvAAS/E_TzkbzwXz6tM5dEC8Mx \
/7HYBzuaDGVdaZwSMEWAa/hK3wnAP20DapUDeuvAAS -extld=gcc \
/root/.cache/go-build/75/ \
7531fcf5e48444eed677bfc5cda1276a52b73c62ebac3aa99da3c4094fa57dc3-d
$WORK/b001/exe/hello
Hello World

模仿编译而不产生可执行文件

假设你不想编译程序并产生一个实际的二进制文件,但你确实想看到这个过程中的所有步骤。你可以通过使用 -n 这个构建选项来做到这一点,该选项会打印出通常的执行步骤,而不会实际创建二进制文件。

$ go build -n hello.go

保存临时目录

很多工作都发生在 /tmp 工作目录中,一旦可执行文件被创建和运行,它就会被删除。但是如果你想看看哪些文件是在编译过程中创建的呢?Go 提供了一个 -work 选项,它可以在编译程序时使用。-work 选项除了运行程序外,还打印了工作目录的路径,但它并不会在这之后删除工作目录,所以你可以切换到该目录,检查在编译过程中创建的所有文件。

$ go run -work hello.go
WORK=/tmp/go-build3209320645
Hello World

$ find /tmp/go-build3209320645
/tmp/go-build3209320645
/tmp/go-build3209320645/b001
/tmp/go-build3209320645/b001/importcfg.link
/tmp/go-build3209320645/b001/exe
/tmp/go-build3209320645/b001/exe/hello

$ /tmp/go-build3209320645/b001/exe/hello
Hello World

其他编译选项

如果说,你想手动编译程序,而不是使用 Go 的 buildrun 这两个方便的命令,最后得到一个可以直接由你的操作系统(这里指 Linux)运行的可执行文件。那么,你该怎么做呢?这个过程可以分为两部分:编译和链接。你可以使用 tool 选项来看看它是如何工作的。

首先,使用 tool compile 命令产生结果的 ar 归档文件,它包含了 .o 中间文件。接下来,对这个 hello.o 文件执行 tool link 命令,产生最终的可执行文件,然后你就可以运行它了。

$ go tool compile hello.go

$ file hello.o
hello.o: current ar archive

$ ar t hello.o
__.PKGDEF
_go_.o

$ go tool link -o hello hello.o

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

$ ./hello
Hello World

如果你想进一步查看基于 hello.o 文件产生可执行文件的链接过程,你可以使用 -v 选项,它会搜索每个 Go 可执行文件中包含的 runtime.a 文件。

$ go tool link -v -o hello hello.o
HEADER = -H5 -T0x401000 -R0x1000
searching for runtime.a in /usr/lib/golang/pkg/linux_amd64/runtime.a
82052 symbols, 18774 reachable
        1 package symbols, 1106 hashed symbols, 77185 non-package symbols, 3760 external symbols
81968 liveness data

交叉编译选项

现在我已经解释了 Go 程序的编译过程,接下来,我将演示 Go 如何通过在实际的 build 命令之前提供 GOOSGOARCH 这两个环境变量,来允许你构建针对不同硬件架构和操作系统的可执行文件。

这有什么用呢?举个例子,你会发现为 ARM(arch64)架构制作的可执行文件不能在英特尔(x86\_64)架构上运行,而且会产生一个 Exec 格式错误。

下面的这些选项使得生成跨平台的二进制文件变得小菜一碟:

$ GOOS=linux GOARCH=arm64 go build hello.go

$ file ./hello
./hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped

$ ./hello
bash: ./hello: cannot execute binary file: Exec format error

$ uname -m
x86_64

你可以阅读我之前的博文,以更多了解我在 使用 Go 进行交叉编译 方面的经验。

查看底层汇编指令

源代码并不会直接转换为可执行文件,尽管它生成了一种中间汇编格式,然后最终被组装为可执行文件。在 Go 中,这被映射为一种中间汇编格式,而不是底层硬件汇编指令。

要查看这个中间汇编格式,请在使用 build 命令时,提供 -gcflags 选项,后面跟着 -S。这个命令将会显示使用到的汇编指令:

$ go build -gcflags="-S" hello.go
# command-line-arguments
"".main STEXT size=138 args=0x0 locals=0x58 funcid=0x0
        0x0000 00000 (/test/hello.go:5) TEXT    "".main(SB), ABIInternal, $88-0
        0x0000 00000 (/test/hello.go:5) MOVQ    (TLS), CX
        0x0009 00009 (/test/hello.go:5) CMPQ    SP, 16(CX)
        0x000d 00013 (/test/hello.go:5) PCDATA  $0, $-2
        0x000d 00013 (/test/hello.go:5) JLS     128

<< snip >>

你也可以使用 objdump -s 选项,来查看已经编译好的可执行程序的汇编指令,就像下面这样:

$ ls
hello  hello.go

$ go tool objdump -s main.main hello
TEXT main.main(SB) /test/hello.go
  hello.go:5            0x4975a0                64488b0c25f8ffffff      MOVQ FS:0xfffffff8, CX                  
  hello.go:5            0x4975a9                483b6110                CMPQ 0x10(CX), SP                       
  hello.go:5            0x4975ad                7671                    JBE 0x497620                            
  hello.go:5            0x4975af                4883ec58                SUBQ $0x58, SP                          
  hello.go:6            0x4975d8                4889442448              MOVQ AX, 0x48(SP)                       

<< snip >>

分离二进制文件以减少其大小

Go 的二进制文件通常比较大。例如, 一个简单的 “Hello World” 程序将会产生一个 1.9M 大小的二进制文件。

$ go build hello.go
$
$ du -sh hello
1.9M    hello
$
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
$

为了减少生成的二进制文件的大小,你可以分离执行过程中不需要的信息。使用 -ldflags-s -w 选项可以使生成的二进制文件略微变小为 1.3M。

$ go build -ldflags="-s -w" hello.go
$
$ du -sh hello
1.3M    hello
$
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
$

总结

我希望这篇文章向你介绍了一些方便的 Go 编译选项,同时帮助了你更好地理解 Go 编译过程。关于构建过程的其他信息和其他有趣的选项,请参考 Go 命令帮助:

$ go help build

题图由 Ashraf ChembanPixabay 上发布。


via: https://opensource.com/article/22/4/go-build-options

作者:Gaurav Kamathe 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出