Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clang++ --gcc-toolchain and gcc 4.9.3 linking issues

(Ubuntu 16.04.1)

By default on 16.04.1 clang is picking the gcc tool chain for 5.4. Unfortunately I have a library that requires pre-5.0 ABI and I do NOT have access to the source, nor has the implementer released a new version. I've been trying to use the --gcc-toolchain option, but I can NOT get it to work. (ctrbegin.o and crtend.o don't get the proper prefix at link.)

$ clang++-3.8 -v -print-search-dirs

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/5.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/6.0.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.0.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.4.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6.0.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.4.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.0.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../x86_64-linux-gnu/bin

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu:
/lib/x86_64-linux-gnu:
/lib/../lib64:
/usr/lib/x86_64-linux-gnu:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../..:
/usr/lib/llvm-3.8/bin/../lib:
/lib:
/usr/lib

When I attempt to specify the --gcc-toolchain, clang seems to accept, then completely ignore the value. (Same thing happens with clang++-3.5 on 16.04.1.)

Is this the proper syntax? Notice that the library directories are missing from the output.

$ clang++-3.8 -v --gcc-toolchain=/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3 -print-search-dirs

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/..//bin

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/usr/lib/llvm-3.8/bin/../lib:/lib:/usr/lib

I have tried MANY variations on the above theme. (4.9, removing the relative path, etc.) I've tried the -isystem option and the -cxx-isystem option. (Both suggested as solutions to similar issues.)

What am i missing? (I hope it is simple and a head smack is in order!)

like image 782
ErnieE Avatar asked Aug 30 '16 03:08

ErnieE


2 Answers

It seems that you're passing a wrong path to --gcc-toolchain option. It expects a path to GCC install prefix which is /usr in case of GCC installed with a package manager. However, I don't think it's possible to choose what toolchain to use if you have several versions of GCC installed in your system and they all have the same prefix. Seems that clang just takes the latest version in $PREFIX/lib/gcc/x86_64-linux-gnu directory. So, I'd recommend you to build the toolchain you need yourself and pass the installation prefix to --gcc-toolchain option.

like image 198
Nikolai Avatar answered Oct 03 '22 20:10

Nikolai


Unfortunately I have a library that requires pre-5.0 ABI and I do NOT have access to the source

you don't need to switch gcc-toolchain to change ABI as the newer gcc versions have dual-abi support.

To switch the ABI overriding the preprocessor macro:

clang++ -D_GLIBCXX_USE_CXX11_ABI=0 

So, I'd recommend you to build the toolchain you need yourself and pass the installation prefix to --gcc-toolchain option.

If it is alredy available, you might want to trick clang to use your selected toolchain by mimicking your /usr folder via symlinks while excluding the gcc versions you dont need.

like image 36
Gaetano Avatar answered Oct 03 '22 21:10

Gaetano