emmansun / gmsm

ShangMi (SM) cipher suites for golang (Go语言商用密码软件)

Home Page:https://emmansun.github.io/gmsm

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[plugin] When dynamic linking, R15 is clobbered by a global variable access and is used here: 03578

fzzf678 opened this issue · comments

build plugin 时候遇到这个问题,请教下是什么原因

go version:

root@b158c8f1ffd7:/home/code/tidb# go version
go version go1.20.5 linux/amd64

msg:

# github.com/emmansun/gmsm/sm3

asm: sm3block_amd64.s:1073: when dynamic linking, R15 is clobbered by a global variable access and is used here: 03578 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm3/sm3block_amd64.s:1073)	RORXL	$-7, R14, R15

asm: assembly failed

# github.com/emmansun/gmsm/internal/sm2ec

asm: p256_asm_amd64.s:410: when dynamic linking, R15 is clobbered by a global variable access and is used here: 00271 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:410)	MULXQ	16(SI), AX, R15

asm: p256_asm_amd64.s:708: when dynamic linking, R15 is clobbered by a global variable access and is used here: 00590 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:708)	MULXQ	(SI), AX, R15

asm: p256_asm_amd64.s:1465: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01205 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:1465)	MULXQ	p256ord<>(SB), AX, R15

asm: p256_asm_amd64.s:1882: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01553 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:1882)	MULXQ	16(SI), AX, R15

asm: p256_asm_amd64.s:2114: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01719 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:2114)	MULQ	R15

asm: p256_asm_amd64.s:2646: when dynamic linking, R15 is clobbered by a global variable access and is used here: 02146 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:2646)	MULXQ	R13, AX, R15

asm: p256_asm_amd64.s:2912: when dynamic linking, R15 is clobbered by a global variable access and is used here: 02270 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/internal/sm2ec/p256_asm_amd64.s:2912)	MOVL	R15, 488(SP)

asm: assembly failed

# github.com/emmansun/gmsm/sm9/bn256

asm: gfp2_g1_amd64.s:218: when dynamic linking, R15 is clobbered by a global variable access and is used here: 00141 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:218)	ADCXQ	R15, R9

asm: gfpMulInternal: invalid instruction: 00256 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:139)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00263 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:141)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00276 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:144)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00295 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:148)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00314 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:152)	MULXQ	24(R15), BX

asm: gfpMulInternal: invalid instruction: 00348 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:160)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00355 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:162)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00368 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:165)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00387 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:169)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00406 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:173)	MULXQ	24(R15), CX

asm: gfpMulInternal: invalid instruction: 00440 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:181)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00447 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:183)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00460 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:186)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00479 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:190)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00498 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:194)	MULXQ	24(R15), R8

asm: gfpMulInternal: invalid instruction: 00532 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:202)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00539 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:204)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00552 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:207)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00571 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:211)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00590 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:215)	MULXQ	24(R15), R9

asm: gfp2_g1_amd64.s:939: when dynamic linking, R15 is clobbered by a global variable access and is used here: 00713 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:939)	CMOVQCS	R15, R11

asm: gfpSqrInternal: invalid instruction: 00252 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:599)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00259 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:601)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00272 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:604)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00291 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:608)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00310 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:612)	MULXQ	24(R15), BX

asm: gfpSqrInternal: invalid instruction: 00344 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:620)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00351 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:622)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00364 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:625)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00383 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:629)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00402 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:633)	MULXQ	24(R15), CX

asm: gfpSqrInternal: invalid instruction: 00436 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:641)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00443 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:643)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00456 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:646)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00475 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:650)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00494 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:654)	MULXQ	24(R15), R8

asm: gfpSqrInternal: invalid instruction: 00528 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:662)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00535 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:664)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00548 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:667)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00567 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:671)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00586 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:675)	MULXQ	24(R15), R9

asm: gfp2_g1_amd64.s:1077: when dynamic linking, R15 is clobbered by a global variable access and is used here: 00819 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1077)	CMOVQCS	R11, R15

asm: gfp2_g1_amd64.s:1162: when dynamic linking, R15 is clobbered by a global variable access and is used here: 00991 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1162)	CMOVQCS	R11, R15

asm: gfp2_g1_amd64.s:1213: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01046 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1213)	CMOVQCS	R11, R15

asm: gfp2_g1_amd64.s:1282: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01202 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1282)	CMOVQCS	R11, R15

asm: gfp2_g1_amd64.s:1344: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01372 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1344)	CMOVQCS	R11, R15

asm: gfp2_g1_amd64.s:1471: when dynamic linking, R15 is clobbered by a global variable access and is used here: 01744 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1471)	CMOVQCS	R11, R15

asm: gfp2_g1_amd64.s:1720: when dynamic linking, R15 is clobbered by a global variable access and is used here: 03280 (/share/.go/pkg/mod/github.com/emmansun/gmsm@v0.20.0/sm9/bn256/gfp2_g1_amd64.s:1720)	CMOVQCS	R11, R15

asm: assembly failed

2023/09/05 10:33:26 compile plugin source code failure, exit status 1


看来插件模式不能用寄存器R15,这个比较麻烦,我先看看。
https://groups.google.com/g/golang-codereviews/c/124cVR_LDTo
golang/go#43661

Hi @fzzf678 , 目前 sm2/sm3/sm9/zuc 的amd64汇编实现,都使用了R15寄存器,由于AMD64寄存器本来就比较少:

x86 has just 8 general-purpose registers available (eax, ebx, ecx, edx, ebp, esp, esi, edi). x64 extended them to 64 bits (prefix "r" instead of "e") and added another 8 (r8, r9, r10, r11, r12, r13, r14, r15). Since some of x86's registers have special implicit meanings and aren't really used as general-purpose (most notably ebp and esp), the effective increase is even larger than it seems.

所以,真要使用插件模式,目前唯有使用purego编译选项(-tags=purego),而且目前只支持整个项目的purego编译选项,不支持分sm2/sm3/sm4/sm9/zuc等的编译选项(这个可以改进)。

@emmansun thks,使用 purego 选项可以编译通过。目前看来是只有这一种解决方法了吧

@emmansun thks,使用 purego 选项可以编译通过。目前看来是只有这一种解决方法了吧

是的,只是性能就也是purego的性能了,目前可以改进的是,增加一些算法级别的编译选项(sm2purego/sm3purego/sm9purego/zucpurego,或者定义一个plugin编译选项),这样插件模式也能使用amd64汇编实现的sm4等。如果不能接受这种编译选项下的性能,建议使用非插件模式。

@emmansun 了解了

为amd64 plugin编译提供汇编支持

  • sm3 去除R15使用,plugin编译没有特殊实现;
  • zuc core去除R15使用,plugin编译没有特殊实现;
  • internal/sm2ec: 单独为plugin编译flag去除R15使用;
  • sm9/bn256: gfp单独为plugin编译flag去除R15使用,gfp2未作修改(权衡性能和可维护性,除非必要);

v0.20.2