2017. 3. 6. 12:11

cygwin에서 toolchain을 이용한 c/c++ cross compile (elf compile on windows)

cross compile을 위한 toolchain이란?

기본적으로 gcc는 시스템 종속적(질문)으로 만들어지지 않았다.

그래서, gcc는 windows에서도, linux에서도, 기타 다른 플렛폼에서도 실행할 수 있다. (컴파일만 된다면) 그리고, gcc가 빌드해서 산출하는 바이너리도 종속적(질문)으로 만들어지지 않았다.

그래서, gcc는 elf(.so)뿐만 아니라 .exe/.dll도 빌드할 수 있다.
이걸 정리하면,

gcc는
◾host : gcc를 실행하는 플렛폼
◾target : gcc가 생산하는 바이너리가 실행되는 플렛폼

을 조합할 수 있다.

즉, 일반적인 ubuntu x86에 기본으로 들어 있는 gcc는 host가 linux x86, target은 linux x86이다.

만일, ubuntu x86에서 x86_64를 빌드하고 싶다면, host가 linux x86이고 target은 linux x86_64인 gcc를 실행해야 한다. 만일, Windows에서 x86_64를 빌드하고 싶다면, host가 cygwin이고 target은 linux x86_64인 gcc를 실행하면 된다. (참고로, gcc는 c/c++ 뿐만 아니라 fortran같은 다른 언도도 지원할 수 있다)

이러한 gcc를 빌드하기 위해서는 수많은 input이 필요한데, 절차 또한 까다롭다.
이러한 불편한 것을 덜어주기 위해 toolchain-ng라는 툴이 있다.
해당 툴로 toolchain을 만들수 있다.

toolchain이란, 위 gcc같은 개발환경 set을 말한다.
즉, Windows에서 x86_64를 빌드하고 싶다면, 그에 맞는 gcc 셋, 즉, 툴체인이 필요한 것이다.
linux 장비등, 같은 모듈에서 동작하는 시스템이라면,
같은 toolchain으로 빌드하여, glibc의존성 이슈등을 방지할 수 있다.
(host, target이외에도 glibc같은 c library 종류도 설정할 수 있다.)

windows에서 x86_64 elf 파일을 빌드해 보자.

cygwin 설치전

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
값을 0으로 하고 재부팅한다.
NTFS 파일 시스템의 파일명이 대소문자 구별될 것이다.

cygwin 설치

windows에서 linux 시스템을 이용하려면, windows 10에서는 Windows on ubuntu를 native하게 이용하면 좋겠으나... 아직 windows 7이라서, mingw나 cygwin같은 중간 interpreter 같은 역할이 있어야 한다. 이곳에서는 cygwin을 가지고 설명하고자 한다.

https://www.cygwin.com/에서 다운로드 할 수 있으며,
setup-x86.exe / setup-x86_64.exe 모두 사용할 수 있다.

일단, setup-x86.exe를 선택한다. (cygwin 자체로 daemon을 돌리지 않을 예정이라서, X86/X64 모두 실행 가능한 setup-x86.exe를 선택한다)


와 같이 http://ftp.daum.net을 선택하라.

혹시 경로는,

Root Directory : C:\cygwin.base\cygwin
Local Package Directory : C:\cygwin.base\download

와 같이 하는 것으로 선택하였다.

그럼, ubuntu의 apt-get package같은 package 선택창이 뜬다.

http://www.geekdroppings.com/2014/04/11/using-crosstool-ng-and-cygwin/
을 기반으로 설명하는데, 해당 문서에 있는 package 내용으로 진행한다.

Devel/gperf
Devel/bison
Devel/flex
Devel/patch
Devel/make: The GNU version…
Devel/automake
Devel/libtool
Devel/subversion
Devel/gcc-core
Devel/gcc-g++
Devel/catgets
Web/wget
Libs/libncursesw-devel
Libs/libncurses-devel
Libs/gettext
Libs/libexpat-devel

