From 1d119f24f9eb4c65d944fbdb0ab2d737f3eaa001 Mon Sep 17 00:00:00 2001 From: Ross Burton Date: Fri, 4 Apr 2025 18:34:45 +0100 Subject: [PATCH] arm/fvp-base-a-aem: remove spurious executable stack from one library There are some objects in the FVP binary that are assembler source and fail to declare what permissions the stack needs to have, so GCC falls back to assuming that the final binary needs an executable stack. glibc 2.41 (as now used in uninative) introduces changes here[1]: whether to have an executable stack or not when the binary doesn't specify a need (defaults to executable, but this is a tunable), and any binaries that are dlopen()ed that require an executable stack will fail. Thus, some FVPs on some platforms (notable, fvp-base-a-aem on x86-64) now fail on startup: libarmctmodel.so: cannot enable executable stack as shared object requires: Invalid argument Luckily the solution here is to simply clear the executable bit, as an executable stack is not actually needed. Until a new release of the FVP is made we can fix the binary in our package using execstack. [1] https://lists.gnu.org/archive/html/info-gnu/2025-01/msg00014.html Signed-off-by: Ross Burton Signed-off-by: Jon Mason --- .../fvp/fvp-base-a-aem_11.28.23.bb | 3 +++ .../recipes-devtools/fvp/remove-execstack.inc | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 meta-arm/recipes-devtools/fvp/remove-execstack.inc diff --git a/meta-arm/recipes-devtools/fvp/fvp-base-a-aem_11.28.23.bb b/meta-arm/recipes-devtools/fvp/fvp-base-a-aem_11.28.23.bb index f411276b..45fd21fe 100644 --- a/meta-arm/recipes-devtools/fvp/fvp-base-a-aem_11.28.23.bb +++ b/meta-arm/recipes-devtools/fvp/fvp-base-a-aem_11.28.23.bb @@ -17,3 +17,6 @@ UPSTREAM_VERSION_UNKNOWN = "1" MODEL_CODE = "FVP_Base_RevC-2xAEMvA" COMPATIBLE_HOST = "(aarch64|x86_64).*-linux" + +require remove-execstack.inc +REMOVE_EXECSTACKS:x86-64 = "${FVPDIR}/models/${FVP_ARCH_DIR}*/libarmctmodel.so" diff --git a/meta-arm/recipes-devtools/fvp/remove-execstack.inc b/meta-arm/recipes-devtools/fvp/remove-execstack.inc new file mode 100644 index 00000000..7f02b502 --- /dev/null +++ b/meta-arm/recipes-devtools/fvp/remove-execstack.inc @@ -0,0 +1,26 @@ +# Clear the executable stack flag on named shared libraries. This are typically +# not needed, and glibc 2.41 will refuse to dlopen() a library that expects +# an executable stack. +# +# The stack permissions can be checked with readelf -lW <.so> | grep GNU_STACK. +# RW is read/write, RWE is read/write/execute. + +DEPENDS += "execstack-native" + +REMOVE_EXECSTACKS ?= "" + +do_install:append() { + for SO in ${REMOVE_EXECSTACKS}; do + NAME=$(basename $SO) + SO=${D}$SO + + test -f $SO || bbfatal remove-execstack: cannot find $SO + + if execstack --query $SO | grep -q ^X; then + bbnote "Stripping executable stack bit on $NAME" + execstack --clear-execstack $SO + else + bbwarn "Executable stack stripping no longer required for $NAME, remove" + fi + done +}