On Fri, Dec 12, 2014 at 10:49 AM, Richard Henderson <r...@redhat.com> wrote: > > Oh, that's interesting. You've found a bug in the x86_64 linking: > > gccgo -g3 -O3 -Wall -Werror -c -fPIC q.go -o q.o > gccgo -shared -Wl,-soname,libq.so -o libq.so q.o > gccgo -g3 -O3 -Wall -Werror -c -fPIC p.go -o p.o > gccgo -shared -Wl,-soname,libp.so -o libp.so p.o > gccgo -g3 -O3 -Wall -Werror -o main main.go libq.so libp.so > /usr/bin/ld: main: hidden symbol `__morestack' in > /usr/lib/gcc/x86_64-redhat-linux/4.8.3/libgcc.a(morestack.o) is referenced by > DSO > /usr/bin/ld: final link failed: Bad value > collect2: error: ld returned 1 exit status > make: *** [main] Error 1 > > Sure enough, both shared libraries failed to pull __morestack > from the static libgcc. > > $ nm libq.so | grep more > U __morestack > > I guess __morestack is included in the wrong portion of libgcc?
My intent was that __morestack would be included in each shared library that needs it, because going through a PLT stub to call __morestack would blow out the stack. That is why the symbol is hidden. So we need to link against -lgcc. It looks like when I link with gcc -shared it does link against -lgcc. When I link with gccgo -shared it does not. I could not figure out why that it was in 30 seconds of looking at the code. Ian