Skip to content

Instantly share code, notes, and snippets.

@japaric
Last active August 3, 2016 03:31
Show Gist options
  • Save japaric/634f873e15b97bead71d95dee29aa11a to your computer and use it in GitHub Desktop.
Save japaric/634f873e15b97bead71d95dee29aa11a to your computer and use it in GitHub Desktop.
#
# Automatically generated file; DO NOT EDIT.
# Crosstool-NG Configuration
#
CT_CONFIGURE_has_make381=y
CT_MODULES=y
#
# Paths and misc options
#
#
# crosstool-NG behavior
#
# CT_OBSOLETE is not set
# CT_EXPERIMENTAL is not set
# CT_DEBUG_CT is not set
#
# Paths
#
CT_LOCAL_TARBALLS_DIR=""
CT_WORK_DIR="${CT_TOP_DIR}/.build"
CT_PREFIX_DIR="/x-tools/${CT_TARGET}"
CT_INSTALL_DIR="${CT_PREFIX_DIR}"
CT_RM_RF_PREFIX_DIR=y
CT_REMOVE_DOCS=y
CT_INSTALL_DIR_RO=y
CT_STRIP_HOST_TOOLCHAIN_EXECUTABLES=y
# CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES is not set
#
# Downloading
#
# CT_FORBID_DOWNLOAD is not set
# CT_FORCE_DOWNLOAD is not set
CT_CONNECT_TIMEOUT=10
# CT_ONLY_DOWNLOAD is not set
# CT_USE_MIRROR is not set
#
# Extracting
#
# CT_FORCE_EXTRACT is not set
CT_OVERIDE_CONFIG_GUESS_SUB=y
# CT_ONLY_EXTRACT is not set
CT_PATCH_BUNDLED=y
# CT_PATCH_LOCAL is not set
# CT_PATCH_BUNDLED_LOCAL is not set
# CT_PATCH_LOCAL_BUNDLED is not set
# CT_PATCH_BUNDLED_FALLBACK_LOCAL is not set
# CT_PATCH_LOCAL_FALLBACK_BUNDLED is not set
# CT_PATCH_NONE is not set
CT_PATCH_ORDER="bundled"
#
# Build behavior
#
CT_PARALLEL_JOBS=0
CT_LOAD=""
CT_USE_PIPES=y
CT_EXTRA_CFLAGS_FOR_BUILD=""
CT_EXTRA_LDFLAGS_FOR_BUILD=""
CT_EXTRA_CFLAGS_FOR_HOST=""
CT_EXTRA_LDFLAGS_FOR_HOST=""
# CT_CONFIG_SHELL_SH is not set
# CT_CONFIG_SHELL_ASH is not set
CT_CONFIG_SHELL_BASH=y
# CT_CONFIG_SHELL_CUSTOM is not set
CT_CONFIG_SHELL="${bash}"
#
# Logging
#
# CT_LOG_ERROR is not set
# CT_LOG_WARN is not set
CT_LOG_INFO=y
# CT_LOG_EXTRA is not set
# CT_LOG_ALL is not set
# CT_LOG_DEBUG is not set
CT_LOG_LEVEL_MAX="INFO"
# CT_LOG_SEE_TOOLS_WARN is not set
CT_LOG_PROGRESS_BAR=y
CT_LOG_TO_FILE=y
CT_LOG_FILE_COMPRESS=y
#
# Target options
#
CT_ARCH="x86"
CT_ARCH_SUPPORTS_32=y
CT_ARCH_SUPPORTS_64=y
CT_ARCH_SUPPORTS_WITH_ARCH=y
CT_ARCH_SUPPORTS_WITH_CPU=y
CT_ARCH_SUPPORTS_WITH_TUNE=y
CT_ARCH_DEFAULT_32=y
CT_ARCH_ARCH=""
CT_ARCH_CPU=""
CT_ARCH_TUNE=""
# CT_ARCH_32 is not set
CT_ARCH_64=y
CT_ARCH_BITNESS=64
CT_TARGET_CFLAGS=""
CT_TARGET_LDFLAGS=""
# CT_ARCH_alpha is not set
# CT_ARCH_arm is not set
# CT_ARCH_avr is not set
# CT_ARCH_m68k is not set
# CT_ARCH_mips is not set
# CT_ARCH_nios2 is not set
# CT_ARCH_powerpc is not set
# CT_ARCH_s390 is not set
# CT_ARCH_sh is not set
# CT_ARCH_sparc is not set
CT_ARCH_x86=y
# CT_ARCH_xtensa is not set
CT_ARCH_alpha_AVAILABLE=y
CT_ARCH_arm_AVAILABLE=y
CT_ARCH_avr_AVAILABLE=y
CT_ARCH_m68k_AVAILABLE=y
CT_ARCH_microblaze_AVAILABLE=y
CT_ARCH_mips_AVAILABLE=y
CT_ARCH_nios2_AVAILABLE=y
CT_ARCH_powerpc_AVAILABLE=y
CT_ARCH_s390_AVAILABLE=y
CT_ARCH_sh_AVAILABLE=y
CT_ARCH_sparc_AVAILABLE=y
CT_ARCH_x86_AVAILABLE=y
CT_ARCH_xtensa_AVAILABLE=y
CT_ARCH_SUFFIX=""
#
# Generic target options
#
# CT_MULTILIB is not set
CT_ARCH_USE_MMU=y
#
# Target optimisations
#
CT_ARCH_FLOAT=""
# CT_ARCH_ALPHA_EV4 is not set
# CT_ARCH_ALPHA_EV45 is not set
# CT_ARCH_ALPHA_EV5 is not set
# CT_ARCH_ALPHA_EV56 is not set
# CT_ARCH_ALPHA_EV6 is not set
# CT_ARCH_ALPHA_EV67 is not set
#
# Toolchain options
#
#
# General toolchain options
#
CT_FORCE_SYSROOT=y
CT_USE_SYSROOT=y
CT_SYSROOT_NAME="sysroot"
CT_SYSROOT_DIR_PREFIX=""
CT_WANTS_STATIC_LINK=y
# CT_STATIC_TOOLCHAIN is not set
CT_TOOLCHAIN_PKGVERSION=""
CT_TOOLCHAIN_BUGURL=""
#
# Tuple completion and aliasing
#
CT_TARGET_VENDOR="unknown"
CT_TARGET_ALIAS_SED_EXPR=""
CT_TARGET_ALIAS=""
#
# Toolchain type
#
CT_CROSS=y
# CT_CANADIAN is not set
CT_TOOLCHAIN_TYPE="cross"
#
# Build system
#
CT_BUILD=""
CT_BUILD_PREFIX=""
CT_BUILD_SUFFIX=""
#
# Misc options
#
# CT_TOOLCHAIN_ENABLE_NLS is not set
#
# Operating System
#
CT_KERNEL_SUPPORTS_SHARED_LIBS=y
CT_KERNEL="linux"
CT_KERNEL_VERSION="3.2.72"
# CT_KERNEL_bare_metal is not set
CT_KERNEL_linux=y
CT_KERNEL_bare_metal_AVAILABLE=y
CT_KERNEL_linux_AVAILABLE=y
# CT_KERNEL_V_4_3 is not set
# CT_KERNEL_V_4_2 is not set
# CT_KERNEL_V_4_1 is not set
# CT_KERNEL_V_3_18 is not set
# CT_KERNEL_V_3_14 is not set
# CT_KERNEL_V_3_12 is not set
# CT_KERNEL_V_3_10 is not set
# CT_KERNEL_V_3_4 is not set
CT_KERNEL_V_3_2=y
# CT_KERNEL_V_2_6_32 is not set
# CT_KERNEL_LINUX_CUSTOM is not set
CT_KERNEL_windows_AVAILABLE=y
#
# Common kernel options
#
CT_SHARED_LIBS=y
#
# linux other options
#
CT_KERNEL_LINUX_VERBOSITY_0=y
# CT_KERNEL_LINUX_VERBOSITY_1 is not set
# CT_KERNEL_LINUX_VERBOSITY_2 is not set
CT_KERNEL_LINUX_VERBOSE_LEVEL=0
CT_KERNEL_LINUX_INSTALL_CHECK=y
#
# Binary utilities
#
CT_ARCH_BINFMT_ELF=y
CT_BINUTILS="binutils"
CT_BINUTILS_binutils=y
#
# GNU binutils
#
# CT_CC_BINUTILS_SHOW_LINARO is not set
CT_BINUTILS_V_2_25_1=y
# CT_BINUTILS_V_2_25 is not set
# CT_BINUTILS_V_2_24 is not set
# CT_BINUTILS_V_2_23_2 is not set
# CT_BINUTILS_V_2_23_1 is not set
# CT_BINUTILS_V_2_22 is not set
# CT_BINUTILS_V_2_21_53 is not set
# CT_BINUTILS_V_2_21_1a is not set
# CT_BINUTILS_V_2_20_1a is not set
# CT_BINUTILS_V_2_19_1a is not set
# CT_BINUTILS_V_2_18a is not set
CT_BINUTILS_VERSION="2.25.1"
CT_BINUTILS_2_25_1_or_later=y
CT_BINUTILS_2_25_or_later=y
CT_BINUTILS_2_24_or_later=y
CT_BINUTILS_2_23_or_later=y
CT_BINUTILS_2_22_or_later=y
CT_BINUTILS_2_21_or_later=y
CT_BINUTILS_2_20_or_later=y
CT_BINUTILS_2_19_or_later=y
CT_BINUTILS_2_18_or_later=y
CT_BINUTILS_HAS_HASH_STYLE=y
CT_BINUTILS_HAS_GOLD=y
CT_BINUTILS_GOLD_SUPPORTS_ARCH=y
CT_BINUTILS_GOLD_SUPPORT=y
CT_BINUTILS_HAS_PLUGINS=y
CT_BINUTILS_HAS_PKGVERSION_BUGURL=y
CT_BINUTILS_LINKER_LD=y
# CT_BINUTILS_LINKER_GOLD is not set
# CT_BINUTILS_LINKER_LD_GOLD is not set
# CT_BINUTILS_LINKER_GOLD_LD is not set
CT_BINUTILS_LINKERS_LIST="ld"
CT_BINUTILS_LINKER_DEFAULT="bfd"
# CT_BINUTILS_PLUGINS is not set
CT_BINUTILS_EXTRA_CONFIG_ARRAY=""
# CT_BINUTILS_FOR_TARGET is not set
#
# binutils other options
#
#
# C-library
#
CT_LIBC="uClibc"
CT_LIBC_VERSION="1.0.9"
# CT_LIBC_glibc is not set
# CT_LIBC_musl is not set
# CT_LIBC_newlib is not set
# CT_LIBC_none is not set
CT_LIBC_uClibc=y
CT_LIBC_avr_libc_AVAILABLE=y
CT_LIBC_glibc_AVAILABLE=y
CT_THREADS="nptl"
# CT_LIBC_GLIBC_V_2_22 is not set
# CT_LIBC_GLIBC_V_2_21 is not set
# CT_LIBC_GLIBC_V_2_20 is not set
# CT_LIBC_GLIBC_V_2_19 is not set
# CT_LIBC_GLIBC_V_2_18 is not set
# CT_LIBC_GLIBC_V_2_17 is not set
# CT_LIBC_GLIBC_V_2_16_0 is not set
# CT_LIBC_GLIBC_V_2_15 is not set
# CT_LIBC_GLIBC_V_2_14_1 is not set
# CT_LIBC_GLIBC_V_2_14 is not set
# CT_LIBC_GLIBC_V_2_13 is not set
# CT_LIBC_GLIBC_V_2_12_2 is not set
# CT_LIBC_GLIBC_V_2_12_1 is not set
# CT_LIBC_GLIBC_V_2_11_1 is not set
# CT_LIBC_GLIBC_V_2_11 is not set
# CT_LIBC_GLIBC_V_2_10_1 is not set
# CT_LIBC_GLIBC_V_2_9 is not set
# CT_LIBC_GLIBC_V_2_8 is not set
CT_LIBC_mingw_AVAILABLE=y
CT_LIBC_musl_AVAILABLE=y
CT_LIBC_newlib_AVAILABLE=y
CT_LIBC_none_AVAILABLE=y
CT_LIBC_uClibc_AVAILABLE=y
CT_LIBC_UCLIBC_NG_V_1_0_9=y
# CT_LIBC_UCLIBC_V_0_9_33_2 is not set
CT_LIBC_UCLIBC_NG_1_0_9_or_later=y
CT_LIBC_UCLIBC_NG_1_0_0_or_later=y
CT_LIBC_UCLIBC_0_9_33_2_or_later=y
CT_LIBC_UCLIBC_PARALLEL=y
CT_LIBC_UCLIBC_NG=y
CT_LIBC_UCLIBC_VERBOSITY_0=y
# CT_LIBC_UCLIBC_VERBOSITY_1 is not set
# CT_LIBC_UCLIBC_VERBOSITY_2 is not set
CT_LIBC_UCLIBC_VERBOSITY=""
CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
# CT_LIBC_UCLIBC_DEBUG_LEVEL_3 is not set
CT_LIBC_UCLIBC_DEBUG_LEVEL=0
CT_LIBC_UCLIBC_CONFIG_FILE=""
CT_LIBC_SUPPORT_THREADS_ANY=y
CT_LIBC_SUPPORT_THREADS_NATIVE=y
CT_LIBC_SUPPORT_THREADS_LT=y
CT_LIBC_SUPPORT_THREADS_NONE=y
#
# Common C library options
#
CT_THREADS_NATIVE=y
# CT_THREADS_LT is not set
# CT_THREADS_NONE is not set
CT_LIBC_XLDD=y
# CT_LIBC_GLIBC_KERNEL_VERSION_NONE is not set
# CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS is not set
# CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN is not set
#
# uClibc other options
#
CT_LIBC_UCLIBC_LNXTHRD=""
# CT_LIBC_UCLIBC_LOCALES is not set
# CT_LIBC_UCLIBC_WCHAR is not set
CT_LIBC_UCLIBC_FENV=y
#
# C compiler
#
CT_CC="gcc"
CT_CC_CORE_PASSES_NEEDED=y
CT_CC_CORE_PASS_1_NEEDED=y
CT_CC_CORE_PASS_2_NEEDED=y
CT_CC_gcc=y
# CT_CC_GCC_SHOW_LINARO is not set
CT_CC_GCC_V_5_2_0=y
# CT_CC_GCC_V_4_9_3 is not set
# CT_CC_GCC_V_4_8_5 is not set
# CT_CC_GCC_V_4_7_4 is not set
# CT_CC_GCC_V_4_6_4 is not set
# CT_CC_GCC_V_4_5_4 is not set
# CT_CC_GCC_V_4_4_7 is not set
# CT_CC_GCC_V_4_3_6 is not set
# CT_CC_GCC_V_4_2_4 is not set
CT_CC_GCC_4_2_or_later=y
CT_CC_GCC_4_3_or_later=y
CT_CC_GCC_4_4_or_later=y
CT_CC_GCC_4_5_or_later=y
CT_CC_GCC_4_6_or_later=y
CT_CC_GCC_4_7_or_later=y
CT_CC_GCC_4_8_or_later=y
CT_CC_GCC_4_9_or_later=y
CT_CC_GCC_5=y
CT_CC_GCC_5_or_later=y
CT_CC_GCC_HAS_GRAPHITE=y
CT_CC_GCC_USE_GRAPHITE=y
CT_CC_GCC_HAS_LTO=y
CT_CC_GCC_USE_LTO=y
CT_CC_GCC_HAS_PKGVERSION_BUGURL=y
CT_CC_GCC_HAS_BUILD_ID=y
CT_CC_GCC_HAS_LNK_HASH_STYLE=y
CT_CC_GCC_USE_GMP_MPFR=y
CT_CC_GCC_USE_MPC=y
CT_CC_GCC_HAS_LIBQUADMATH=y
CT_CC_GCC_HAS_LIBSANITIZER=y
CT_CC_GCC_VERSION="5.2.0"
# CT_CC_LANG_FORTRAN is not set
CT_CC_GCC_ENABLE_CXX_FLAGS=""
CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY=""
CT_CC_GCC_EXTRA_CONFIG_ARRAY=""
CT_CC_GCC_EXTRA_ENV_ARRAY=""
CT_CC_GCC_STATIC_LIBSTDCXX=y
# CT_CC_GCC_SYSTEM_ZLIB is not set
#
# Optimisation features
#
#
# Settings for libraries running on target
#
CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y
# CT_CC_GCC_LIBMUDFLAP is not set
# CT_CC_GCC_LIBGOMP is not set
# CT_CC_GCC_LIBSSP is not set
# CT_CC_GCC_LIBQUADMATH is not set
#
# Misc. obscure options.
#
CT_CC_CXA_ATEXIT=y
# CT_CC_GCC_DISABLE_PCH is not set
CT_CC_GCC_SJLJ_EXCEPTIONS=m
CT_CC_GCC_LDBL_128=m
# CT_CC_GCC_BUILD_ID is not set
CT_CC_GCC_LNK_HASH_STYLE_DEFAULT=y
# CT_CC_GCC_LNK_HASH_STYLE_SYSV is not set
# CT_CC_GCC_LNK_HASH_STYLE_GNU is not set
# CT_CC_GCC_LNK_HASH_STYLE_BOTH is not set
CT_CC_GCC_LNK_HASH_STYLE=""
CT_CC_GCC_DEC_FLOAT_AUTO=y
# CT_CC_GCC_DEC_FLOAT_BID is not set
# CT_CC_GCC_DEC_FLOAT_DPD is not set
# CT_CC_GCC_DEC_FLOATS_NO is not set
CT_CC_SUPPORT_CXX=y
CT_CC_SUPPORT_FORTRAN=y
CT_CC_SUPPORT_JAVA=y
CT_CC_SUPPORT_ADA=y
CT_CC_SUPPORT_OBJC=y
CT_CC_SUPPORT_OBJCXX=y
CT_CC_SUPPORT_GOLANG=y
#
# Additional supported languages:
#
CT_CC_LANG_CXX=y
# CT_CC_LANG_JAVA is not set
#
# Debug facilities
#
# CT_DEBUG_dmalloc is not set
# CT_DEBUG_duma is not set
# CT_DEBUG_gdb is not set
# CT_DEBUG_ltrace is not set
# CT_DEBUG_strace is not set
#
# Companion libraries
#
CT_COMPLIBS_NEEDED=y
CT_GMP_NEEDED=y
CT_MPFR_NEEDED=y
CT_ISL_NEEDED=y
CT_MPC_NEEDED=y
CT_COMPLIBS=y
CT_GMP=y
CT_MPFR=y
CT_ISL=y
CT_MPC=y
# CT_LIBICONV_V_1_14 is not set
CT_GMP_V_6_0_0=y
# CT_GMP_V_5_1_3 is not set
# CT_GMP_V_5_1_1 is not set
# CT_GMP_V_5_0_2 is not set
# CT_GMP_V_5_0_1 is not set
# CT_GMP_V_4_3_2 is not set
# CT_GMP_V_4_3_1 is not set
# CT_GMP_V_4_3_0 is not set
CT_GMP_5_0_2_or_later=y
CT_GMP_VERSION="6.0.0a"
CT_MPFR_V_3_1_3=y
# CT_MPFR_V_3_1_2 is not set
# CT_MPFR_V_3_1_0 is not set
# CT_MPFR_V_3_0_1 is not set
# CT_MPFR_V_3_0_0 is not set
# CT_MPFR_V_2_4_2 is not set
# CT_MPFR_V_2_4_1 is not set
# CT_MPFR_V_2_4_0 is not set
CT_MPFR_VERSION="3.1.3"
CT_ISL_V_0_14=y
# CT_ISL_V_0_12_2 is not set
CT_ISL_V_0_14_or_later=y
CT_ISL_V_0_12_or_later=y
CT_ISL_VERSION="0.14"
CT_MPC_V_1_0_3=y
# CT_MPC_V_1_0_2 is not set
# CT_MPC_V_1_0_1 is not set
# CT_MPC_V_1_0 is not set
# CT_MPC_V_0_9 is not set
# CT_MPC_V_0_8_2 is not set
# CT_MPC_V_0_8_1 is not set
# CT_MPC_V_0_7 is not set
CT_MPC_VERSION="1.0.3"
#
# Companion libraries common options
#
# CT_COMPLIBS_CHECK is not set
#
# Companion tools
#
#
# READ HELP before you say 'Y' below !!!
#
# CT_COMP_TOOLS is not set

