On 10/12/14 15:55, Anthony G. Basile wrote:
On 10/12/14 15:46, Ulrich Mueller wrote:
On Sun, 12 Oct 2014, Dan Douglas wrote:
On Sun, Oct 12, 2014 at 11:22 AM, Anthony G. Basile
<[email protected]> wrote:
+# Returns true if gcc builds with fstack-check
+gcc-specs-stack-check() {
+ local directive
+ directive=$(gcc-specs-directive cc1)
+ return $([[ "${directive/\{!fno-stack-check:}" !=
"${directive}" ]])
+}
Am I missing something here? I don't see how any of the tests used
in gcc-specs-* functions could possibly produce an output. The fact
that this coincidentally works in Bash shouldn't be relied upon.
The command produces no output, so return is effectively called
without argument. Therefore it will return with the status of the last
command executed, which is [[ ]] ...
It would be clearer if the last line of the function was simply this:
[[ "${directive/\{!fno-stack-check:}" != "${directive}" ]]
Ulrich
Yeah the return there is useless and in fact deceiving. Its returning
a blank with an error code. Here's some bash to illustrate:
do_true() {
return $([[ 42 == 42 ]])
}
do_false() {
return $([[ 42 != 42 ]])
}
do_true # echo's nothing
do_false # echo's nothing
do_true ; echo $?
0
do_false ; echo $?
1
I can fix my function as well as the other gcc-specs-* in there, which
I just copied. I'll produce two patches for the community's approval
before committing anything. However, we'd better grep the tree for
those gcc-specs-* functions just in case something subtle is going on.
Okay, I grepped the tree and there's nothing subtle that I can see. So
what I'll commit is the following:
1) First I'll clean up
--- toolchain-funcs.eclass.orig 2014-10-12 11:23:41.585182742 -0400
+++ toolchain-funcs.eclass 2014-10-12 17:19:30.086154455 -0400
@@ -169,7 +169,7 @@
# @FUNCTION: tc-is-cross-compiler
# @RETURN: Shell true if we are using a cross-compiler, shell false
otherwise
tc-is-cross-compiler() {
- return $([[ ${CBUILD:-${CHOST}} != ${CHOST} ]])
+ [[ ${CBUILD:-${CHOST}} != ${CHOST} ]]
}
# @FUNCTION: tc-is-softfloat
@@ -210,7 +210,7 @@
local host=${CTARGET:-${CHOST}}
# *MiNT doesn't have shared libraries, only platform so far
- return $([[ ${host} == *-mint* ]])
+ [[ ${host} == *-mint* ]]
}
# @FUNCTION: tc-export_build_env
@@ -578,37 +578,37 @@
gcc-specs-relro() {
local directive
directive=$(gcc-specs-directive link_command)
- return $([[ "${directive/\{!norelro:}" != "${directive}" ]])
+ [[ "${directive/\{!norelro:}" != "${directive}" ]]
}
# Returns true if gcc sets now
gcc-specs-now() {
local directive
directive=$(gcc-specs-directive link_command)
- return $([[ "${directive/\{!nonow:}" != "${directive}" ]])
+ [[ "${directive/\{!nonow:}" != "${directive}" ]]
}
# Returns true if gcc builds PIEs
gcc-specs-pie() {
local directive
directive=$(gcc-specs-directive cc1)
- return $([[ "${directive/\{!nopie:}" != "${directive}" ]])
+ [[ "${directive/\{!nopie:}" != "${directive}" ]]
}
# Returns true if gcc builds with the stack protector
gcc-specs-ssp() {
local directive
directive=$(gcc-specs-directive cc1)
- return $([[ "${directive/\{!fno-stack-protector:}" !=
"${directive}" ]])
+ [[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]]
}
# Returns true if gcc upgrades fstack-protector to fstack-protector-all
gcc-specs-ssp-to-all() {
local directive
directive=$(gcc-specs-directive cc1)
- return $([[ "${directive/\{!fno-stack-protector-all:}" !=
"${directive}" ]])
+ [[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]]
}
# Returns true if gcc builds with fno-strict-overflow
gcc-specs-nostrict() {
local directive
directive=$(gcc-specs-directive cc1)
- return $([[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]])
+ [[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]]
}
2) Then I'll add gcc-specs-stack-check()
--- toolchain-funcs.eclass 2014-10-12 17:19:30.086154455 -0400
+++ /root/toolchain-funcs.eclass 2014-10-12 17:19:05.983153358 -0400
@@ -610,6 +610,12 @@
directive=$(gcc-specs-directive cc1)
[[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]]
}
+# Returns true if gcc builds with fstack-check
+gcc-specs-stack-check() {
+ local directive
+ directive=$(gcc-specs-directive cc1)
+ [[ "${directive/\{!fno-stack-check:}" != "${directive}" ]]
+}
# @FUNCTION: gen_usr_ldscript
--
Anthony G. Basile, Ph.D.
Gentoo Linux Developer [Hardened]
E-Mail : [email protected]
GnuPG FP : 1FED FAD9 D82C 52A5 3BAB DC79 9384 FA6E F52D 4BBA
GnuPG ID : F52D4BBA