Fix issue 189 (#197)
Use the standard Cgo import mechanism when CGO_ENABLED=1. This fixes an issue where sometimes the external linker would fail to add the dlfcn symbols causing a linker error. Closes #189
- commit
- babd452e909b4f96f78751d5650aed286cd28117
- author
- TotallyGamerJet · · 2024-01-17 15:43 UTC
- committer
- GitHub · · 2024-01-17 15:43 UTC
- parent
- a546a4d
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
10 files · +68 -23
M cgo.go +5 -1
| @@ -12,4 +12,8 @@ package purego | |||
| 12 | 12 | // which will import this package automatically. Normally this isn't an issue since it | |
| 13 | 13 | // usually isn't possible to call into C without using that import. However, with purego | |
| 14 | 14 | // it is since we don't use `import "C"`! | |
| 15 | - | import _ "runtime/cgo" | |
| 15 | + | import ( | |
| 16 | + | _ "runtime/cgo" | |
| 17 | + | ||
| 18 | + | _ "github.com/ebitengine/purego/internal/cgo" | |
| 19 | + | ) | |
| @@ -12,4 +12,8 @@ package purego | |||||
| 12 | // which will import this package automatically. Normally this isn't an issue since it | 12 | // which will import this package automatically. Normally this isn't an issue since it | ||
| 13 | // usually isn't possible to call into C without using that import. However, with purego | 13 | // usually isn't possible to call into C without using that import. However, with purego | ||
| 14 | // it is since we don't use `import "C"`! | 14 | // it is since we don't use `import "C"`! | ||
| 15 | - | import _ "runtime/cgo" | 15 | + | import ( |
| 16 | + | _ "runtime/cgo" | |||
| 17 | + | ||||
| 18 | + | _ "github.com/ebitengine/purego/internal/cgo" | |||
| 19 | + | ) | |||
M dlfcn_darwin.go +0 -5
| @@ -12,8 +12,3 @@ const ( | |||
| 12 | 12 | RTLD_LOCAL = 0x4 // All symbols are not made available for relocation processing by other modules. | |
| 13 | 13 | RTLD_GLOBAL = 0x8 // All symbols are available for relocation processing of other modules. | |
| 14 | 14 | ) | |
| 15 | - | ||
| 16 | - | //go:cgo_import_dynamic purego_dlopen dlopen "/usr/lib/libSystem.B.dylib" | |
| 17 | - | //go:cgo_import_dynamic purego_dlsym dlsym "/usr/lib/libSystem.B.dylib" | |
| 18 | - | //go:cgo_import_dynamic purego_dlerror dlerror "/usr/lib/libSystem.B.dylib" | |
| 19 | - | //go:cgo_import_dynamic purego_dlclose dlclose "/usr/lib/libSystem.B.dylib" | |
| @@ -12,8 +12,3 @@ const ( | |||||
| 12 | RTLD_LOCAL = 0x4 // All symbols are not made available for relocation processing by other modules. | 12 | RTLD_LOCAL = 0x4 // All symbols are not made available for relocation processing by other modules. | ||
| 13 | RTLD_GLOBAL = 0x8 // All symbols are available for relocation processing of other modules. | 13 | RTLD_GLOBAL = 0x8 // All symbols are available for relocation processing of other modules. | ||
| 14 | ) | 14 | ) | ||
| 15 | - | ||||
| 16 | - | //go:cgo_import_dynamic purego_dlopen dlopen "/usr/lib/libSystem.B.dylib" | |||
| 17 | - | //go:cgo_import_dynamic purego_dlsym dlsym "/usr/lib/libSystem.B.dylib" | |||
| 18 | - | //go:cgo_import_dynamic purego_dlerror dlerror "/usr/lib/libSystem.B.dylib" | |||
| 19 | - | //go:cgo_import_dynamic purego_dlclose dlclose "/usr/lib/libSystem.B.dylib" | |||
M dlfcn_freebsd.go +0 -5
| @@ -11,8 +11,3 @@ const ( | |||
| 11 | 11 | RTLD_LOCAL = 0x00000 // All symbols are not made available for relocation processing by other modules. | |
| 12 | 12 | RTLD_GLOBAL = 0x00100 // All symbols are available for relocation processing of other modules. | |
| 13 | 13 | ) | |
| 14 | - | ||
| 15 | - | //go:cgo_import_dynamic purego_dlopen dlopen "libc.so.7" | |
| 16 | - | //go:cgo_import_dynamic purego_dlsym dlsym "libc.so.7" | |
| 17 | - | //go:cgo_import_dynamic purego_dlerror dlerror "libc.so.7" | |
| 18 | - | //go:cgo_import_dynamic purego_dlclose dlclose "libc.so.7" | |
| @@ -11,8 +11,3 @@ const ( | |||||
| 11 | RTLD_LOCAL = 0x00000 // All symbols are not made available for relocation processing by other modules. | 11 | RTLD_LOCAL = 0x00000 // All symbols are not made available for relocation processing by other modules. | ||
| 12 | RTLD_GLOBAL = 0x00100 // All symbols are available for relocation processing of other modules. | 12 | RTLD_GLOBAL = 0x00100 // All symbols are available for relocation processing of other modules. | ||
| 13 | ) | 13 | ) | ||
| 14 | - | ||||
| 15 | - | //go:cgo_import_dynamic purego_dlopen dlopen "libc.so.7" | |||
| 16 | - | //go:cgo_import_dynamic purego_dlsym dlsym "libc.so.7" | |||
| 17 | - | //go:cgo_import_dynamic purego_dlerror dlerror "libc.so.7" | |||
| 18 | - | //go:cgo_import_dynamic purego_dlclose dlclose "libc.so.7" | |||
A dlfcn_nocgo_darwin.go +11 -0
| @@ -0,0 +1,11 @@ | |||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | + | // SPDX-FileCopyrightText: 2024 The Ebitengine Authors | |
| 3 | + | ||
| 4 | + | //go:build !cgo | |
| 5 | + | ||
| 6 | + | package purego | |
| 7 | + | ||
| 8 | + | //go:cgo_import_dynamic purego_dlopen dlopen "/usr/lib/libSystem.B.dylib" | |
| 9 | + | //go:cgo_import_dynamic purego_dlsym dlsym "/usr/lib/libSystem.B.dylib" | |
| 10 | + | //go:cgo_import_dynamic purego_dlerror dlerror "/usr/lib/libSystem.B.dylib" | |
| 11 | + | //go:cgo_import_dynamic purego_dlclose dlclose "/usr/lib/libSystem.B.dylib" | |
| @@ -0,0 +1,11 @@ | |||||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |||
| 2 | + | // SPDX-FileCopyrightText: 2024 The Ebitengine Authors | |||
| 3 | + | ||||
| 4 | + | //go:build !cgo | |||
| 5 | + | ||||
| 6 | + | package purego | |||
| 7 | + | ||||
| 8 | + | //go:cgo_import_dynamic purego_dlopen dlopen "/usr/lib/libSystem.B.dylib" | |||
| 9 | + | //go:cgo_import_dynamic purego_dlsym dlsym "/usr/lib/libSystem.B.dylib" | |||
| 10 | + | //go:cgo_import_dynamic purego_dlerror dlerror "/usr/lib/libSystem.B.dylib" | |||
| 11 | + | //go:cgo_import_dynamic purego_dlclose dlclose "/usr/lib/libSystem.B.dylib" | |||
A dlfcn_nocgo_freebsd.go +11 -0
| @@ -0,0 +1,11 @@ | |||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | + | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 3 | + | ||
| 4 | + | //go:build !cgo | |
| 5 | + | ||
| 6 | + | package purego | |
| 7 | + | ||
| 8 | + | //go:cgo_import_dynamic purego_dlopen dlopen "libc.so.7" | |
| 9 | + | //go:cgo_import_dynamic purego_dlsym dlsym "libc.so.7" | |
| 10 | + | //go:cgo_import_dynamic purego_dlerror dlerror "libc.so.7" | |
| 11 | + | //go:cgo_import_dynamic purego_dlclose dlclose "libc.so.7" | |
| @@ -0,0 +1,11 @@ | |||||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |||
| 2 | + | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |||
| 3 | + | ||||
| 4 | + | //go:build !cgo | |||
| 5 | + | ||||
| 6 | + | package purego | |||
| 7 | + | ||||
| 8 | + | //go:cgo_import_dynamic purego_dlopen dlopen "libc.so.7" | |||
| 9 | + | //go:cgo_import_dynamic purego_dlsym dlsym "libc.so.7" | |||
| 10 | + | //go:cgo_import_dynamic purego_dlerror dlerror "libc.so.7" | |||
| 11 | + | //go:cgo_import_dynamic purego_dlclose dlclose "libc.so.7" | |||
M dlfcn_nocgo_linux.go +1 -1
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 3 | 3 | ||
| 4 | - | //go:build !cgo || amd64 || arm64 | |
| 4 | + | //go:build !cgo | |
| 5 | 5 | ||
| 6 | 6 | package purego | |
| 7 | 7 | ||
| @@ -1,7 +1,7 @@ | |||||
| 1 | // SPDX-License-Identifier: Apache-2.0 | 1 | // SPDX-License-Identifier: Apache-2.0 | ||
| 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | ||
| 3 | 3 | ||||
| 4 | - | //go:build !cgo || amd64 || arm64 | 4 | + | //go:build !cgo |
| 5 | 5 | ||||
| 6 | package purego | 6 | package purego | ||
| 7 | 7 | ||||
M dlfcn_stubs.s +1 -1
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 3 | 3 | ||
| 4 | - | //go:build darwin || freebsd || (linux && (!cgo || amd64 || arm64)) | |
| 4 | + | //go:build !cgo && (darwin || freebsd || linux) | |
| 5 | 5 | ||
| 6 | 6 | #include "textflag.h" | |
| 7 | 7 | ||
| @@ -1,7 +1,7 @@ | |||||
| 1 | // SPDX-License-Identifier: Apache-2.0 | 1 | // SPDX-License-Identifier: Apache-2.0 | ||
| 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | ||
| 3 | 3 | ||||
| 4 | - | //go:build darwin || freebsd || (linux && (!cgo || amd64 || arm64)) | 4 | + | //go:build !cgo && (darwin || freebsd || linux) |
| 5 | 5 | ||||
| 6 | #include "textflag.h" | 6 | #include "textflag.h" | ||
| 7 | 7 | ||||
A internal/buildtest/main.go +16 -0
| @@ -0,0 +1,16 @@ | |||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | + | // SPDX-FileCopyrightText: 2024 The Ebitengine Authors | |
| 3 | + | ||
| 4 | + | //go:build !windows | |
| 5 | + | ||
| 6 | + | package main | |
| 7 | + | ||
| 8 | + | import ( | |
| 9 | + | _ "github.com/ebitengine/purego" | |
| 10 | + | ) | |
| 11 | + | ||
| 12 | + | import "C" | |
| 13 | + | ||
| 14 | + | // This file tests that build Cgo and purego at the same time succeeds to build (#189). | |
| 15 | + | func main() { | |
| 16 | + | } | |
| @@ -0,0 +1,16 @@ | |||||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |||
| 2 | + | // SPDX-FileCopyrightText: 2024 The Ebitengine Authors | |||
| 3 | + | ||||
| 4 | + | //go:build !windows | |||
| 5 | + | ||||
| 6 | + | package main | |||
| 7 | + | ||||
| 8 | + | import ( | |||
| 9 | + | _ "github.com/ebitengine/purego" | |||
| 10 | + | ) | |||
| 11 | + | ||||
| 12 | + | import "C" | |||
| 13 | + | ||||
| 14 | + | // This file tests that build Cgo and purego at the same time succeeds to build (#189). | |||
| 15 | + | func main() { | |||
| 16 | + | } | |||
A internal/cgo/dlfcn_cgo_unix.go +22 -0
| @@ -0,0 +1,22 @@ | |||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | + | // SPDX-FileCopyrightText: 2024 The Ebitengine Authors | |
| 3 | + | ||
| 4 | + | //go:build darwin || freebsd || linux | |
| 5 | + | ||
| 6 | + | package cgo | |
| 7 | + | ||
| 8 | + | /* | |
| 9 | + | #cgo LDFLAGS: -ldl | |
| 10 | + | ||
| 11 | + | #include <dlfcn.h> | |
| 12 | + | */ | |
| 13 | + | import "C" | |
| 14 | + | ||
| 15 | + | // all that is needed is to assign each dl function because then its | |
| 16 | + | // symbol will then be made available to the linker and linked to inside dlfcn.go | |
| 17 | + | var ( | |
| 18 | + | _ = C.dlopen | |
| 19 | + | _ = C.dlsym | |
| 20 | + | _ = C.dlerror | |
| 21 | + | _ = C.dlclose | |
| 22 | + | ) | |
| @@ -0,0 +1,22 @@ | |||||
| 1 | + | // SPDX-License-Identifier: Apache-2.0 | |||
| 2 | + | // SPDX-FileCopyrightText: 2024 The Ebitengine Authors | |||
| 3 | + | ||||
| 4 | + | //go:build darwin || freebsd || linux | |||
| 5 | + | ||||
| 6 | + | package cgo | |||
| 7 | + | ||||
| 8 | + | /* | |||
| 9 | + | #cgo LDFLAGS: -ldl | |||
| 10 | + | ||||
| 11 | + | #include <dlfcn.h> | |||
| 12 | + | */ | |||
| 13 | + | import "C" | |||
| 14 | + | ||||
| 15 | + | // all that is needed is to assign each dl function because then its | |||
| 16 | + | // symbol will then be made available to the linker and linked to inside dlfcn.go | |||
| 17 | + | var ( | |||
| 18 | + | _ = C.dlopen | |||
| 19 | + | _ = C.dlsym | |||
| 20 | + | _ = C.dlerror | |||
| 21 | + | _ = C.dlclose | |||
| 22 | + | ) | |||
M internal/cgo/syscall_cgo_unix.go +1 -10
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | // SPDX-License-Identifier: Apache-2.0 | |
| 2 | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | |
| 3 | 3 | ||
| 4 | - | //go:build freebsd || linux | |
| 4 | + | //go:build freebsd || (linux && !(arm64 || amd64)) | |
| 5 | 5 | ||
| 6 | 6 | package cgo | |
| 7 | 7 | ||
| @@ -42,15 +42,6 @@ import "unsafe" | |||
| 42 | 42 | // assign purego.syscall15XABI0 to the C version of this function. | |
| 43 | 43 | var Syscall15XABI0 = unsafe.Pointer(C.syscall15) | |
| 44 | 44 | ||
| 45 | - | // all that is needed is to assign each dl function because then its | |
| 46 | - | // symbol will then be made available to the linker and linked to inside dlfcn.go | |
| 47 | - | var ( | |
| 48 | - | _ = C.dlopen | |
| 49 | - | _ = C.dlsym | |
| 50 | - | _ = C.dlerror | |
| 51 | - | _ = C.dlclose | |
| 52 | - | ) | |
| 53 | - | ||
| 54 | 45 | //go:nosplit | |
| 55 | 46 | func Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | |
| 56 | 47 | args := C.syscall15Args{ | |
| @@ -1,7 +1,7 @@ | |||||
| 1 | // SPDX-License-Identifier: Apache-2.0 | 1 | // SPDX-License-Identifier: Apache-2.0 | ||
| 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | 2 | // SPDX-FileCopyrightText: 2022 The Ebitengine Authors | ||
| 3 | 3 | ||||
| 4 | - | //go:build freebsd || linux | 4 | + | //go:build freebsd || (linux && !(arm64 || amd64)) |
| 5 | 5 | ||||
| 6 | package cgo | 6 | package cgo | ||
| 7 | 7 | ||||
| @@ -42,15 +42,6 @@ import "unsafe" | |||||
| 42 | // assign purego.syscall15XABI0 to the C version of this function. | 42 | // assign purego.syscall15XABI0 to the C version of this function. | ||
| 43 | var Syscall15XABI0 = unsafe.Pointer(C.syscall15) | 43 | var Syscall15XABI0 = unsafe.Pointer(C.syscall15) | ||
| 44 | 44 | ||||
| 45 | - | // all that is needed is to assign each dl function because then its | |||
| 46 | - | // symbol will then be made available to the linker and linked to inside dlfcn.go | |||
| 47 | - | var ( | |||
| 48 | - | _ = C.dlopen | |||
| 49 | - | _ = C.dlsym | |||
| 50 | - | _ = C.dlerror | |||
| 51 | - | _ = C.dlclose | |||
| 52 | - | ) | |||
| 53 | - | ||||
| 54 | //go:nosplit | 45 | //go:nosplit | ||
| 55 | func Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | 46 | func Syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | ||
| 56 | args := C.syscall15Args{ | 47 | args := C.syscall15Args{ | ||