@@ -146,6 +146,13 @@
You shouldn't need to enter anything here, unless you plan to manually
call the tools (autotools-based ./configure will use the standard name).
+config TARGET_PIE
+ bool
+ prompt "Enable PIE"
+ default n
+ help
+ Enable this if target exepects PIC/PIE enabled.
+
comment "Toolchain type"
choice
@@ -245,6 +252,13 @@
for that by checking the tools without the suffix in case it can
not find some of the tool.
+config BUILD_PIE
+ bool
+ default n
+ prompt "| Enforce PIC/PIE support"
+ help
+ Check this if *build system* expects to have PIC/PIE enabled.
+
if CANADIAN
comment "Host system"
@@ -299,6 +313,13 @@
for that by checking the tools without the suffix in case it can
not find some of the tool.
+config HOST_PIE
+ bool
+ default n
+ prompt "| Enforce PIC/PIE support"
+ help
+ Check this if *host system* expects to have PIC/PIE enabled.
+
endif # CANADIAN
comment "Misc options"
@@ -39,6 +39,11 @@
CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java \
ftp://sourceware.org/pub/java
fi
+
+ if [ "${CT_TARGET_PIE}" = "y" ]; then
+ CT_GetFile "gcc-4.7.1-piepatches-v0.5.3" \
+ http://distfiles.gentoo.org/distfiles/
+ fi
}
# Extract gcc
@@ -58,6 +63,17 @@
]; then
CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"
fi
+
+ if [ "${CT_TARGET_PIE}" = "y" ]; then
+ CT_Extract "gcc-4.7.1-piepatches-v0.5.3"
+ cd "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/"
+ for p in "${CT_SRC_DIR}"/gcc-4.7.1-piepatches-v0.5.3/*.patch; do
+ CT_DoExecLog ALL \
+ patch --no-backup-if-mismatch -f -p0 -i "${p}" ||
+ patch --no-backup-if-mismatch -f -p1 -i "${p}" ||
+ return 1
+ done
+ fi
}
#------------------------------------------------------------------------------
@@ -592,6 +608,7 @@
local prefix
local complibs
local cflags
+ local piecflags
local ldflags
local lang_list
local build_manuals
@@ -793,6 +810,8 @@
esac
[ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
+ [ "${CT_TARGET_PIE}" = "y" ] && extra_config+=("--enable-esp")
+ [ "${CT_TARGET_PIE}" = "y" ] && piecflags="-DEFAULT_PIE_SSP -DEFAULT_RELRO -DEFAULT_BIND_NOW"
if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
extra_config+=("--with-system-zlib")
@@ -808,7 +827,7 @@
CT_DoExecLog CFG \
CC_FOR_BUILD="${CT_BUILD}-gcc" \
- CFLAGS="${cflags}" \
+ CFLAGS="${cflags} ${piecflags}" \
LDFLAGS="${final_LDFLAGS[*]}" \
CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
@@ -39,6 +39,7 @@
gmp_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
gmp_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
gmp_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
+ gmp_opts+=( "pie=${CT_BUILD_PIE}" )
do_gmp_backend "${gmp_opts[@]}"
CT_Popd
@@ -56,6 +57,7 @@
gmp_opts+=( "prefix=${CT_HOST_COMPLIBS_DIR}" )
gmp_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
gmp_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
+ gmp_opts+=( "pie=${CT_HOST_PIE}" )
do_gmp_backend "${gmp_opts[@]}"
CT_Popd
@@ -68,12 +70,15 @@
# prefix : prefix to install into : dir : (none)
# cflags : cflags to use : string : (empty)
# ldflags : ldflags to use : string : (empty)
+# pie : enable pic/pie : string : (empty)
do_gmp_backend() {
local host
local prefix
local cflags
local ldflags
+ local pie
local arg
+ local confopts
for arg in "$@"; do
eval "${arg// /\\ }"
@@ -81,6 +86,8 @@
CT_DoLog EXTRA "Configuring GMP"
+ [ "$pie" = "y" ] && confopts="$confopts --with-pic"
+
CT_DoExecLog CFG \
CFLAGS="${cflags} -fexceptions" \
LDFLAGS="${ldflags}" \
@@ -88,6 +95,7 @@
--build=${CT_BUILD} \
--host=${host} \
--prefix="${prefix}" \
+ $confopts \
--enable-fft \
--enable-mpbsd \
--enable-cxx \
@@ -360,6 +360,7 @@
cross)
# A cross-compiler runs on the same machine it is built on
CT_HOST="${CT_BUILD}"
+ CT_HOST_PIE="${CT_BUILD_PIE}"
build_mangle="build_"
host_mangle="build_"
target_mangle=""