애매한것이 있다면, 그냥 전체로 설치하라. 즉, "gcc"로 검색해서 나온 항목들에서 어떤것을 깔아야 할 지 모르겠다면, 그냥 다 깔아라.

curses같은 경우, libncurse로 검색되는 것들로 깔아라.

설치가 다 되었다면,
cygwin을 실행한다.

crosstool-ng 설치후 toolchain 만들기

wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.19.0.tar.bz2

을 우선 실행한다.


wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.19.0.tar.bz2
tar xjf crosstool-ng-1.19.0.tar.bz2
cd crosstool-ng-1.19.0
./bootstrap
./configure --prefix=/home/maks/crosstool
 


그런다음, Windows 탐색기에서, C:\cygwin.base\cygwin\home\maks\crosstool\lib\ct-ng.1.19.0\kconfig

kconfig.zip

을 (Makefile, nconf.c) overwrite한다.


make
make install
export PATH="${PATH}:/home/maks/crosstool/bin"
mkdir /usr/include/linux
cp /usr/include/asm/types.h /usr/include/linux
mkdir ~/src
mkdir ~/linux64
cd ~/linux64
ct-ng i686-nptl-linux-gnu
ct-ng menuconfig

을 차례로 실행한다.
그러면, 메뉴로 toolchain의 종류를 선택할 수 있다.
UI 메뉴도 나름 어렵기 때문에, 아래의 미리 만들어진 파일(.config)을,
~/linux64에 overwrite한다. (윈도우 탐색기로 C:\cygwin.base\cygwin\home\<계정명>\linux64)

(아래는 .config 파일 내용)


#
# Automatically generated make config: don't edit
# crosstool-NG 1.19.0 Configuration
# Thu Feb 16 14:25:38 2017
#
CT_CONFIGURE_has_xz=y
CT_CONFIGURE_has_svn=y
CT_MODULES=y

#
# Paths and misc options
#

#
# crosstool-NG behavior
#
# CT_OBSOLETE is not set
CT_EXPERIMENTAL=y
# CT_ALLOW_BUILD_AS_ROOT is not set
CT_DEBUG_CT=y
# CT_DEBUG_PAUSE_STEPS is not set
CT_DEBUG_CT_SAVE_STEPS=y
CT_DEBUG_CT_SAVE_STEPS_GZIP=y
# CT_NO_OVERIDE_LC_MESSAGES is not set
# CT_DEBUG_INTERACTIVE is not set

#
# Paths
#
CT_LOCAL_TARBALLS_DIR="${HOME}/src"
CT_SAVE_TARBALLS=y
CT_CUSTOM_LOCATION_ROOT_DIR=""
CT_WORK_DIR="${CT_TOP_DIR}/.build"
CT_PREFIX_DIR="${HOME}/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_ALL_TOOLCHAIN_EXECUTABLES=y

#
# 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 is not set
CT_LOG_EXTRA=y
# CT_LOG_ALL is not set
# CT_LOG_DEBUG is not set
CT_LOG_LEVEL_MAX="EXTRA"
# 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_blackfin is not set
# CT_ARCH_microblaze is not set
# CT_ARCH_alpha is not set
# CT_ARCH_m68k is not set
# CT_ARCH_s390 is not set
# CT_ARCH_powerpc is not set
# CT_ARCH_sparc is not set
# CT_ARCH_mips is not set
# CT_ARCH_avr32 is not set
# CT_ARCH_sh is not set
CT_ARCH_x86=y
# CT_ARCH_arm is not set
CT_ARCH_blackfin_AVAILABLE=y
CT_ARCH_microblaze_AVAILABLE=y
CT_ARCH_alpha_AVAILABLE=y
CT_ARCH_m68k_AVAILABLE=y
CT_ARCH_s390_AVAILABLE=y
CT_ARCH_powerpc_AVAILABLE=y
CT_ARCH_sparc_AVAILABLE=y
CT_ARCH_mips_AVAILABLE=y
CT_ARCH_avr32_AVAILABLE=y
CT_ARCH_sh_AVAILABLE=y
CT_ARCH_x86_AVAILABLE=y
CT_ARCH_arm_AVAILABLE=y
CT_ARCH_SUFFIX=""

