Go没有链接我的程序集:未定义的外部函数

时间:2014-08-23 10:30:01

标签: assembly go

我试图写一些SIMD主要是为了学习目的。我知道Go可以链接汇编,但我无法正常工作。

这是我能做的最小的例子(元素向量乘法):

vec_amd64.s (注意:实际文件在RET下有一个空白行,因为否则会导致错误)

// func mul(v1, v2 Vec4) Vec4
TEXT .mul(SB),4,$0-48
    MOVUPS v1+0(FP),  X0
    MOVUPS v2+16(FP), X1
    MULPS  X1, X0
    // also tried ret+32 since I've seen some places do that
    MOVUPS X0, toReturn+32(FP)
    RET

vec.go

package simd

type Vec4 [4]float32

func (v1 Vec4) Mul(v2 Vec4) Vec4 {
    return Vec4{v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3]}
}

func mul(v1, v2 Vec4) Vec4

simd_test.go

package simd

import (
    "testing"
)

func TestMul(t *testing.T) {
    v1 := Vec4{1, 2, 3, 4}
    v2 := Vec4{5, 6, 7, 8}

    res := v1.Mul(v2)
    res2 := mul(v1, v2)

    // Placeholder until I get it to compile
    if res != res2 {
        t.Fatalf("Expected %v; got %v", res, res2)
    }
}

当我尝试运行go test时,我收到错误:

# testmain
simd.TestMul: call to external function simd.mul
simd.TestMul: undefined: simd.mul

go env命令报告我的GOHOSTARCHamd64,我的Go版本为1.3。为了确认导致问题的架构不是,我找到了另一个使用程序集并删除除_amd64.s之外的所有程序集文件的程序包,并且它的测试运行良好。

我还尝试将其更改为导出的标识符,以防引起奇怪,但没有骰子。我认为我非常密切地关注像math/big这样的软件包中的模板,所以希望它是一个简单而明显的缺失的东西。

我知道Go至少尝试来使用程序集,因为如果我向.s文件引入语法错误,构建工具会抱怨它。

编辑:

要明确,go build会干净地编译,但go test会导致出现错误。

1 个答案:

答案 0 :(得分:95)

您使用的是错误的点。而不是

TEXT .mul(SB),4,$0-48

TEXT ·mul(SB),4,$0-48

一切正常。