g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot

Bug #1375071 reported by Jeffrey Walton
30
This bug affects 6 people
Affects Status Importance Assigned to Milestone
gcc-defaults-armel-cross (Ubuntu)
Confirmed
Undecided
Unassigned
gcc-defaults-armhf-cross (Ubuntu)
Confirmed
Undecided
Unassigned

Bug Description

g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot. It appears there are problems with the built-in paths used for the C++ headers.

The rest of the report just dumps information. But to summarize the dump...

We need the paths:

  A) /usr/arm-linux-gnueabi/include/c++/4.7.3
  B) /usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi

But the built-in paths tries to use:

  C) /usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3
  D) /usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf
  E) /usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3/backward

Notice the built-in paths use an extra "/usr/arm-linux-gnueabi"

*****

Ubuntu 14.04 (x64), fully patched. gcc-arm-linux-gnueabi and g++-arm-linux-gnueabi are installed.

$ uname -sm
Linux x86_64

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty

*****

$ /usr/bin/arm-linux-gnueabi-g++ --version
arm-linux-gnueabi-g++ (Ubuntu/Linaro 4.7.3-12ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.

And:

$ ls /usr/arm-linux-gnueabi
bin include lib

And:

$ cat embedded.cpp
#include <iostream>

int main(int argc, char* argv[])
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

*****

$ /usr/bin/arm-linux-gnueabi-g++ --sysroot=/usr/arm-linux-gnueabi embedded.cpp -o embedded.exe
embedded.cpp:1:20: fatal error: iostream: No such file or directory
compilation terminated.

*****

It appears the C++ headers are not included with SYSROOT. If I add the C++ header paths, then the compile is successful:

$ /usr/bin/arm-linux-gnueabi-g++ -I/usr/arm-linux-gnueabi/include/c++/4.7.3 -I/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi --sysroot=/usr/arm-linux-gnueabi embedded.cpp -o embedded.exe
$

And:

$ /usr/bin/arm-linux-gnueabi-readelf readelf -h ./embedded.exe | grep -i 'class\|machine'
readelf: Error: 'readelf': No such file
  Class: ELF32
  Machine: ARM

*****

From http://wiki.ubuntu.com/ToolChain:

$ /usr/bin/arm-linux-gnueabi-g++ -v -E - < /dev/null 2>&1 | awk '/^#include/,/^End of search/' | grep '^ '
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include
 /usr/include

*****

However, there's actually more to the paths than shown on ToolChain wiki, and this shows the incorrect C++ lookups. There's an extra '/usr/arm-linux-gnueabi/' in the paths being used:

$ /usr/bin/arm-linux-gnueabi-g++ -v --sysroot=/usr/arm-linux-gnueabi embedded.cpp -o embedded.exe
Using built-in specs.
COLLECT_GCC=/usr/bin/arm-linux-gnueabi-g++
...
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3"
ignoring nonexistent directory "/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf"
ignoring nonexistent directory "/usr/arm-linux-gnueabi/usr/arm-linux-gnueabi/include/c++/4.7.3/backward"
ignoring nonexistent directory "/usr/arm-linux-gnueabi/usr/local/include/arm-linux-gnueabi"
ignoring nonexistent directory "/usr/arm-linux-gnueabi/usr/include/arm-linux-gnueabi"
ignoring nonexistent directory "/usr/arm-linux-gnueabi/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include
End of search list.
...

*****

$ /usr/bin/arm-linux-gnueabi-g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/arm-linux-gnueabi-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.3-12ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.7.3 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-gnu-unique-object --disable-libmudflap --disable-libitm --enable-plugin --with-system-zlib --enable-objc-gc --with-cloog --enable-cloog-backend=ppl --disable-cloog-version-check --disable-ppl-version-check --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv5t --with-float=soft --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include
Thread model: posix
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1)

Revision history for this message
Jeffrey Walton (noloader) wrote :

Just in case... Both of these produced the error (so it was not the "=" sign after SYSROOT):

/usr/bin/arm-linux-gnueabi-g++ --sysroot=/usr/arm-linux-gnueabi embedded.cpp -o embedded.exe

/usr/bin/arm-linux-gnueabi-g++ --sysroot /usr/arm-linux-gnueabi embedded.cpp -o embedded.exe

Revision history for this message
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in gcc-defaults-armel-cross (Ubuntu):
status: New → Confirmed
Changed in gcc-defaults-armhf-cross (Ubuntu):
status: New → Confirmed
Revision history for this message
Denis Borisevich (dennisfen) wrote :

Got the same problem on Ubuntu 15.04 with gcc-arm-linux-gnueabihf-4.9

Revision history for this message
Jeffrey Walton (noloader) wrote :

As Denis stated in Comment #4, this problem appears in ARMHF toolchain, also.

See, for example:

 * "Linking error when compiling Crypto++ for ARMHF", http://stackoverflow.com/q/31698241
 * "Crypto++ Issue 134: setenv-embedded.sh and GNUmakefile-cross", http://github.com/weidai11/cryptopp/issues/134

Its just an FYI comment, and the ARMHF toolchain may need a separate bug report. But I'm guessing what has been done in one toolchain is done in other toolchains. I can envision something like an errant staging $DESTDIR added in the wrong place.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.