From 46af98aa4327633d1509d728b3b85e0a4da39c9b Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Tue, 25 Mar 2014 12:05:56 +0100 Subject: add support for x86_64 toolchain with 32 bit abi --- mk/build.mk | 4 +- mk/image.mk | 2 + target/config/Config.in | 1 + target/tarch.lst | 2 + target/x86_64/sys-available/toolchain-x86_64_32 | 12 ++++++ target/x86_64/sys-available/toolchain-x86_64_x32 | 12 ++++++ toolchain/binutils/Makefile | 2 +- toolchain/gcc/Makefile | 4 +- toolchain/gcc/patches/4.8.2/abi32.patch | 54 ++++++++++++++++++++++++ toolchain/glibc/Makefile.inc | 2 +- 10 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 target/x86_64/sys-available/toolchain-x86_64_32 create mode 100644 target/x86_64/sys-available/toolchain-x86_64_x32 create mode 100644 toolchain/gcc/patches/4.8.2/abi32.patch diff --git a/mk/build.mk b/mk/build.mk index c63770150..7e640b295 100644 --- a/mk/build.mk +++ b/mk/build.mk @@ -476,8 +476,8 @@ bulktoolchain: mkdir -p ${TOPDIR}/firmware; \ ( \ echo === building $$arch $$libc toolchain-$$arch on $$(date); \ - tarch=$$(echo $$arch|sed -e "s#el##" -e "s#eb##" -e "s#mips64.*#mips#" -e "s#hf##"); \ - carch=$$(echo $$arch|sed -e "s#sh#sh4#" -e "s#hf##" -e "s#mips64n.*#mips64#" -e "s#mips64el.*#mips64el#" ); \ + tarch=$$(echo $$arch|sed -e "s#el##" -e "s#eb##" -e "s#mips64.*#mips#" -e "s#hf##" -e "s#x86_64.*#x86_64#" ); \ + carch=$$(echo $$arch|sed -e "s#sh#sh4#" -e "s#hf##" -e "s#mips64n.*#mips64#" -e "s#mips64el.*#mips64el#" -e "s#x86_64.*#x86_64#" ); \ $(GMAKE) prereq && \ $(GMAKE) ARCH=$$tarch SYSTEM=toolchain-$$arch LIBC=$$libc defconfig; \ tabi=$$(grep ^ADK_TARGET_ABI= .config|cut -d \" -f 2);\ diff --git a/mk/image.mk b/mk/image.mk index 1e7a802a5..b607249cd 100644 --- a/mk/image.mk +++ b/mk/image.mk @@ -51,6 +51,7 @@ image-prepare-post: -rm -f ${TARGET_DIR}/bin/sh ln -sf ${BINSH} ${TARGET_DIR}/bin/sh ifeq ($(ADK_LINUX_X86_64),y) +ifeq ($(ADK_TARGET_ABI_32),) # fixup lib dirs mv ${TARGET_DIR}/lib/* ${TARGET_DIR}/${ADK_TARGET_LIBC_PATH} rm -rf ${TARGET_DIR}/lib/ @@ -60,6 +61,7 @@ ifeq ($(ADK_LINUX_X86_64),y) rm -rf ${TARGET_DIR}/usr/lib/ (cd ${TARGET_DIR}/usr ; ln -sf ${ADK_TARGET_LIBC_PATH} lib) endif +endif ifeq ($(ADK_LINUX_PPC64),y) # fixup lib dirs mv ${TARGET_DIR}/lib/* ${TARGET_DIR}/${ADK_TARGET_LIBC_PATH} diff --git a/target/config/Config.in b/target/config/Config.in index 84f19adec..4586de17b 100644 --- a/target/config/Config.in +++ b/target/config/Config.in @@ -175,6 +175,7 @@ endchoice config ADK_TARGET_LIBC_PATH string + default "lib" if ADK_32 default "lib32" if ADK_n32 default "libx32" if ADK_x32 default "lib64" if ADK_n64 \ diff --git a/target/tarch.lst b/target/tarch.lst index 13c578c04..7e9014a37 100644 --- a/target/tarch.lst +++ b/target/tarch.lst @@ -18,3 +18,5 @@ sparc sparc64 x86 x86_64 ++x86_64_32 ++x86_64_x32 diff --git a/target/x86_64/sys-available/toolchain-x86_64_32 b/target/x86_64/sys-available/toolchain-x86_64_32 new file mode 100644 index 000000000..501c31050 --- /dev/null +++ b/target/x86_64/sys-available/toolchain-x86_64_32 @@ -0,0 +1,12 @@ +config ADK_TARGET_SYSTEM_TOOLCHAIN_X86_64_32 + bool "Toolchain only (32 ABI)" + select ADK_x86_64 + select ADK_32 + select ADK_toolchain_x86_64 + select ADK_CPU_X86_64 + select ADK_LINUX_64 + select ADK_TOOLCHAIN + select ADK_TARGET_PACKAGE_TGZ + help + Build a x86_64 toolchain. + diff --git a/target/x86_64/sys-available/toolchain-x86_64_x32 b/target/x86_64/sys-available/toolchain-x86_64_x32 new file mode 100644 index 000000000..090d474b6 --- /dev/null +++ b/target/x86_64/sys-available/toolchain-x86_64_x32 @@ -0,0 +1,12 @@ +config ADK_TARGET_SYSTEM_TOOLCHAIN_X86_64_X32 + bool "Toolchain only (x32 ABI)" + select ADK_x86_64 + select ADK_x32 + select ADK_toolchain_x86_64 + select ADK_CPU_X86_64 + select ADK_LINUX_64 + select ADK_TOOLCHAIN + select ADK_TARGET_PACKAGE_TGZ + help + Build a x86_64 toolchain. + diff --git a/toolchain/binutils/Makefile b/toolchain/binutils/Makefile index 6490c19aa..4d34e3566 100644 --- a/toolchain/binutils/Makefile +++ b/toolchain/binutils/Makefile @@ -16,7 +16,7 @@ ifeq ($(ADK_TARGET_SYSTEM_RASPBERRY_PI),y) CONFOPTS+= --with-arch=armv6 endif -ifneq ($(strip $(ADK_LINUX_64)$(ADK_TARGET_KERNEL64)),) +ifneq ($(ADK_LINUX_64),) CONFOPTS+= --enable-64-bit-bfd endif diff --git a/toolchain/gcc/Makefile b/toolchain/gcc/Makefile index 5595f82dd..611de97bf 100644 --- a/toolchain/gcc/Makefile +++ b/toolchain/gcc/Makefile @@ -45,10 +45,10 @@ endif ifeq ($(ADK_LINUX_X86_64),y) ifeq ($(ADK_x32),y) -GCC_FINAL_CONFOPTS+= --enable-multilib --with-multilib-list=mx32 +GCC_FINAL_CONFOPTS+= --with-abi=x32 endif ifeq ($(ADK_32),y) -GCC_FINAL_CONFOPTS+= --enable-multilib --with-multilib-list=m32 +GCC_FINAL_CONFOPTS+= --with-abi=32 endif ifeq ($(ADK_64),y) GCC_FINAL_CONFOPTS+= --disable-biarch --disable-multilib diff --git a/toolchain/gcc/patches/4.8.2/abi32.patch b/toolchain/gcc/patches/4.8.2/abi32.patch new file mode 100644 index 000000000..856d608bd --- /dev/null +++ b/toolchain/gcc/patches/4.8.2/abi32.patch @@ -0,0 +1,54 @@ +diff -Nur gcc-4.8.2.orig/gcc/config/i386/biarch32.h gcc-4.8.2/gcc/config/i386/biarch32.h +--- gcc-4.8.2.orig/gcc/config/i386/biarch32.h 1970-01-01 01:00:00.000000000 +0100 ++++ gcc-4.8.2/gcc/config/i386/biarch32.h 2014-03-23 20:33:52.000000000 +0100 +@@ -0,0 +1,27 @@ ++/* Make configure files to produce biarch compiler defaulting to 32bit mode. ++ This file must be included very first, while the OS specific file later ++ to overwrite otherwise wrong defaults. ++ Copyright (C) 2001-2014 Free Software Foundation, Inc. ++ ++This file is part of GCC. ++ ++GCC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 3, or (at your option) ++any later version. ++ ++GCC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++Under Section 7 of GPL version 3, you are granted additional ++permissions described in the GCC Runtime Library Exception, version ++3.1, as published by the Free Software Foundation. ++ ++You should have received a copy of the GNU General Public License and ++a copy of the GCC Runtime Library Exception along with this program; ++see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ++. */ ++ ++#define TARGET_64BIT_DEFAULT 0 +diff -Nur gcc-4.8.2.orig/gcc/config.gcc gcc-4.8.2/gcc/config.gcc +--- gcc-4.8.2.orig/gcc/config.gcc 2013-10-03 02:47:24.000000000 +0200 ++++ gcc-4.8.2/gcc/config.gcc 2014-03-22 13:15:18.000000000 +0100 +@@ -522,6 +522,9 @@ + 64 | m64) + tm_file="i386/biarch64.h ${tm_file}" + ;; ++ 32 | m32) ++ tm_file="i386/biarch32.h ${tm_file}" ++ ;; + x32 | mx32) + tm_file="i386/biarchx32.h ${tm_file}" + ;; +@@ -1343,6 +1346,9 @@ + x32 | mx32) + x86_multilibs="mx32" + ;; ++ 32 | m32) ++ x86_multilibs="m32" ++ ;; + *) + x86_multilibs="m64,m32" + ;; diff --git a/toolchain/glibc/Makefile.inc b/toolchain/glibc/Makefile.inc index 6671f1e2d..3a9f24e33 100644 --- a/toolchain/glibc/Makefile.inc +++ b/toolchain/glibc/Makefile.inc @@ -6,7 +6,7 @@ PKG_VERSION:= 2.19 PKG_RELEASE:= 1 PKG_MD5SUM:= 5374d29864b583622b62bfc6b8429418 PKG_SITES:= ${MASTER_SITE_GNU:=glibc/} -ifeq ($(ADK_TARGET_ABI_32),y) +ifeq ($(ADK_32),y) GLIBC_TARGET_NAME:= i686-openadk-linux-gnu else GLIBC_TARGET_NAME:= $(GNU_TARGET_NAME) -- cgit v1.2.3