[LLVMdev] llvm-g++ 4.6.4 unable to compile simple shared library on Ubuntu 12.04 x86_64

Duncan Sands baldrick at free.fr
Thu Aug 1 08:45:25 PDT 2013


Hi, I can't reproduce this on x86-64 ubuntu 13.04 with version 3.2-1~exp1ubuntu2
of the llvm-gcc-4.6 package.

 > I am trying to release a Makefile for building my company's software that will
> be flexible enough to use the llvm suite of compilers to build shared libraries
> for talking to USB peripherals.  The problem that I am having is that while I am
> able to build a shared library using llvm-gcc , the llvm-g++ compiler is giving
> me error messages saying "
>
> relocation R_X86_64_PC32 against undefined symbol `__morestack' can not be used
> when making a shared object; recompile with -fPIC

If you do:

   llvm-g++ -fPIC -S -o squared.ll squared.c -flto

what is in squared.ll?

Anyway, this issue smells like a Debian packaging problem to me.  It's the
kind of thing you get when the plugin was built against a different version
of gcc to the one it is being loaded into.  For example, if it was built
against a basic gcc with no C++ support but is being loaded into g++.  (The
original plugin will refuse to load in this situation but I think the Debian
package turns this check off).

Does it happen if you build LLVM and the dragonegg plugin yourself?

Ciao, Duncan.

>
>
> Here's my configuration on my local machine:
>
> cat /etc/issue
> Ubuntu-12.04
>
> uname -a
> Linux localhost 3.2.0-48-generic #74-Ubuntu SMP Thu Jun 6 19:43:26 UTC 2013
> x86_64 x86_64 x86_64 GNU/Linux
>
> dpkg -l | grep llvm
>
> ii  libllvm2.7 2.7-0ubuntu1 Low-Level Virtual Machine (LLVM) (runtime library)
> ii  libllvm2.9 2.9+dfsg-3ubuntu4 Low-Level Virtual Machine (LLVM), runtime library
> ii  libllvm3.0 3.0-4ubuntu1 Low-Level Virtual Machine (LLVM), runtime library
> ii  libllvm3.0:i386 3.0-4ubuntu1 Low-Level Virtual Machine (LLVM), runtime library
> ii  llvm 2.9-7                                               Low-Level Virtual
> Machine (LLVM)
> ii  llvm-2.9 2.9+dfsg-3ubuntu4 Low-Level Virtual Machine (LLVM)
> ii  llvm-2.9-dev 2.9+dfsg-3ubuntu4 Low-Level Virtual Machine (LLVM), libraries
> and headers
> ii  llvm-2.9-runtime 2.9+dfsg-3ubuntu4 Low-Level Virtual Machine (LLVM),
> bytecode interpreter
> ii  llvm-3.0 3.0-4ubuntu1 Low-Level Virtual Machine (LLVM)
> ii  llvm-3.0-dev 3.0-4ubuntu1 Low-Level Virtual Machine (LLVM), libraries and
> headers
> ii  llvm-3.0-runtime 3.0-4ubuntu1 Low-Level Virtual Machine (LLVM), bytecode
> interpreter
> ii  llvm-dev 2.9-7 Low-Level Virtual Machine (LLVM), libraries and headers
> ii  llvm-gcc-4.6 3.0-3                                               C front end
> for LLVM C/C++ compiler
> ii  llvm-runtime 2.9-7 Low-Level Virtual Machine (LLVM), bytecode interpreter
>
>
>
> I have  a very simple example that appears to illustrate this problem
>
> /********   squared.h BEGIN *****/
> int squared(int val);
> /*********    END       *****/
>
>
> /******* squared.c  BEGIN    ****/
> int squared(int val) {
> return val*val;
> }
> /*********   END     ****/
>
> /****   main.c  BEGIN   *****/
> #include <stdio.h>
> int
> main(int argc,char *argv[] ) {
>     int i = 0;
>     for( i = 0; i < 10 ; i ++ ) {
>        printf("%d\n",squared(i));
>     }
> }
> /****   END   *******/
>
> Using llvm-gcc works just fine:
>
> llvm-gcc -fPIC -c -o squared.o squared.c
> llvm-gcc -shared -o libsquared.so  squared.o
> llvm-gcc -L. -o main   main.c  -lsquared
>
> LD_LIBRARY_PATH=.  ./main
> 0
> 1
> 4
> 9
> 16
> 25
> 36
> 49
> 64
> 81
>
>
> The creation of the shared library fails when using llvm-g++
>
> llvm-g++ -fPIC -c -o squared.o squared.c
> llvm-g++ -shared -o libsquared.so squared.o
> /usr/bin/ld: squared.o: relocation R_X86_64_PC32 against undefined symbol
> `__morestack' can not be used when making a shared object; recompile with -fPIC
>
>
>
> This exact compile works on a  32 bit version of Ubuntu 12.04  , i686
> cat /etc/issue
> Ubuntu 12.04.2 LTS \n \l
>
> uname -a
> Linux gdbserver 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:15:33 UTC
> 2013 i686 i686 i386 GNU/Linux
>
> llvm-g++ -fPIC -c -o squared.o squared.c
> llvm-g++ -shared -o libsquared.so  squared.o
>
> This succeeds and I am able to use the shared library to compile the main program.
>
>
> Any ideas for how to get passed this problem with llvm-g++ ?
>
> Thanks
>
> -Jimi
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list