Cross compiling on Linux from OS X

I want to compile binaries for a Linux server from the OS X 10.7 + Eclipse build system. This means the cross-compiler GCC. I start with native 4.7.1 and shoot for host 4.7.1.

Most online instructions relate to embedded development. I want to use libstdC ++ - v3 and glibc, which makes it a little different.

What succeeds:

  • Install packages

    port install gcc47 export CC=gcc-mp-47 export LD=ld-mp-47 export CXX=g++-mp-47 export CPP=cpp-mp-47 port install gmake ln /opt/local/bin/gmake /opt/local/bin/make port install gsed ln /opt/local/bin/gsed /opt/local/bin/sed port install gawk port install autoconf port install msgfmt 
  • Make and install binutils-2.22

  • make all-gcc and make install-gcc

    The following configuration is used:

    $ .. / gcc / configure --enable-languages ​​= c, C ++, objc, obj-C ++ --with-gmp = / opt / local --with-mpfr = / opt / local - with-mpc = / opt / local --prefix = / usr / local / cross / linux --target = x86_64-pc-linux-gnu -disable-nls

  • Specify the build environment in the cross compiler

     export CC=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-gcc export LD=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ld export AR=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ar export CXX=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-g++ export CPP=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-cpp 
  • Build glibc-2.16 with config

    ../glibc/configure --host = x86_64-pc-linux-gnu --build = x86_64-apple-darwin11 --prefix = / usr / local / cross / linux / - with-binutils = / usr / local / cross / linux / bin / - with-headers = / usr / local / cross / linux / include / libc_cv_forced_unwind = yes libc_cv_ctors_header = yes libc_cv_c_cleanup = yes

Error:

glibc build does not work soon. This message appears many times:

 In file included from ./sysdeps/unix/sysdep.h:20:0, from ./sysdeps/unix/x86_64/sysdep.h:18, from sysdeps/unix/sysv/linux/x86_64/sysdep.h:22, from <stdin>:1: sysdeps/unix/sysv/linux/sys/syscall.h:24:24: fatal error: asm/unistd.h: No such file or directory compilation terminated. 

This may be normal.

Then it does not give stdio_lim.h . With make -d I get the following:

  Successfully remade target file `/Users/dkrauss/Documents/work/glibc-build/csu/abi-tag.h'. Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. File `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h' does not exist. Looking for an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. Trying pattern rule with stem `lim'. Trying implicit prerequisite `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. Found an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. Recently tried and failed to update file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. make[2]: *** No rule to make target `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st', needed by `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. Stop. 

This is the first heading he is trying to build in bits . There is a stdio_lim.h.in file, which is the only .in file in its directory. Should some rule connect .st to .in ?

+6
source share
1 answer

To properly build glibc, you need header files from the Linux system - perhaps kernel headers are sufficient.

This is due to the fact that these headers are necessary for any normal build of software for this system, and the same thing does not differ with cross-compilation.

It has been a long time since I worked on creating cross-compilers, so I cannot tell you how to get the glibc assembly to see the headers, but I think it can be done in a straightforward way.

+1
source

Source: https://habr.com/ru/post/922435/


All Articles