I tried that and received a SIGBUS

CGO_ENABLED=0 GOARCH=amd64 gotip run -race ./example/main.go 
signal: bus error

On Wednesday, November 30, 2022 at 1:24:08 PM UTC-5 cuong.m...@gmail.com 
wrote:

> See my suggestion here: 
> https://github.com/ebitengine/purego/issues/71#issuecomment-1332545306
>
> For //go:norace and ABI wrapper functions, there's no instrument emitted. 
> Your problem is that the compiler know there's a native ABI0 implementation 
> for x_cgo_init, so calling it from assembly is force to use the ABI0 one, 
> not the ABI wrapper.
>
> On Wednesday, November 30, 2022 at 11:30:38 PM UTC+7 Jarrett Kuklis wrote:
>
>> I am one of the main contributors to ebitengine/purego 
>> <https://github.com/ebitengine/purego> a library that aims to call into 
>> C code without invoking the C compiler. The main platform of support is 
>> darwin on arm64 and amd64. It uses //cgo_import_dynamic comments to get the 
>> symbols and calls them using runtime.cgocall.
>>
>> That runtime function requires that runtime/cgo be imported which 
>> requires C. I used the work of notti/nocgo 
>> <https://github.com/notti/nocgo> as inspiration to write an 
>> implementation of runtime/cgo entirely in Go (located at internal/fakecgo 
>> <https://github.com/ebitengine/purego/tree/main/internal/fakecgo>). It 
>> has worked for the ebitengine <https://github.com/hajimehoshi/ebiten> 
>> project really well. 
>>
>> However, I was looking at the draft Go 1.20 release notes and saw that 
>> -race no longer requires Cgo to work on macOS. Which I am all for and 
>> really excited about! This means though that when -race and CGO_ENABLED=0 
>> our faked runtime/cgo package has race code placed in it. From what I can 
>> tell this is bad because the code in this package is faking being C so it 
>> shouldn't call into the race detector. And it will SIGSEGV jumping to any 
>> code that tries to call it since the runtime isn't fully initialized by the 
>> time these functions are called.
>>
>> There is an issue here <https://github.com/ebitengine/purego/issues/71> that 
>> has more information about the issue.
>>
>> Obviously, I tried using //go:norace which indeed does remove the race 
>> code from the function but the ABI0 wrapper still has the race detector 
>> code. The functions are called from assembly since we need to move from the 
>> C ABI to Go ABI which forces us into calling the ABI0 wrapper. I can't use 
>> <ABIInternal> since that is only allowed in the runtime. As far as I can 
>> tell there is no way around the wrapper.
>>
>> So I was wondering if this is a bug? Shouldn't the //go:norace comment 
>> also apply the the ABI wrappers? If not, is there any other suggestions as 
>> to how purego could keep functioning when CGO_ENABLED=0 and -race are 
>> defined?
>>
>> I've had a hard time debugging this since no debugger I've tested links 
>> to the program before it crashes with SIGSEGV. And there is no stack trace. 
>> I may be missing something so I am eager to learn!
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/1044b13e-4499-404c-b7aa-9a534956d14an%40googlegroups.com.

Reply via email to