#
# Generic target options
#
# CT_MULTILIB is not set
CT_ARCH_USE_MMU=y

#
# Target optimisations
#
CT_ARCH_FLOAT=""

#
# Toolchain options
#

#
# General toolchain options
#
CT_FORCE_SYSROOT=y
CT_USE_SYSROOT=y
CT_SYSROOT_NAME="sysroot"
CT_SYSROOT_DIR_PREFIX=""
# CT_STATIC_TOOLCHAIN is not set
CT_TOOLCHAIN_PKGVERSION=""
CT_TOOLCHAIN_BUGURL=""

#
# Tuple completion and aliasing
#
CT_TARGET_VENDOR="nptl"
CT_TARGET_ALIAS_SED_EXPR=""
CT_TARGET_ALIAS=""

#
# Toolchain type
#
# CT_NATIVE is not set
CT_CROSS=y
# CT_CROSS_NATIVE is not set
# 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.10.2"
CT_KERNEL_linux=y
# CT_KERNEL_windows is not set
# CT_KERNEL_bare_metal is not set
CT_KERNEL_linux_AVAILABLE=y
CT_KERNEL_V_3_10=y
# CT_KERNEL_V_3_9 is not set
# CT_KERNEL_V_3_8 is not set
# CT_KERNEL_V_3_7 is not set
# CT_KERNEL_V_3_6 is not set
# CT_KERNEL_V_3_5 is not set
# CT_KERNEL_V_3_4 is not set
# CT_KERNEL_V_3_3 is not set
# CT_KERNEL_V_3_2 is not set
# CT_KERNEL_V_3_1 is not set
# CT_KERNEL_V_3_0 is not set
# CT_KERNEL_V_2_6_39 is not set
# CT_KERNEL_V_2_6_38 is not set
# CT_KERNEL_V_2_6_37 is not set
# CT_KERNEL_V_2_6_36 is not set
# CT_KERNEL_V_2_6_33 is not set
# CT_KERNEL_V_2_6_32 is not set
# CT_KERNEL_V_2_6_31 is not set
# CT_KERNEL_V_2_6_27 is not set
# CT_KERNEL_LINUX_CUSTOM is not set
CT_KERNEL_windows_AVAILABLE=y
CT_KERNEL_bare_metal_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_BINUTILS_V_2_23_1 is not set
CT_BINUTILS_V_2_22=y
# 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_CUSTOM is not set
CT_BINUTILS_VERSION="2.22"
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_HAS_PLUGINS=y
CT_BINUTILS_HAS_PKGVERSION_BUGURL=y
CT_BINUTILS_FORCE_LD_BFD=y
CT_BINUTILS_LINKER_LD=y
# 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=y
CT_BINUTILS_FOR_TARGET_IBERTY=y
CT_BINUTILS_FOR_TARGET_BFD=y

#
# binutils other options
#

