You can not directly call a C function pointer from Go. You will need a CGO wrapper that calls it and them you call that wrapper from Go.
-Bruno On Thu, May 15, 2025, 5:20 AM rudeus greyrat <rudeusquagmir...@gmail.com> wrote: > Hello, > > Thanks for your answer. > > Three points to note: > > - I never asked how to create an so, I already have a given so :/ > - No need to provide the code because the issue is simple to describe: > I have an address of a function in a Go variable, how to call it ? > - AI is garbage (even though I use it) > > I thought about using assembly with a call instruction but I hoped someone > knowledgable would tell me there is a built in Go function for that. > > Regards, > Rudeus > > > > Le jeudi 15 mai 2025 à 02:46:18 UTC+2, Kurtis Rader a écrit : > >> On Wed, May 14, 2025 at 4:17 PM rudeus greyrat <rudeusqu...@gmail.com> >> wrote: >> >>> I am still a beginner in Linux internals so please bear with me. >>> >>> I have a ".so" that export "helloworld" function. >>> >>> I load the ".so" using CGO by: >>> >>> 1. Creating a file descriptor >>> 2. using ```write``` to write the so to it >>> >>> A shared library (".so" file) has a complex structure. You normally >> create one using a compiler and related tools. For example, the Go compiler >> can create a .so file from Go source code using a command like >> >> go build -buildmode=c-shared -o mylib.so >> >> It seems unlikely you are creating a valid .so file by opening an empty >> file and writing to it unless you are simply copying one .so file to >> another file. >> >>> >>> 1. Get a handle using ```dlopen``` >>> 2. Get the address of ```helloworld``` symbol using ```dlsym``` >>> >>> The address of "helloworld" is saved in a go variable called >>> ```address``` >>> >>> How to call ```address``` ? >>> >>> On windows I am able to call address using ```syscall.SyscallN```. On >>> Linux I tried with >>> ``` >>> r1, r2, err := syscall.Syscall(address, 0, 0, 0) >>> ``` >>> >>> And I get "function not implemented" error. >>> >> >> I can't speak to Windows but on Unix like operating systems, such as >> Linux, a function in a shared library is a user space function, not a >> kernel entry point. A syscall is the way you call OS kernel functions, not >> user space functions. I wouldn't expect syscall.Syscall() to work on >> Windows when passed the address of a function in a DLL. Did you actually >> confirm that it does work when passed the address of a DLL user space >> function? In any case this definitely won't work on Linux. >> >> I searched for "how to call a function in a shared library in go" in >> Chrome and the results included an AI generated example of how to do this >> along with links to many articles and other sources such as StackOverflow. >> If you're still having problems ask again but show us the source code you >> wrote and the commands you ran to compile it. >> >> -- >> Kurtis Rader >> Caretaker of the exceptional canines Junior and Hank >> > -- > 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 visit > https://groups.google.com/d/msgid/golang-nuts/6df9116e-d5dd-4b93-bd0d-45df42c24626n%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/6df9116e-d5dd-4b93-bd0d-45df42c24626n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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 visit https://groups.google.com/d/msgid/golang-nuts/CAEd86TzVTE4seP1gOhzr7mvNNKwQSaRn66xDvX974TNx3%2BHD_g%40mail.gmail.com.