Use a docker container to make this easy to replicate:

$ docker run -it ubuntu:16.04

Everything below this point must be executed inside the docker container

$ apt-get update

# stuff required to build Rust
$ apt-get install -y --no-install-recommends ca-certificates cmake curl file g++ gdb git libc6-dev make python

# build a uclibc cross toolchain from scratch using crosstool-ng
$ curl -sL https://raw.githubusercontent.com/rust-lang/rust-buildbot/a35c53e21a789cc782ec51f2fdefc1e3f8767c42/slaves/linux-cross/build_toolchain_root.sh | bash
# can't use crosstool-ng as root, so we create a new user
$ useradd -m rust
# and also create a folder for the toolchain
$ mkdir /x-tools
$ chown rust:rust /x-tools
$ su rust
# As `rust` user
$ mkdir ~/ct
$ cd ~/ct
# NOTE: Pick these options. Syntax: $MENU > $SUBMENU > $ITEM = $VALUE -- $COMMENT
# Path and misc options > Prefix directory = /x-tools/${CT_TARGET} 
# Target options > Target architecture = x86
# Target options > Bitness = 64
# Operating System > Linux kernel version = 3.2.72 -- Precise kernel
# Operating System > Target OS = linux
# C-library > C library = uClibc
# C compiler > C++ = ENABLE -- we'll need a C++ cross compiler for when cross compile rustc
$ ct-ng menuconfig
$ ct-ng build
$ exit
# Back as `root`
# Put some symlinks to the cross compiler in PATH
$ cd /usr/bin
$ ln -s /x-tools/x86_64-unknown-linux-uclibc/bin/x86_64-unknown-linux-uclibc-gcc x86_64-linux-uclibc-gcc
$ ln -s /x-tools/x86_64-unknown-linux-uclibc/bin/x86_64-unknown-linux-uclibc-g++ x86_64-linux-uclibc-g++
$ ln -s /x-tools/x86_64-unknown-linux-uclibc/bin/x86_64-unknown-linux-uclibc-ar x86_64-linux-uclibc-ar
# Test
$ x86_64-linux-uclibc-gcc -v
$ su rust
# Again as the `rust` user
# fetch the rust-lang/rust uclibc fork
# NOTE: I used the checkout of the commit "Resolve compile errors previously hidden under others"
$ git clone --depth 1 https://github.com/KennethAdamMiller/rust ~/rust

