toolchain-funcs.eclass: Add functions for detection of PIE / SSP in way compatible...
authorArfrever Frehtes Taifersar Arahesis <Arfrever@Apache.Org>
Wed, 14 Jun 2017 14:23:15 +0000 (16:23 +0200)
committerMatthias Maier <tamiko@gentoo.org>
Fri, 16 Jun 2017 08:23:13 +0000 (03:23 -0500)
Newly added tc-enables-pie(), tc-enables-ssp(), tc-enables-ssp-strong()
and tc-enables-ssp-all() check macros instead of specs.
This solution also works with older GCC and with Clang.

Signed-off-by: Matthias Maier <tamiko@gentoo.org>
eclass/toolchain-funcs.eclass

index a0c359a950b241a3313e353982c3d4321090e8f5..121db46e62b526bfef06b316663d4f758982c861 100644 (file)
@@ -792,6 +792,73 @@ gcc-specs-stack-check() {
 }
 
 
+# @FUNCTION: tc-enables-pie
+# @RETURN: Truth if the current compiler generates position-independent code (PIC) which can be linked into executables
+# @DESCRIPTION:
+# Return truth if the current compiler generates position-independent code (PIC)
+# which can be linked into executables.
+tc-enables-pie() {
+       local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null
+               #if defined(__PIE__)
+               true
+               #endif
+               EOF
+       )"
+       [[ ${ret} == true ]]
+}
+
+# @FUNCTION: tc-enables-ssp
+# @RETURN: Truth if the current compiler enables stack smashing protection (SSP) on at least minimal level
+# @DESCRIPTION:
+# Return truth if the current compiler enables stack smashing protection (SSP)
+# on level corresponding to any of the following options:
+#  -fstack-protector
+#  -fstack-protector-strong
+#  -fstack-protector-all
+tc-enables-ssp() {
+       local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null
+               #if defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)
+               true
+               #endif
+               EOF
+       )"
+       [[ ${ret} == true ]]
+}
+
+# @FUNCTION: tc-enables-ssp-strong
+# @RETURN: Truth if the current compiler enables stack smashing protection (SSP) on at least middle level
+# @DESCRIPTION:
+# Return truth if the current compiler enables stack smashing protection (SSP)
+# on level corresponding to any of the following options:
+#  -fstack-protector-strong
+#  -fstack-protector-all
+tc-enables-ssp-strong() {
+       local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null
+               #if defined(__SSP_STRONG__) || defined(__SSP_ALL__)
+               true
+               #endif
+               EOF
+       )"
+       [[ ${ret} == true ]]
+}
+
+# @FUNCTION: tc-enables-ssp-all
+# @RETURN: Truth if the current compiler enables stack smashing protection (SSP) on maximal level
+# @DESCRIPTION:
+# Return truth if the current compiler enables stack smashing protection (SSP)
+# on level corresponding to any of the following options:
+#  -fstack-protector-all
+tc-enables-ssp-all() {
+       local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null
+               #if defined(__SSP_ALL__)
+               true
+               #endif
+               EOF
+       )"
+       [[ ${ret} == true ]]
+}
+
+
 # @FUNCTION: gen_usr_ldscript
 # @USAGE: [-a] <list of libs to create linker scripts for>
 # @DESCRIPTION: