Unfortunately after few tries of cross compiling eglibc using different source
for instructions I alway end with hard to solve issues. Luckily, in the sources
of eglibc I noticed instructions for cross-compiling written long time ago by
Jim Blandy(I know i should start here). Lot of thanks to him for it. Below
I describe my experience which I gained during eglibc cross compilation for
arm-unknown-linux-gnueabi and procedure that I used. Commands below contain
some constants that I used in previous works. See this post. Eglibc library
and the compiler itself is built with many various parameters this post is not
the place to explain their meaning, please RTFM.
Checkout eglibc from svn (as alwyas I try to use a latest sources possible).
Version used r17815:
1
svn co http://www.eglibc.org/svn/trunk eglibc
Link working ports to GNU/Linux on some machine architectures. They are not
maintained in the official glibc source tree so we need to add it in this way:
make install-headers install_root=$TARGET install-bootstrap-headers=yes
We need few object file to link shared libraries, which will be built and
installed by hand:
1
2
mkdir -p $TARGET/usr/lib
make csu/subdir_lib cp csu/crt1.o csu/crti.o csu/crtn.o $TARGET/usr/lib
To produce libgcc_s.so we need libc.so, but only need its dummy version
because we’ll never use it. It doesn’t matter what we will point as a libc.so
we use /dev/null as C file.
1
2
arm-unknown-linux-gnueabi-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o
$TARGET/usr/lib/libc.so
Get latest gcc sources using git repository mirror. Latest commit while writing
this post was 5b9a8c3:
mkdir eglibc-final
cd eglibc-final/
BUILD_CC=gcc CC=arm-unknown-linux-gnueabi-gcc CXX=arm-unknown-linux-gnueabi-cpp
AR=arm-unknown-linux-gnueabi-ar
RANLIB=arm-unknown-linux-gnueabi-ranlib
../eglibc/libc/configure --prefix=/usr --with-headers=$TARGET/usr/include
--build=x86_64-pc-linux-gnu --host=arm-unknown-linux-gnueabi --disable-profile
--without-gd --without-cvs --enable-add-ons
make
make install install_root=$TARGET
Install libelf library
1
2
3
4
5
6
wget http://www.mr511.de/software/libelf-0.8.13.tar.gz
tar zxvf libelf-0.8.13.tar.gz
cd libelf-0.8.13/
./configure --prefix=$TARGET/arm-x-tools --disable-shared --enable-static
make
make install
Prepare final version of gcc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd ..
mkdir final-gcc
cd final-gcc
../official-gcc/configure --target=arm-unknown-linux-gnueabi
--prefix=$TARGET/arm-x-tools --with-sysroot=$TARGET --disable-libssp
--disable-libgomp --disable-libmudflap --enable-languages=c,c++ --with-gmp=$TARGET/arm-x-tools
--with-mpfr=$TARGET/arm-x-tools --with-mpc=$TARGET/arm-x-tools --disable-libquadmath
--build=$MACHTYPE --host=$MACHTYPE --with-local-prefix=$TARGET/arm-x-tools --disable-multilib
--with-float=soft --with-pkgversion="pietrushnic" --enable-threads=posix
--enable-target-optspace --disable-nls --enable-c99 --enable-long-long
--enable-__cxa_atexit --enable-symvers=gnu --with-libelf=$TARGET/arm-x-tools
--enable-lto
make
make install
Compile and install chrpath - this is useful tool to remove the rpath or runpath
setting from binary.
1
2
3
4
5
6
7
cd ..
sudo apt-get install libc6-i386 gcc-multilib
apt-get source chrpath
cd chrpath-0.13/ CFLAGS=-m32
./configure --prefix=$TARGET/arm-x-tools --program-prefix=arm-unknown-linux-gnueabi-
make
make install
Founder and Embedded Systems Consultant at 3mdeb as well as freelance CTO of Vitro Technology and CEO of LPN Plant. Passionate about building firmware that enables advanced hardware features in modern products. Dedicated to customers that treat embedded software security and upgradeability as forethought. Open source firmware evangelist interested in platform security and trusted computing. In favor of fixed price projects with a clear definition of success.