[LLVMdev] help with link problems

John Criswell criswell at cs.uiuc.edu
Wed Aug 23 07:35:19 PDT 2006


Jerry Hom wrote:

I haven't seen anyone answer this question yet, so I'll take a crack at it:

> First, thanks to those who have responded to my earlier pleas for
> help.  You have either directly or indirectly helped me find the
> answers I needed.  I'm slowly getting up to speed with LLVM.  Now I
> have 2 more questions.
>
> 1) I'm using LLVM 1.8a with llvm-gcc3.  I'm trying to compile firefox
> (with regular gcc and make) while using LLVM to automatically
> instrument one source file (specifically, nsCacheService.cpp in the
> netwerk/cache module).  I've written an LLVM pass to add a fprintf()
> timestamp at every function exit.  So I go through the steps as
> outlined in the FAQ to turn C++ code into C: 1) llvm-g++ on the source
> file to produce LLVM bytecode; 2) run my pass on bytecode; 3) use llc
> to produce C code; 4) run regular compilation via make.
>   
I am not sure what is happening below, but my best guess is that Firefox 
is using symbols found in native code libraries (e.g. system libraries 
not compiled to LLVM bytecode).  If that is the case, you have two options:

1) Compile the library into LLVM bytecode (only works if you have the 
source).

2) Link the native code library into the object files when you compile 
the output of llc with gcc.

> The regular compilation process creates .o files, combines them into
> an archive, then links several module archives together into a shared
> object file.  At this last step, I get several error messages about
> undefined references; snippet shown below.  Don't know if this is
> relevant, but the makefile's ld command uses -Bsymbolic.
>
> ../../dist/lib/libnkcache_s.a(nsCacheEntryDescriptor.o)(.text+0x123e): In function `nsCacheEntryDescriptor::MarkValid()':
> : undefined reference to `nsCacheService::ServiceLock()'
>
> ../../dist/lib/libnkcache_s.a(nsCacheEntryDescriptor.o)(.text+0x1278): In function `nsCacheEntryDescriptor::MarkValid()':
> : undefined reference to `nsCacheService::ValidateEntry(nsCacheEntry*)'
>
> ../../dist/lib/libnkcache_s.a(nsCacheEntryDescriptor.o)(.text+0x12ad): In function `nsCacheEntryDescriptor::Close()':
> : undefined reference to `nsCacheService::ServiceLock()'
>
> ../../dist/lib/libnkcache_s.a(nsCacheEntryDescriptor.o)(.text+0x12e4): In function `nsCacheEntryDescriptor::Close()':
> : undefined reference to `nsCacheService::CloseDescriptor(nsCacheEntryDescriptor*)'
>
>
> 2) On a whim, I wanted to try using llvm-gcc4.  However, when I invoke
> it, I get a relocation error.
>
> prompt% llvm-gcc --version
> llvm-gcc: relocation error: /home/jhom/LLVM/1.8/llvm-gcc4-1.8-x86-linux/lib/libstdc++.so.6: undefined symbol: _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEi
>   
Did you compile llvm-gcc4, or did you download a precompiled version 
from somewhere?

Most likely, the problem is that llvm-gcc4 was built against a different 
version of libstdc++ (or, the version of libstdc++ used is not in your 
LD_LIBRARY_PATH).  You'll either need to recompile llvm-gcc4 or set your 
LD_LIBRARY_PATH accordingly.

If the llvm-gcc4 is a pre-compiled version from the LLVM web site, 
please email the llvmdev list.  If it's a problem for you, it might be a 
problem for a number of people.

-- John T.

> Any suggestions are greatly appreciated!
>
>   




More information about the llvm-dev mailing list