commit: d20b5a7065950144775848c1401c4f61a44ecd43
Author: Arfrever Frehtes Taifersar Arahesis <Arfrever <AT> Apache <DOT> Org>
AuthorDate: Wed Jun 14 14:23:15 2017 +0000
Commit: Matthias Maier <tamiko <AT> gentoo <DOT> org>
CommitDate: Fri Jun 16 08:23:13 2017 +0000
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d20b5a70
toolchain-funcs.eclass: Add functions for detection of PIE / SSP in way
compatible with GCC >=6.
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 <AT> gentoo.org>
eclass/toolchain-funcs.eclass | 67 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/eclass/toolchain-funcs.eclass b/eclass/toolchain-funcs.eclass
index a0c359a950b..121db46e62b 100644
--- a/eclass/toolchain-funcs.eclass
+++ b/eclass/toolchain-funcs.eclass
@@ -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: