Pulled from http://www.eglibc.org/archives/patches/msg01035.html Upstream-Status: Pending Signed-off-by: Khem As part of the menuconfig development, I encountered some outdated information in the cross-build instructions, libc/EGLIBC.cross-building. This patch updates the file with new (and tested) instructions. It is unrelated to the menuconfig support, but applies after. My testing was done with an ARM target, and an x86_64 Linux host, so I converted the instructions to use those host/target types from the original i686/powerpc. Hope that's ok. Thanks, -- Steve Longerbeam | Senior Embedded Engineer, ESD Services Mentor Embedded(tm) | 46871 Bayside Parkway, Fremont, CA 94538 P 510.354.5838 | M 408.410.2735 Nucleus(r) | Linux(r) | Android(tm) | Services | UI | Multi-OS EGLIBC.cross-building | 59 +++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 24 deletions(-) Index: libc/EGLIBC.cross-building =================================================================== --- libc.orig/EGLIBC.cross-building 2012-05-09 19:33:36.522676681 -0700 +++ libc/EGLIBC.cross-building 2012-05-09 19:36:13.918684298 -0700 @@ -47,31 +47,34 @@ EGLIBC requires recent versions of the GNU binutils, GCC, and the Linux kernel. The web page documents the current requirements, and lists patches needed for -certain target architectures. As of this writing, EGLIBC required -binutils 2.17, GCC 4.1, and Linux 2.6.19.1. +certain target architectures. As of this writing, these build +instructions have been tested with binutils 2.22.51, GCC 4.6.2, +and Linux 3.1. First, let's set some variables, to simplify later commands. We'll -build EGLIBC and GCC for a PowerPC target, known to the Linux kernel -as 'powerpc', and we'll do the build on an Intel Linux box: +build EGLIBC and GCC for an ARM target, known to the Linux kernel +as 'arm', and we'll do the build on an Intel x86_64 Linux box: - $ build=i686-pc-linux-gnu + $ build=x86_64-pc-linux-gnu $ host=$build - $ target=powerpc-none-linux-gnu - $ linux_arch=powerpc + $ target=arm-none-linux-gnueabi + $ linux_arch=arm We're using the aforementioned versions of Binutils, GCC, and Linux: - $ binutilsv=binutils-2.17 - $ gccv=gcc-4.1.1 - $ linuxv=linux-2.6.20 + $ binutilsv=binutils-2.22.51 + $ gccv=gcc-4.6.2 + $ linuxv=linux-3.1 We're carrying out the entire process under '~/cross-build', which -contains unpacked source trees: +contains unpacked source trees for binutils, gcc, and linux kernel, +along with EGLIBC svn trunk (which can be checked-out with +'svn co http://www.eglibc.org/svn/trunk eglibc'): - $ top=$HOME/cross-build/ppc + $ top=$HOME/cross-build/$target $ src=$HOME/cross-build/src $ ls $src - binutils-2.17 gcc-4.1.1 libc linux-2.6.20 + binutils-2.22.51 eglibc gcc-4.6.2 linux-3.1 We're going to place our build directories in a subdirectory 'obj', we'll install the cross-development toolchain in 'tools', and we'll @@ -99,7 +102,7 @@ The First GCC -For our work, we need a cross-compiler targeting a PowerPC Linux +For our work, we need a cross-compiler targeting an ARM Linux system. However, that configuration includes the shared library 'libgcc_s.so', which is compiled against the EGLIBC headers (which we haven't installed yet) and linked against 'libc.so' (which we haven't @@ -125,7 +128,8 @@ > --prefix=$tools \ > --without-headers --with-newlib \ > --disable-shared --disable-threads --disable-libssp \ - > --disable-libgomp --disable-libmudflap \ + > --disable-libgomp --disable-libmudflap --disable-libquadmath \ + > --disable-decimal-float --disable-libffi \ > --enable-languages=c $ PATH=$tools/bin:$PATH make $ PATH=$tools/bin:$PATH make install @@ -162,12 +166,13 @@ > CXX=$tools/bin/$target-g++ \ > AR=$tools/bin/$target-ar \ > RANLIB=$tools/bin/$target-ranlib \ - > $src/libc/configure \ + > $src/eglibc/libc/configure \ > --prefix=/usr \ > --with-headers=$sysroot/usr/include \ > --build=$build \ > --host=$target \ - > --disable-profile --without-gd --without-cvs --enable-add-ons + > --disable-profile --without-gd --without-cvs \ + > --enable-add-ons=nptl,libidn,../ports The option '--prefix=/usr' may look strange, but you should never configure EGLIBC with a prefix other than '/usr': in various places, @@ -181,6 +186,11 @@ The '--with-headers' option tells EGLIBC where the Linux headers have been installed. +The '--enable-add-ons=nptl,libidn,../ports' option tells EGLIBC to look +for the listed glibc add-ons. Most notably the ports add-on (located +just above the libc sources in the EGLIBC svn tree) is required to +support ARM targets. + We can now use the 'install-headers' makefile target to install the headers: @@ -223,6 +233,7 @@ > --prefix=$tools \ > --with-sysroot=$sysroot \ > --disable-libssp --disable-libgomp --disable-libmudflap \ + > --disable-libffi --disable-libquadmath \ > --enable-languages=c $ PATH=$tools/bin:$PATH make $ PATH=$tools/bin:$PATH make install @@ -240,13 +251,14 @@ > CXX=$tools/bin/$target-g++ \ > AR=$tools/bin/$target-ar \ > RANLIB=$tools/bin/$target-ranlib \ - > $src/libc/configure \ + > $src/eglibc/libc/configure \ > --prefix=/usr \ > --with-headers=$sysroot/usr/include \ > --with-kconfig=$obj/linux/scripts/kconfig \ > --build=$build \ > --host=$target \ - > --disable-profile --without-gd --without-cvs --enable-add-ons + > --disable-profile --without-gd --without-cvs \ + > --enable-add-ons=nptl,libidn,../ports Note the additional '--with-kconfig' option. This tells EGLIBC where to find the host config tools used by the kernel 'make config' and 'make @@ -337,15 +349,15 @@ ELF Header: ... Type: EXEC (Executable file) - Machine: PowerPC + Machine: ARM ... Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x10000034 0x10000034 0x00100 0x00100 R E 0x4 - INTERP 0x000134 0x10000134 0x10000134 0x0000d 0x0000d R 0x1 - [Requesting program interpreter: /lib/ld.so.1] - LOAD 0x000000 0x10000000 0x10000000 0x008f0 0x008f0 R E 0x10000 + INTERP 0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1 + [Requesting program interpreter: /lib/ld-linux.so.3] + LOAD 0x000000 0x00008000 0x00008000 0x0042c 0x0042c R E 0x8000 ... Looking at the dynamic section of the installed 'libgcc_s.so', we see @@ -357,7 +369,6 @@ Dynamic section at offset 0x1083c contains 24 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libc.so.6] - 0x00000001 (NEEDED) Shared library: [ld.so.1] 0x0000000e (SONAME) Library soname: [libgcc_s.so.1] ...