# tell gcc-rs which compiler to use
$ export CC_x86_64_unknown_linux_uclibc=x86_64-linux-uclibc-gcc
$ export CXX_x86_64_unknown_linux_uclibc=x86_64-linux-uclibc-g++
$ export AR_x86_64_unknown_linux_uclibc=x86_64-linux-uclibc-ar

# build it
$ mkdir ~/build
$ cd ~/build
$ ../rust/configure --enable-rustbuild --target=x86_64-unknown-linux-uclibc
# NOTE: fastest way to cross compile std -- this doesn't bootstrap (i.e. rebuild 3 times) the compiler
$ python ../rust/src/bootstrap/bootstrap.py --target x86_64-unknown-linux-uclibc --step libstd --stage 1

# test it
# use rustup to manage the new toolchain
$ curl https://sh.rustup.rs -sSf | sh -s -- -y
$ source ~/.cargo/env
$ rustup toolchain link stage1 build/x86_64-unknown-linux-gnu/stage1
$ rustup default stage1

# NOTE: output should say `-dev`
$ rustc -V
rustc 1.12.0-dev (5a8bb249f 2016-07-27)

$ echo 'fn main() { println!("Hello, world!") }' > hello.rs
$ rustc --target x86_64-unknown-linux-uclibc -C linker=x86_64-linux-uclibc-gcc hello.rs
$ file hello
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld64-uClibc.so.0, not stripped
@KennethAdamMiller
Copy link

