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.