#
# C compiler
#
CT_CC="gcc"
CT_CC_VERSION="4.8.1"
CT_CC_CORE_PASSES_NEEDED=y
CT_CC_gcc=y
# CT_CC_GCC_SHOW_LINARO is not set
CT_CC_V_4_8_1=y
# CT_CC_V_4_8_0 is not set
# CT_CC_V_4_7_3 is not set
# CT_CC_V_4_7_2 is not set
# CT_CC_V_4_7_1 is not set
# CT_CC_V_4_7_0 is not set
# CT_CC_V_4_6_4 is not set
# CT_CC_V_4_6_3 is not set
# CT_CC_V_4_6_2 is not set
# CT_CC_V_4_6_1 is not set
# CT_CC_V_4_6_0 is not set
# CT_CC_V_4_5_3 is not set
# CT_CC_V_4_5_2 is not set
# CT_CC_V_4_5_1 is not set
# CT_CC_V_4_5_0 is not set
# CT_CC_V_4_4_7 is not set
# CT_CC_V_4_4_6 is not set
# CT_CC_V_4_4_5 is not set
# CT_CC_V_4_4_4 is not set
# CT_CC_V_4_4_3 is not set
# CT_CC_V_4_4_2 is not set
# CT_CC_V_4_4_1 is not set
# CT_CC_V_4_4_0 is not set
# CT_CC_V_4_3_6 is not set
# CT_CC_V_4_3_5 is not set
# CT_CC_V_4_3_4 is not set
# CT_CC_V_4_3_3 is not set
# CT_CC_V_4_3_2 is not set
# CT_CC_V_4_3_1 is not set
# CT_CC_V_4_2_4 is not set
# CT_CC_V_4_2_2 is not set
# CT_CC_CUSTOM 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=y
CT_CC_GCC_4_8_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_LANG_FORTRAN 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

#
# Additional supported languages:
#
CT_CC_LANG_CXX=y
# CT_CC_LANG_JAVA is not set
# CT_CC_LANG_ADA is not set
# CT_CC_LANG_OBJC is not set
# CT_CC_LANG_OBJCXX is not set
CT_CC_LANG_OTHERS=""

#
# gcc other options
#
CT_CC_ENABLE_CXX_FLAGS=""
CT_CC_CORE_EXTRA_CONFIG_ARRAY=""
CT_CC_EXTRA_CONFIG_ARRAY=""
# CT_CC_STATIC_LIBSTDCXX is not set
# 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=""

#
# C-library
#
CT_LIBC="glibc"
CT_LIBC_VERSION="2.17"
# CT_LIBC_eglibc is not set
# CT_LIBC_uClibc is not set
CT_LIBC_glibc=y
CT_LIBC_eglibc_AVAILABLE=y
CT_LIBC_uClibc_AVAILABLE=y
CT_LIBC_newlib_AVAILABLE=y
CT_LIBC_glibc_AVAILABLE=y
CT_LIBC_GLIBC_V_2_17=y
# 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_none_AVAILABLE=y
CT_LIBC_SUPPORT_THREADS_ANY=y
CT_LIBC_SUPPORT_NPTL=y
CT_THREADS="nptl"

#
# Common C library options
#
CT_THREADS_NPTL=y
CT_LIBC_XLDD=y
CT_LIBC_glibc_familly=y
CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY=""
CT_LIBC_GLIBC_CONFIGPARMS=""
CT_LIBC_GLIBC_EXTRA_CFLAGS=""
CT_LIBC_EXTRA_CC_ARGS=""
# CT_LIBC_ENABLE_FORTIFIED_BUILD is not set
# CT_LIBC_DISABLE_VERSIONING is not set
CT_LIBC_OLDEST_ABI=""
CT_LIBC_GLIBC_FORCE_UNWIND=y
# CT_LIBC_GLIBC_USE_PORTS is not set
CT_LIBC_ADDONS_LIST=""
# CT_LIBC_LOCALES is not set
# CT_LIBC_GLIBC_KERNEL_VERSION_NONE is not set
CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS=y
# CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN is not set
CT_LIBC_GLIBC_MIN_KERNEL="3.10.2"

#
# glibc other options
#

#
# Debug facilities
#
# CT_DEBUG_strace is not set
# CT_DEBUG_dmalloc is not set
# CT_DEBUG_duma is not set
# CT_DEBUG_gdb is not set
# CT_DEBUG_ltrace is not set