Did yours complete successfully? Because I got an error that spat out:

unrecognized emulation mode: 64
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om elf_k1om

Also, I had to change the linker to be x86_64-linux-uclibc-ld, and add a new soft link, so I'll reply with an updated script when I'm done...

I think this may have been due tot the fact that in the source code, I added the line:
https://github.com/KennethAdamMiller/rust/blob/master/src/librustc_back/target/x86_64_unknown_linux_uclibc.rs#L7

So, I tried to manually enter in the command without the -m64 to see if that was the source of the error, but ultimately, I was subsequently was forced to remove every -Wl,XYZ option that the rust compiler emitted to the linker. It finally died with cannot find -lgcc_s, even when I added the location to the libgcc_s.so file within the built crosstool directory. So, I may have set something wrong in crosstool, but I have to investigate that further later on.

@japaric
Copy link
Author

japaric commented Jul 29, 2016

Did yours complete successfully?

I gotta admit I didn't test running all these commands again. Like I said before I wrote these down from what I remember (and my command line history), though I have done this procedure for other targets several times before.

Also, I had to change the linker to be x86_64-linux-uclibc-ld

Don't set ld as the linker, instead use x86_64-linux-uclibc-gcc as the linker. Rust only works correctly when gcc is the linker.

was forced to remove every -Wl,XYZ option

This is because you are using ld as the linker. If you use gcc as the linker, you won't see these errors.

It finally died with cannot find -lgcc_s

Same thing as above, use gcc instead of ld. ld doesn't know where the system libraries are installed; gcc does. gcc will call ld with the right arguments; it will tell ld where the system libraries are (via the -L flag iirc).

unrecognized emulation mode: 64

This sounds like the toolchain wasn't build with multillib enabled. crosstool-ng builds a toolchain with multilib disabled by default and iirc trying to build a toolchain with multilib enabled doesn't really/properly work. Also, you don't even need to pass -m64 in the first place; the toolchain is configured to generate 64-bit instructions by default and, in fact, it can't generate 32-bit instructions because multilib is disabled.

@KennethAdamMiller
Copy link

| I gotta admit I didn't test...

That's ok, I'm just really glad to have what I do, and I think I'm much further along that I otherwise would have been.

| Don't set ld...

Oh! ok, yeah the --linker= in the original part stopped without -gcc at the end, so I just thought that ld was of course the linker.

| You don't even need to pass -m64...

I removed it from the rust target and rebuilt it.

| sounds like the toolchain wasn't built with multilib enabled...

Ok, I'll build with that enabled and try again, although if multilib being enabled causes problems but is needed, I don't know what else I can do.

So far, just removing the -m64 part and changing the linker resulted in a different error, although I'm not sure how far along the compilation is to know which I was closer to being done with:

rust@aadce5e3f5cf:~/build$ rustc --target x86_64-unknown-linux-uclibc -C linker=x86_64-linux-uclibc-gcc hello.rs
error: linking with x86_64-linux-uclibc-gcc failed: exit code: 1
note: "x86_64-linux-uclibc-gcc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-L" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib" "hello.0.o" "-o" "hello" "-Wl,--gc-sections" "-pie" "-nodefaultlibs" "-L" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib" "-Wl,-Bstatic" "-Wl,-Bdynamic" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/libstd-ba34b5778cda2d40.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/libpanic_unwind-4468a2a640556f4f.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/libunwind-955053747c616610.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/librand-4a280e99d262760a.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/libcollections-8255c7ccacfdbe43.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/librustc_unicode-91a6a713af3719b4.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/liballoc-eeeed99c269728ee.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/liballoc_jemalloc-f2163600a65dc593.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/liblibc-f36fcda8a23729fd.rlib" "/home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/libcore-b0188cf7cfaaa310.rlib" "-l" "dl" "-l" "rt" "-l" "pthread" "-l" "gcc_s" "-l" "pthread" "-l" "c" "-l" "m" "-l" "rt" "-l" "util" "-l" "compiler-rt"
note: /home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/liballoc_jemalloc-f2163600a65dc593.rlib(jemalloc.pic.o): In function malloc_conf_init': /home/rust/rust/src/liballoc_jemalloc/../jemalloc/src/jemalloc.c:937: undefined reference tosecure_getenv'
/home/rust/x-tools/x86_64-unknown-linux-uclibc/lib/gcc/x86_64-unknown-linux-uclibc/5.2.0/../../../../x86_64-unknown-linux-uclibc/bin/ld: /home/rust/build/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-uclibc/lib/liballoc_jemalloc-f2163600a65dc593.rlib(jemalloc.pic.o): unrecognized relocation (0x2a) in section `.text.malloc_conf_init'
/home/rust/x-tools/x86_64-unknown-linux-uclibc/lib/gcc/x86_64-unknown-linux-uclibc/5.2.0/../../../../x86_64-unknown-linux-uclibc/bin/ld: final link failed: Bad value

I think maybe the rust toolchain has it's own malloc implementation, and the ct-ng compiler toolchain has it's own malloc implementation, and they are fighting with one another.

@KennethAdamMiller
Copy link

So, searching around, I found this:

https://users.rust-lang.org/t/cross-compilation-not-working/4299/2

And so, after reading that just a little bit, I realize that that is probably right. I forked from the master branch of rust, and then in the script, we pulled from the rust buildbot. Do you think I should just rebase my commits onto the latest rust master, and re-perform the buildbot script step? I'm pretty sure, although I don't see the command myself, that at some point in the build process it pulled down a std version, and I was worrying to myself that the rust compiler version and the build std version were different.

@japaric
Copy link
Author

japaric commented Jul 31, 2016

Sorry about the delay. I don't get notified about these comments and I forget to check.

undefined reference tosecure_getenv
unrecognized relocation (0x2a) in section `.text.malloc_conf_init'

