Hi Miecc,

Did you get this working, I am having exact same issues, wondering if you 
ever able to get this through? Or using gccgo?

I am using gcc11 for this.


On Thursday 24 March 2022 at 02:31:28 UTC+5:30 miecc kn wrote:

> Hello everyone, first time here so please bear with me. 
> I got the tipp of asking this rather fringe case question here from 
> comments on my /r/golang post. 
>
> In brief I want to create a shared library out of a golang project so that 
> it can be dynamically loaded by applications written in another language on 
> IBM AIX 7.2.
> I am aware that go build -buildmode=c-shared is unsupported on AIX at the 
> time of writing, so I am currently trying to work my way around this 
> limitation by creating first a static archive first with "go build 
> -buildmode=c-archive" and have that compiled with gcc into a shared object 
> for dynamic linking.
> A quick, probably nicer to read version of this has been posted on this 
> reddit post 
> <https://www.reddit.com/r/golang/comments/tk65e0/creating_a_shared_c_library_out_of_go_project_to/>
> .
>
> To test my endeavour I have created a simple .go library and main.c file:
> sharedLibTest.go
> package main
>
> import (
>     "fmt"
> )
>
> import "C"
>
> func main() {
>     fmt.Printf("%s\n", "Golang: main was called")
>     MyPackage_Init()
>     MyPackage_Create()
> }
>
> //export MyPackage_Init
> func MyPackage_Init() {
>     fmt.Printf("%s\n", "Golang: MyPackage_Init was called")
> }
>
> //export MyPackage_Create
> func MyPackage_Create() {
>     fmt.Printf("%s\n", "Golang: MyPackage_Create was called")
> }
>
> main.c
> #include <stdio.h> #include "sharedLibTest.h" int main() { printf("%s\n", 
> "C: main() called"); MyPackage_Init(); MyPackage_Create(); }
>
> On my local linux machine I am able to compile these two files together 
> both statically as well as dynamically with a native shared object as well 
> as through the detour of a static archive. Please refer to the reddit post 
> for the details of that.
> To try and compile it on AIX I can create a static archive, have that 
> compiled into a shared object with gcc8 and, due to AIX weirdness, have 
> that resulting .so file renamed to .a because AIX's linker does not look 
> for .so files for reasons best known to IBM.
>
> $ go build -v -buildmode=c-archive -mod vendor -o 
> /home/myuser/workspace/go_proj/sharedLibTest/sharedLibTest.a 
> /home/myuser/workspace/go_proj/sharedLibTest/sharedLibTest.go
> $ cat > symbols.export << EOF > MyPackage_Init > MyPackage_Create > EOF  
> $ gcc -fPIC -DPIC -g -O2 -mcpu=power7 -maix64 -shared -lpthread 
> -Wl,-bE:symbols.export -o libsharedLibTest.so -Wl,-bnoobjreorder 
> ./sharedLibTest.a 
>   $ mv libsharedLibTest.so libsharedLibTest.a
>
> I can finally link that that with my main.c file
> $ gcc -L. -g -O2 -mcpu=power7 -maix64 -Wl,-bnoobjreorder -lsharedLibTest 
> -lpthreads main.c  
>
> But when I try to run that I get 
> $ LD_LIBRARY_PATH=/home/myuser/workspace/go_proj/sharedLibTest ./a.out
> exec(): 0509-036 Cannot load program ./a.out because of the following 
> errors: 0509-150 Dependent module 
> /home/myuser/workspace/go_proj/sharedLibTest/libsharedLibTest.a(libsharedLibTest.so)
>  
> could not be loaded. 0509-187 The local-exec model was used for 
> thread-local storage, but the module is not the main program. 0509-193 
> Examine the .loader section header with the 'dump -Hv' command.  
>
>
> Now so far I have gathered, that if I can make the go static archive 
> compile with whatever the equivalent of gcc's -fPIC option is, that archive 
> produces Position Independent Code that can be loaded dynamically, a thing 
> that is currently failing, according to my understanding of that loader's 
> error message.
>
> Adding -gcflags="-shared" to my go build invocation leads to an error 
> that I presume is the base of the issue and why c-shared plainly prints the 
> that shared libs are unsupported
> $ go build -buildmode=c-archive -gcflags=-shared 
> -ldflags=-linkmode=external -mod vendor -o sharedLibTest.a sharedLibTest.go 
> # command-line-arguments 
> main.main: unknown reloc to .TOC.: 48 (R_ADDRPOWER_PCREL) 
> _cgoexp_87081e778e87_MyPackage_Init: unknown reloc to .TOC.: 48 
> (R_ADDRPOWER_PCREL) 
> _cgoexp_87081e778e87_MyPackage_Create: unknown reloc to .TOC.: 48 
> (R_ADDRPOWER_PCREL)
>
> So alas: my question finally is, Is there any way for golang projects to 
> one way or another be compiled down into a shared library that can be 
> loaded dynamically by other applications? 
> I have gotten yet another hint just now from an IBM forum post, that I may 
> try gcc-go, however I am wondering if this really hasn't been done yet by 
> anyone else.
>
> Best regards,
> miecc
>

-- 
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/e30ee53c-1cae-4913-b0ce-f77be7e11174n%40googlegroups.com.

Reply via email to