-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
What version of Go are you using (go version
)?
$ go version go version go1.14 linux/amd64
Does this issue reproduce with the latest release?
Uncertain.
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go envGOARCH="amd64"
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build351334670=/tmp/go-build -gno-record-gcc-switches"
What did you do?
I cross-compiled a very simple c-shared dll for Windows with one exported function (HelloWorld). I then invoked the dll from Powershell.
The go code was:
package main
import "C"
import (
"fmt"
)
//export HelloWorld
func HelloWorld() {
fmt.Println("Hello World")
}
func main() {}
The build command (from linux) used was:
GOARCH=amd64 GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -v -buildmode=c-shared -o helloworld.dll .
I then copied the resultant .dll to Windows and invoked the HelloWorld() function using the following Powershell script:
$signature = @"
[DllImport("c:\\cshared\\helloworld.dll")]
public static extern void HelloWorld();
"@
Add-Type -MemberDefinition $signature -Name World -Namespace Hello
[Hello.World]::HelloWorld()
What did you expect to see?
I expected the dll's HelloWorld() function to be invoked successfully (causing the text "Hello World" to be written to the console) and then I expected to be able to use my powershell prompt to execute further console commands such as "hostname" or "ipconfig" etc.
What did you see instead?
This is really odd. The HelloWorld() function is indeed executed successfully and I see the text "Hello World" on the console. However, after the function has been invoked, I am no longer able to see any console output from cmd.exe commands in my powershell window. For example, calling "hostname" just returns with no output and the same happens with "ipconfig".
e.g. initially hostname.exe works and provides output, but after executing the cshared dll I am unable to see any further output from hostname..exe on the console:
PS C:\cshared> hostname
nwood-host
PS C:\cshared> hostname
nwood-host
PS C:\cshared> .\helloworld.ps1
Hello World
PS C:\cshared> hostname
PS C:\cshared> ipconfig
PS C:\cshared> hostname
If I pipe the output of hostname.exe to a file (e.g. "hostname > out.txt") then I can confirm that the output is present and the command is succeeding....so it seems like executing the c-shared dll somehow causes stdout to be redirected or not shown properly?
I tried removing the fmt.Println from the go code to see if that helps, but the issues is still the same. I am also only seeing this with Powershell (if I do the same experiment but invoke the helloworld.dll from python on Windows, I do not see any issue afterwards).
Any ideas?