This sounds like you are using two different toolchains (which is bad): one to compile the C dependencies and one to link Rust crates. Did you export the CC_x86_64_unknown_linux_uclibc et al. variables before calling make? I think that you can confirm this if you look for the output files (these files contain the output of running e.g. alloc_jemalloc's build.rs) in the build directory ($ find -name output) and verify that x86_64-linux-uclibc-gcc appears in their contents. If instead you see cc being used to compile jemalloc, that means you didn't properly set the CC_* et al. variables.

@KennethAdamMiller
Copy link

Yeah, I did export that. I can ctrl+r for it and see that I have it set.

In any case, I will blow away my docker and start over.

@KennethAdamMiller
Copy link

Are you sure it's not that the particular rust standard library version was different from the rust I have forked? I'm seeing the downloads for rust beta from July 6th, and my fork occurred way after that... I may be over thinking it, my build is still running for the latest retry.

@japaric
Copy link
Author

japaric commented Aug 1, 2016

Are you sure it's not that the particular rust standard library version was different from the rust I have forked?

I don't think so, no. std is built from scratch; it doesn't depend on the snapshot's std.

I'm seeing the downloads for rust beta from July 6th

That's how the bootstrap process works; the initial compiler is the previous stable () release. () The bootstrap process just recently changed so we are not quite using stable releases yet; that's why a beta is used for now.

@KennethAdamMiller
Copy link

Ok, well I just reproduced my error with "undefined reference to secure_getenv", not sure what to do from here now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment