Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
fzzf678 opened this issue Sep 6, 2023 · 7 comments
Assignees
Labels
enhancement New feature or request

Comments

@fzzf678
Copy link

fzzf678 commented Sep 6, 2023

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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/sm9/bn256/gfp2_g1_amd64.s:218)	ADCXQ	R15, R9

asm: gfpMulInternal: invalid instruction: 00256 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:139)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00263 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:141)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00276 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:144)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00295 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:148)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00314 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:152)	MULXQ	24(R15), BX

asm: gfpMulInternal: invalid instruction: 00348 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:160)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00355 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:162)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00368 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:165)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00387 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:169)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00406 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:173)	MULXQ	24(R15), CX

asm: gfpMulInternal: invalid instruction: 00440 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:181)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00447 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:183)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00460 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:186)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00479 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:190)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00498 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:194)	MULXQ	24(R15), R8

asm: gfpMulInternal: invalid instruction: 00532 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:202)	MULXQ	(R15), AX

asm: gfpMulInternal: invalid instruction: 00539 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:204)	MULXQ	(R15), R14

asm: gfpMulInternal: invalid instruction: 00552 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:207)	MULXQ	8(R15), BP

asm: gfpMulInternal: invalid instruction: 00571 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:211)	MULXQ	16(R15), R14

asm: gfpMulInternal: invalid instruction: 00590 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/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/[email protected]/sm9/bn256/gfp2_g1_amd64.s:939)	CMOVQCS	R15, R11

asm: gfpSqrInternal: invalid instruction: 00252 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:599)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00259 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:601)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00272 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:604)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00291 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:608)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00310 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:612)	MULXQ	24(R15), BX

asm: gfpSqrInternal: invalid instruction: 00344 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:620)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00351 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:622)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00364 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:625)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00383 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:629)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00402 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:633)	MULXQ	24(R15), CX

asm: gfpSqrInternal: invalid instruction: 00436 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:641)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00443 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:643)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00456 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:646)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00475 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:650)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00494 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:654)	MULXQ	24(R15), R8

asm: gfpSqrInternal: invalid instruction: 00528 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:662)	MULXQ	(R15), AX

asm: gfpSqrInternal: invalid instruction: 00535 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:664)	MULXQ	(R15), R10

asm: gfpSqrInternal: invalid instruction: 00548 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:667)	MULXQ	8(R15), BP

asm: gfpSqrInternal: invalid instruction: 00567 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/sm9/bn256/gfp2_g1_amd64.s:671)	MULXQ	16(R15), R10

asm: gfpSqrInternal: invalid instruction: 00586 (/share/.go/pkg/mod/github.com/emmansun/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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


@emmansun
Copy link
Owner

emmansun commented Sep 6, 2023

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

@emmansun
Copy link
Owner

emmansun commented Sep 6, 2023

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等的编译选项(这个可以改进)。

@fzzf678
Copy link
Author

fzzf678 commented Sep 6, 2023

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

@emmansun
Copy link
Owner

emmansun commented Sep 6, 2023

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

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

@fzzf678
Copy link
Author

fzzf678 commented Sep 6, 2023

@emmansun 了解了

@emmansun
Copy link
Owner

emmansun commented Sep 8, 2023

为amd64 plugin编译提供汇编支持

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

@emmansun emmansun self-assigned this Sep 8, 2023
@emmansun emmansun added the enhancement New feature or request label Sep 8, 2023
@emmansun
Copy link
Owner

emmansun commented Sep 8, 2023

v0.20.2

@emmansun emmansun closed this as completed Sep 8, 2023
@emmansun emmansun changed the title When dynamic linking, R15 is clobbered by a global variable access and is used here: 03578 [plugin] When dynamic linking, R15 is clobbered by a global variable access and is used here: 03578 Feb 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants