Bug#1006793: clang++ Doesn't Select The Correct Include Directories When Cross-Compiling

Connor Nolan connor24nolan at live.com
Sat Mar 5 00:30:02 GMT 2022


Package: clang
Version: 1:10.0-50~exp1
Severity: normal

Dear Maintainer,

I'm trying to cross-compile C++ code for ARMHF, while this works fine with GCC,
and C code works fine with Clang. When cross-compiling C++ code with Clang, it
fails to select the correct include directories (for libstdc++).

# Packages Used To Test
* g++-arm-linux-gnueabihf (For testing GCC)
* clang
* ARMHF Development Libraries (Also Depended On By g++-arm-linux-gnueabihf)
        * libstdc++-10-dev-armhf-cross
        * libc6-dev-armhf-cross

# Steps To Reproduce

1. Create test.cpp

test.cpp:
> #include <string>
> #include <cstdio>
>
> int main() {
>     std::string str = "Hello World!";
>     printf("%s\n", str.c_str());
> }

2. Compile With GCC (It Works!)

$ arm-linux-gnueabihf-g++ -o test test.cpp
$ echo $?
0
$ file test
test: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically
linked, interpreter /lib/ld-linux-armhf.so.3,
BuildID[sha1]=e0b6f7f2bec2ca44794a814775f6587aecaf3c5d, for GNU/Linux 3.2.0,
not stripped

3. Compile With Clang (It Doesn't Work.)

$ clang++ -target arm-linux-gnueabihf -o test test.cpp
In file included from test.cpp:1:
/usr/bin/../lib/gcc-cross/arm-linux-
gnueabihf/10/../../../../include/c++/10/string:38:10: fatal error:
'bits/c++config.h' file not found
#include <bits/c++config.h>
         ^~~~~~~~~~~~~~~~~~
1 error generated.

# More Info

## Include Directories Used By GCC

$ "$(arm-linux-gnueabihf-gcc -print-prog-name=cc1plus)" -v -quiet -imultiarch
arm-linux-gnueabihf < /dev/null
ignoring nonexistent directory "/usr/local/include/arm-linux-gnueabihf"
ignoring nonexistent directory "/usr/lib/gcc-cross/arm-linux-
gnueabihf/10/include-fixed"
ignoring nonexistent directory "/usr/include/arm-linux-gnueabihf"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-cross/arm-linux-gnueabihf/10/../../../../arm-linux-
gnueabihf/include/c++/10
 /usr/lib/gcc-cross/arm-linux-gnueabihf/10/../../../../arm-linux-
gnueabihf/include/c++/10/arm-linux-gnueabihf
 /usr/lib/gcc-cross/arm-linux-gnueabihf/10/../../../../arm-linux-
gnueabihf/include/c++/10/backward
 /usr/lib/gcc-cross/arm-linux-gnueabihf/10/include
 /usr/lib/gcc-cross/arm-linux-gnueabihf/10/../../../../arm-linux-
gnueabihf/include
 /usr/include
End of search list.

## Include Directories Used By Clang

$ clang++ -target arm-linux-gnueabihf -E -x c++ - -v < /dev/null
Debian clang version 11.0.1-2
Target: arm-unknown-linux-gnueabihf
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc-cross/arm-linux-
gnueabihf/10
Found candidate GCC installation: /usr/lib/gcc-cross/arm-linux-gnueabihf/10
Selected GCC installation: /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/10
Candidate multilib: .;@m32
Selected multilib: .;@m32
 (in-process)
 "/usr/lib/llvm-11/bin/clang" -cc1 -triple armv7-unknown-linux-gnueabihf -E
-disable-free -disable-llvm-verifier -discard-value-names -main-file-name -
-mrelocation-model static -mframe-pointer=all -fmath-errno -fno-rounding-math
-mconstructor-aliases -target-cpu generic -target-abi aapcs-linux -mfloat-abi
hard -fallow-half-arguments-and-returns -fno-split-dwarf-inlining -debugger-
tuning=gdb -v -resource-dir /usr/lib/llvm-11/lib/clang/11.0.1 -internal-isystem
/usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/10/../../../../include/c++/10
-internal-isystem /usr/bin/../lib/gcc-cross/arm-linux-
gnueabihf/10/../../../../include/arm-linux-gnueabihf/c++/10 -internal-isystem
/usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/10/../../../../include/arm-
unknown-linux-gnueabihf/c++/10 -internal-isystem /usr/bin/../lib/gcc-cross/arm-
linux-gnueabihf/10/../../../../include/c++/10/backward -internal-isystem
/usr/local/include -internal-isystem /usr/lib/llvm-11/lib/clang/11.0.1/include
-internal-externc-isystem /include -internal-externc-isystem /usr/include
-fdeprecated-macro -fdebug-compilation-dir / -ferror-limit 19 -fno-signed-char
-fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fcolor-diagnostics
-faddrsig -o - -x c++ -
clang -cc1 version 11.0.1 based upon LLVM 11.0.1 default target x86_64-pc-
linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc-cross/arm-linux-
gnueabihf/10/../../../../include/arm-linux-gnueabihf/c++/10"
ignoring nonexistent directory "/usr/bin/../lib/gcc-cross/arm-linux-
gnueabihf/10/../../../../include/arm-unknown-linux-gnueabihf/c++/10"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/gcc-cross/arm-linux-gnueabihf/10/../../../../include/c++/10
 /usr/bin/../lib/gcc-cross/arm-linux-
gnueabihf/10/../../../../include/c++/10/backward
 /usr/local/include
 /usr/lib/llvm-11/lib/clang/11.0.1/include
 /usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 404 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2

# Historical Example Of Bug

https://askubuntu.com/questions/947954/wrong-default-include-directories-for-
clang-cross-compile (Note: Ubuntu Not Debian)

# Systems Tested

I've replicated this bug on both my native Ubuntu 20.04 and a Debian Bullseye
Docker container.

# Conclusion

For now, I'm using a pretty hacky workaround to extract the GCC include
directory list and feed it into Clang, but the script's quite volatile and it
would be nice to have "-target" on Clang just work with C++ code. Any help
would be greatly appreciated! Thank you!



-- System Information:
Debian Release: bullseye/sid
  APT prefers focal-updates
  APT policy: (500, 'focal-updates'), (500, 'focal-security'), (500, 'focal'), (100, 'focal-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.13.0-30-generic (SMP w/8 CPU cores)
Kernel taint flags: TAINT_CRAP, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages clang depends on:
ii  clang-10  1:10.0.0-4ubuntu1

clang recommends no packages.

clang suggests no packages.

-- no debconf information



More information about the Pkg-llvm-team mailing list