Golang预编译源码相关内容探讨

Golang预编译源码相关内容探讨 大家好, 我是Go语言的新手,所以这是一个新手问题。 我想弄清楚Go语言源码中是否包含一些预编译的库/二进制文件/其他东西,而这些内容的源代码并未公开(虽然它们可能采用自由许可证,但以“按现状”的方式提供,不附带源码)。 我浏览了Go语言的源码,在testdata文件夹中发现了一些*.a文件(例如libimportsar.a)。

所以问题是:

  1. libimportsar.a是什么?
  2. Go语言源码中是否有任何内容是“按现状”提供且不包含源代码的?也许存在一些非开源的插件(可以用来隐藏源代码)?

提前感谢!

8 回复

这很有趣;看起来它只用在 src/go/internal/gccgoimporter 的测试用例中。我不确定它的源代码是否在某个地方可用;我找不到它,但这并不意味着它不存在!

更多关于Golang预编译源码相关内容探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


一些公司的负责人想知道他们是否拥有公司正在使用的工具的完整源代码。

我也想知道这一点。这就是为什么我使用在干净机器上从源代码构建的工具。

对于 Go 语言,

从源代码安装 Go

感谢您的回答。关于 libimportsar.a 的问题是关于静态库的内容,而不是文件类型(静态库)。

关于第二个问题。您是否知道 Go 语言是否以某种形式使用预编译的内容?这可以是静态/动态库、插件或任何其他形式。

引用 你似乎处于阴谋论模式。

事实是,一些公司的负责人想知道他们是否拥有公司正在使用的工具的全部源代码。这听起来有点偏执,但事实就是如此。slight_smile

源文件本身可能以某种形式包含一些预编译的数据,例如 libimportsar.a

由于 Go 对我来说是一门新的编程语言,我不太确定代码复用的实践形式。Go 可能包含其自己的预编译格式,并且仍然可以从源代码构建。为了在不同的操作系统上构建,可以包含针对每个操作系统的内容。这不是一种好的做法,但仍然是可能的。

ulimi1:

我试图查明Go语言源代码中是否包含一些预编译的库/二进制文件/其他内容,而这些内容的源代码并未公开(尽管它们可能采用自由许可证,但以“现状”形式提供,不附带源代码)。 我浏览了Go语言源代码,在testdata文件夹中发现了一些*.a文件(例如libimportsar.a)。

因此,问题如下:

  1. libimportsar.a是什么?
  2. Go语言源代码中是否存在以“现状”形式提供、不附带源代码的内容?也许存在一些非开源的插件(可能用于隐藏源代码)?

你似乎陷入了阴谋论模式。


libimportsar.a 是一些测试数据。

go/internal/gccgoimporter: read export data from archives

当与go工具一起使用时,gccgo通常会生成归档文件。 此更改教会了gccgoimporter包如何从归档文件中读取导出数据。

例如,cmd/vet在类型检查包时需要此功能。

src/go/internal/gccgoimporter/testdata/libimportsar.a[已添加]

这是一个很好的问题,很多Go新手都会对源码仓库中的二进制文件感到困惑。

  1. libimportsar.a是什么?

    libimportsar.a 是一个静态库文件(archive file),它位于 testdata 目录中。它不是Go工具链或运行时的一部分,而是一个专门用于测试的辅助文件。

    具体来说,它是 go test 命令在测试导入(import)和依赖解析逻辑时使用的测试数据。Go的测试套件需要模拟各种场景,包括导入已编译的包。这个 .a 文件就是一个预先编译好的包,测试代码可以导入它,而无需在测试过程中临时编译,从而确保测试的确定性和可重复性。

    你可以通过搜索Go源码来验证这一点。例如,在 src/cmd/go/testdata/importtest.go 等测试文件中,可能会看到引用它的代码。

    示例: 虽然你不能直接“导入”这个文件,但测试代码可能会这样使用它:

    // 假设在某个内部测试中
    func TestImportsPrecompiledPackage(t *testing.T) {
        // 测试逻辑会利用 testdata/libimportsar.a 来验证
        // `go build` 或 `go list` 能否正确处理一个已存在的 .a 文件。
        // 这不是用户代码,是Go自身的测试代码。
    }
    
  2. Go语言源码中是否有任何内容是“按现状”提供且不包含源代码的?

    Go语言的核心工具链(编译器、链接器、标准库等)是完全开源的,采用BSD风格许可证。所有源代码都包含在官方仓库中。

    你发现的 testdata 目录下的 .a 文件是例外情况,但它们仍然是开源项目的一部分,其存在目的纯粹是为了测试。它们对应的源码要么在测试中动态生成,要么是某个已知的、简单的Go包的编译结果,其源码意义不大(例如,可能就是一个 package libimportsar 的空包)。

    关于非开源插件: Go的构建系统不支持“隐藏源代码”的二进制插件作为标准导入流程。plugin 包(import "plugin")允许加载共享库(.so 文件),但:

    • 这主要用于运行时动态加载,而不是普通的源码导入。
    • 这些 .so 文件也是从Go源码编译而来的,只是编译方式不同。
    • 这不是隐藏源码的机制,而是模块化部署的一种方式。任何想使用该插件的人都需要有对应的接口定义(通常是一个共享的Go接口包)。

    结论: Go语言实现自身没有依赖任何不提供源码的预编译二进制库。testdata 中的二进制文件是测试夹具,不是运行时组件。

什么是 libimportsar.a?

简而言之,它是一个用于静态链接的库归档文件。 Go 语言是一种编译型语言。 可能有所帮助的链接

** https://stackoverrun.com/ja/q/1481444 https://kanonji.hatenadiary.com/entry/20121018/1350538932

ライブラリについて解説!静的・動的とは?それぞれのメリットは?

ライブラリについて解説!静的・動的とは?それぞれのメリットは?

このページにはプロモーションが含まれていますこのページでは、ライブラリについて解説します。ライブラリを使いこなせるとかなりプログラミングが楽になります。ぜひ活用していきましょう! スポンサーリンク Contentsライブ …

Static library

在计算机科学中,静态库或静态链接库是一组例程、外部函数和变量,它们在编译时由调用者解析,并由编译器、链接器或绑定器复制到目标应用程序中,从而生成目标文件和独立的可执行文件。这个可执行文件及其编译过程都被称为程序的静态构建。历史上,库只能是静态的。静态库要么与其他静态库合并…

https://www.it-swarm-ja.tech/ja/c/%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%8Ca%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/973170683/#:~:text=a%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%20%E9%9D%99%E7%9A%84,%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82&text=05%2F11%20GWW-,.,%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%95%E3%82%8C%E3%80%81%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%81%99%E3%80%82

**

我正在尝试确认我是否拥有源代码

我不知道如何打开“a 文件”。

虽然这并不重要,但我最喜欢的“编译型语言”是 FORTRAN90、Go 和 C。 除了 Go 之外,我并不擅长链接库(笑)。

回到顶部