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

Jimi Damon jdamon at accesio.com
Mon Jul 29 11:28:49 PDT 2013


Hi,

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


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














More information about the llvm-dev mailing list