Golang中如何为第三方库(vendor)创建assembly

Golang中如何为第三方库(vendor)创建assembly 请帮忙。

紧急。

11 回复

我们能否为vendor创建汇编文件

更多关于Golang中如何为第三方库(vendor)创建assembly的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请提出一个具体的问题。

感谢您的耐心。

感谢您的快速回复。我们能否为供应商(第三方库)创建"任意二进制"文件,从而避免在版本控制系统中提交供应商源代码?

在 Go 语言中并不真正存在程序集的概念,这是 .NET 框架中的东西。但您想要创建一个库吗?通常的做法是将其放在例如 GitHub 上,然后导入到 Go 中。

我猜 @NobbZ 的第二次回复就是您想要的。

Go 支持将代码构建为共享库

我仍然没有(完全)理解你实际想要什么……

让我试着多问一些,以便更好地了解你想要什么,甚至发现你真正需要什么。

根据我在本讨论中目前了解到的信息,似乎你想要生成一些共享对象、DLL、动态链接库甚至是静态链接库,这些库可以独立于你的程序进行共享。

你是想为一些不允许公开源代码的第三方代码这样做,还是想创建一个仅以对象形式共享而不提供源代码的库?

新版本的做法是使用 Go 1.11 中的模块功能。

GitHub GitHub

头像

golang/go

Go 编程语言。通过在 GitHub 上创建账户来参与 golang/go 的开发。

这样你只需在代码中引用第三方库,它们会被存储在另一个文件夹中并进行构建。

@NobbZ 如果你知道解决方案,请尽快帮助我?

我需要将代码提交到我的代码库中。所以有几个问题:

  1. 需要提交包含供应商源代码文件(第三方库)的完整代码吗?[我的项目 + 供应商源代码文件] 或者
  2. 需要提交包含供应商二进制文件(第三方库)的完整代码吗?[我的项目 + 供应商二进制文件]

如果遵循第2种方式,如何创建二进制文件或编译供应商源代码文件。

换句话说,如何像在 Java(Maven、Gradle)中那样进行构建,是否有任何方法可以实现这一点。

Golang 中的构建管理系统是什么。

如果您使用 Go 1.11,正如他的回复中所述,模块是推荐的方式。

如果您使用旧版本的 Go,只需在构建项目前执行 go get ./... 命令,即可下载所有依赖项。不过这种方式存在 API 变更导致问题的风险。

这就是为什么您也可以将包源码复制到 vendor 文件夹中,但请注意保持原始包的文件夹层级结构。很多人直接复制依赖项的源代码,而我倾向于使用 git 子模块,因为这样更容易更新。

也许你的问题是想对源代码进行混淆处理。虽然这不是关于创建assemblyJava字节码的测试,但我还是尝试了一些关于共享库的测试。

golang调用golang共享库似乎非常困难,并且在windows平台上不可行。 或许你应该考虑从其他语言调用你的go函数。

你可以查看以下链接吗?

GitHub practice-golang/shared-library

在Windows上进行共享库测试。通过在GitHub上创建账户来为practice-golang/shared-library开发做贡献。

如果不是从golang调用,从几乎所有语言调用使用golang创建的函数似乎是可行的,而且并不困难。

在Go语言中,为第三方库(vendor)创建assembly(汇编)代码通常涉及在vendor目录下的包中编写或集成汇编文件(.s或.S扩展名)。以下是具体步骤和示例:

步骤:

  1. 在vendor目录中定位第三方库包:确保第三方库已通过go mod vendor或其他方式放置在项目的vendor目录下。
  2. 添加汇编文件:在vendor中的包目录下创建汇编文件,例如asm_amd64.s,并编写汇编代码。
  3. 使用Go汇编语法:Go汇编遵循特定语法,需使用TEXT指令定义函数,并遵循Go的调用约定。
  4. 在Go代码中声明汇编函数:在Go源文件中使用//go:linkname指令或外部函数声明来链接汇编函数。

示例:

假设您有一个第三方库example.com/mylib,已vendor到项目中。您想为其添加一个汇编函数Add,实现两个整数相加。

  • 在vendor目录中创建汇编文件: 路径:vendor/example.com/mylib/asm_amd64.s

    #include "textflag.h"
    
    // 定义函数Add,接受两个int参数,返回它们的和
    TEXT ·Add(SB), NOSPLIT, $0-24
        MOVQ a+0(FP), AX   // 加载第一个参数到AX
        ADDQ b+8(FP), AX   // 将第二个参数加到AX
        MOVQ AX, ret+16(FP) // 将结果存储到返回值位置
        RET
    
  • 在Go代码中声明和使用: 在vendor包中的Go文件(如vendor/example.com/mylib/mylib.go)中声明汇编函数:

    package mylib
    
    // 声明外部函数Add,由汇编实现
    func Add(a, b int) int
    
    // 示例使用
    func ExampleAdd() int {
        return Add(10, 20) // 调用汇编函数,返回30
    }
    

注意事项:

  • 平台特定性:汇编代码通常针对特定架构(如amd64),需使用条件编译或不同文件命名(如asm_amd64.sasm_arm64.s)。
  • Go工具链集成:确保Go构建工具能识别汇编文件;使用go build时,汇编文件会自动编译。
  • 测试:编译后验证函数行为,例如通过单元测试。

如果第三方库本身不支持汇编扩展,可能需要修改其源码或提交补丁。在vendor模式下,直接修改vendor目录是常见做法,但需注意版本管理问题。

回到顶部