0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

libgccのためのインクルードパス

Last updated at Posted at 2017-05-30

クロスでlibgccを作っているとき、手違いでホスト用のヘッダが使われているんじゃないかと不安になりました。
そこでglibcなしでlibgccをビルドしてエラーを起こさせて、configureに与えるオプションがどう使われているのかを見てみることにしました。

とりあえずbinutilsをビルドします。
ビルド環境はx64_64のLinuxでターゲットはi686-pc-linux-gnuです。

export PATH=$HOME/prefix/bin:$PATH
mkdir $HOME/src/
cd $HOME/src/
wget --no-clobber http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.bz2
rm -rf binutils-2.28/
tar xf binutils-2.28.tar.bz2
cd binutils-2.28/
mkdir build
cd build/
../configure
--target=i686-pc-linux-gnu
--prefix=$HOME/prefix
make
make install

そしてgccにmpcとgmpとmpfrを入れて

cd $HOME/src/
wget --no-clobber http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz
rm -rf mpc-1.0.3/
tar xf mpc-1.0.3.tar.gz
wget --no-clobber http://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz
rm -rf gmp-6.1.2/
tar xf gmp-6.1.2.tar.xz
wget --no-clobber http://www.mpfr.org/mpfr-3.1.5/mpfr-3.1.5.tar.xz
rm -rf mpfr-3.1.5/
tar xf mpfr-3.1.5.tar.xz
wget --no-clobber http://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
rm -rf gcc-6.3.0/
tar xf gcc-6.3.0.tar.bz2
cd gcc-6.3.0/
ln -s ../mpc-1.0.3 mpc
ln -s ../gmp-6.1.2 gmp
ln -s ../mpfr-3.1.5 mpfr

面倒そうなものは全部disableして、思いつく限りディレクトリを指定してみます。
区別できるようにディレクトリはすべて別にしました。

mkdir build
cd build/
../configure
--target=i686-pc-linux-gnu
--prefix=$HOME/prefix
--exec-prefix=$HOME/exec-prefix
--includedir=$HOME/includedir
--with-headers=$HOME/headers
--with-local-prefix=$HOME/local-prefix
--with-native-system-header-dir=$HOME/native-system-header-dir
--with-sysroot=$HOME/sysroot
--disable-shared
--disable-threads
--disable-libatomic
--disable-libgomp
--disable-libmpx
--disable-libquadmath
--disable-libssp
--disable-libstdcxx
--disable-libvtv
--enable-languages=c,c++
make all-target-libgcc

stdio.hが無いと言われるつもりだったのですが、その前にコケます。

The directory that should contain system headers does not exist:
/home/tshibata/sysroot/home/tshibata/native-system-header-dir

ははあ、native-system-header-dirはsysrootの下に置かれるもののようです。

mkdir -p /home/tshibata/sysroot/home/tshibata/native-system-header-dir

とりあえずそれを作って再開すると

stdio.h: そのようなファイルやディレクトリはありません

来ました。

/home/tshibata/src/gcc-6.3.0/build/./gcc/xgcc -B/home/tshibata/src/gcc-6.3.0/build/./gcc/ -B/home/tshibata/exec-prefix/i686-pc-linux-gnu/bin/ -B/home/tshibata/exec-prefix/i686-pc-linux-gnu/lib/ -isystem /home/tshibata/exec-prefix/i686-pc-linux-gnu/include -isystem /home/tshibata/exec-prefix/i686-pc-linux-gnu/sys-include -g -O2 -O2 -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fpic -mlong-double-80 -DUSE_ELF_SYMVER -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector -fpic -mlong-double-80 -DUSE_ELF_SYMVER -I. -I. -I../.././gcc -I../../../libgcc -I../../../libgcc/. -I../../../libgcc/../gcc -I../../../libgcc/../include -DHAVE_CC_TLS -DUSE_TLS -o _muldi3.o -MT _muldi3.o -MD -MP -MF _muldi3.dep -DL_muldi3 -c ../../../libgcc/libgcc2.c -fvisibility=hidden -DHIDE_EXPORTS

というコマンドの結果です。
同じディレクトリで同じコマンドに-v付けて実行すると

ignoring nonexistent directory "/home/tshibata/exec-prefix/i686-pc-linux-gnu/include"
ignoring nonexistent directory "./include"
ignoring nonexistent directory "/home/tshibata/src/gcc-6.3.0/build/gcc/../lib/gcc/i686-pc-linux-gnu/6.3.0/include"
ignoring nonexistent directory "/home/tshibata/src/gcc-6.3.0/build/gcc/../lib/gcc/i686-pc-linux-gnu/6.3.0/include-fixed"
ignoring nonexistent directory "/home/tshibata/src/gcc-6.3.0/build/gcc/../lib/gcc/i686-pc-linux-gnu/6.3.0/../../../../../../../i686-pc-linux-gnu/include"
ignoring nonexistent directory "/home/tshibata/exec-prefix/lib/gcc/i686-pc-linux-gnu/6.3.0/include"
ignoring nonexistent directory "/home/tshibata/sysroot/home/tshibata/local-prefix/include"
ignoring nonexistent directory "/home/tshibata/exec-prefix/lib/gcc/i686-pc-linux-gnu/6.3.0/include-fixed"
ignoring nonexistent directory "/home/tshibata/exec-prefix/../../../i686-pc-linux-gnu/include"
ignoring duplicate directory "."
ignoring duplicate directory "../../../libgcc/."
#include "..." search starts here:
#include <...> search starts here:
.
../.././gcc
../../../libgcc
../../../libgcc/../gcc
../../../libgcc/../include
/home/tshibata/src/gcc-6.3.0/build/./gcc/include
/home/tshibata/src/gcc-6.3.0/build/./gcc/include-fixed
/home/tshibata/exec-prefix/i686-pc-linux-gnu/sys-include
/home/tshibata/sysroot/home/tshibata/native-system-header-dir

まとめ

configureに与えられたディレクトリはlibgccをコンパイルするときのインクルードパスとして
--prefix: 使われないようです。
--includedir: 使われないようです。
--with-headers: 使われないようです。
--exec-prefix: 使われますが、後にi686-pc-linux-gnuが付くのでターゲット用に生成されたものでしょう。
--with-sysroot: 直接は使われないようです。
--with-local-prefix: sysroot/local-prefix/includeからヘッダファイルがインクルードされます。
--with-native-system-header-dir: sysroot/native-system-header-dirからヘッダファイルがインクルードされます。


たぶんsysroot/local-prefix/includeがターゲット用ヘッダの基本的な置き場で、カーネルのヘッダを別の場所に置きたい場合はsysroot/native-system-header-dirなのだと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?