#
# Companion libraries
#
CT_COMPLIBS_NEEDED=y
CT_GMP_NEEDED=y
CT_MPFR_NEEDED=y
CT_ISL_NEEDED=y
CT_CLOOG_NEEDED=y
CT_MPC_NEEDED=y
CT_COMPLIBS=y
CT_GMP=y
CT_MPFR=y
CT_ISL=y
CT_CLOOG=y
CT_MPC=y
CT_GMP_V_5_1_1=y
# 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_VERSION="5.1.1"
CT_MPFR_V_3_1_2=y
# 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.2"
CT_ISL_V_0_11_1=y
CT_ISL_VERSION="0.11.1"
CT_CLOOG_V_0_18_0=y
CT_CLOOG_VERSION="0.18.0"
CT_CLOOG_0_18_or_later=y
CT_MPC_V_1_0_1=y
# 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.1"

#
# Companion libraries common options
#
# CT_COMPLIBS_CHECK is not set

#
# Companion tools
#

#
# READ HELP before you say 'Y' below !!!
#
CT_COMP_TOOLS=y
CT_COMP_TOOLS_make=y
# CT_COMP_TOOLS_m4 is not set
# CT_COMP_TOOLS_autoconf is not set
# CT_COMP_TOOLS_automake is not set
# CT_COMP_TOOLS_libtool is not set

#
# Test suite
#
# CT_TEST_SUITE_GCC is not set
 


만일, 다른 종류의 toolchain을 만들려고한다면,

되도록 gdb같은 debugging tool은 넣지 마라. cygwin python등에서 오류를 잃으키고, 굳이 Native가 아닌 toolchain을 이용하여 디버깅할 이유는 크게 없다.

위 .config는,
•host : cygwin x86 (즉, gcc가 .exe로 됨)
•target : x86_64 (x86에서 64bit 설정 on)
•c library : glibc 2.17
•linux kernel : 3.10.2 (linux 커널은 linux 유저모드 빌드에서 크게 중요한게 아니다)
•strace, dmalloc, duma, gdb, ltrace등과 같은 debug 모듈은 만들지 않는다. (gdb 과정에서 오류가 발생할 소지가 있음)
로 되어 있다.


이제 마지막으로

ct-ng build


하자. 대략 1~2시간 정도 걸린다.
만일, "error: 'R_X86_64_JUMP_SLOT' undeclared (first use in...)" 관련 오류가 발생할 수 있는데,
발생한다면, 해당 .../arch/../tools/relocs.c에
REL_TYPE(R_X86_64_JUMP_SLOT), => REL_TYPE(R_X86_64_JMP_SLOT),
라 수정하고 다시 ct-ng build를 수행하면 된다.


빌드된 툴체인을 테스트하기 위해 아래의 test.cpp를 이용한다


#include <stdio.h>
int main(void)
{
    printf("hello,world\r\n");
    return 0;
}

그리고 아래를 실행한다.

export PATH="${PATH}:/home/<계정명>/x-tools/x86_64-nptl-linux-gnu/bin" 

즉, 위 경로에 toolchain이 포함되어 있다.
이제 아래와 같이 빌드하자.

x86_64-nptl-linux-gnu-c++ test.cpp --sysroot="/home/<계정명>/x-tools/x86_64-nptl-linux-gnu/x86_64-nptl-linux-gnu/sysroot" 

그럼 a.out이 생긴다.

중요한건 위 sysroot인데, 각 toolchain 내부 경로에는 위와 같은 sysroot가 존재하는데, 위와 같이 설정을 해줘야 한다.
gcc에서 include하는 경로가, native가 아닌 toolchain쪽 이여야 하는데,
(즉, 위 #include <stdio.h>가 local native에 있는 파일이 아닌 toolchain에 있는 glibc의 stdio.h로 연결되어야 한다는 점)
그걸 소스 코드 수정없이 해주는 것이 위 sysroot이다.

cygwin에서는 위 sysroot 옵션 없이도 잘 되 었다.
그래도, 넣어주는것이 좋다.
일단, 빌드된 a.out은 같이 확인된다.

$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.10.2, not stripped