Skip to content

Add a directive to asm files to manually inject a .note.GNU-stack section when using clang 22#125471

Open
jtschuster wants to merge 3 commits intodotnet:mainfrom
jtschuster:fix/noexecstack-gnu-stack
Open

Add a directive to asm files to manually inject a .note.GNU-stack section when using clang 22#125471
jtschuster wants to merge 3 commits intodotnet:mainfrom
jtschuster:fix/noexecstack-gnu-stack

Conversation

@jtschuster
Copy link
Member

@jtschuster jtschuster commented Mar 12, 2026

This is only needed for ELF output files compiled with clang-22, so the directive is limited to those conditions.

Fixes #125435

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a workaround for clang 22 ELF assembly outputs by explicitly emitting a .note.GNU-stack section (via a shared NO_EXEC_STACK_DIRECTIVE macro) so resulting objects don’t request an executable stack.

Changes:

  • Define NO_EXEC_STACK_DIRECTIVE in CoreCLR PAL and NativeAOT unixasmmacros.inc when building ELF with clang 22+.
  • Append NO_EXEC_STACK_DIRECTIVE to many .S sources across CoreCLR VM/Runtime/PAL/Debug and NativeAOT Runtime assembly files.
  • Add a missing unixasmmacros.inc include to one PAL asm source so the directive macro is available there.

Reviewed changes

Copilot reviewed 162 out of 162 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/coreclr/vm/riscv64/thunktemplates.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/riscv64/pinvokestubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/riscv64/calldescrworkerriscv64.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/riscv64/asmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/riscv64/AllocSlow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/loongarch64/thunktemplates.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/loongarch64/pinvokestubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/loongarch64/calldescrworkerloongarch64.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/loongarch64/asmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/loongarch64/AllocSlow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/umthunkstub.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/thunktemplates.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/pinvokestubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/jithelp.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/ehhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/asmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/i386/AllocSlow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/thunktemplates.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/pinvokestubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/patchedcode.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/calldescrworkerarm64.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/asmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/StubPrecodeDynamicHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/CachedInterfaceDispatchCoreCLR.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm64/AllocSlow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm/thunktemplates.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm/pinvokestubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm/patchedcode.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm/ehhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm/asmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/arm/AllocSlow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/virtualcallstubamd64.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/unixasmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/umthunkstub.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/thunktemplates.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/theprestubamd64.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/redirectedhandledjitcase.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/pinvokestubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/patchedcode.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/jithelpers_slow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/jithelpers_singleappdomain.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/jithelpers_fastwritebarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/jithelpers_fast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/getstate.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/externalmethodfixupthunk.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/calldescrworkeramd64.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/asmhelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/StubPrecodeDynamicHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/Context.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/CachedInterfaceDispatchCoreCLR.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/vm/amd64/AllocSlow.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/riscv64/WriteBarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/riscv64/StubDispatch.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/riscv64/AllocFast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/loongarch64/WriteBarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/loongarch64/StubDispatch.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/loongarch64/AllocFast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/i386/WriteBarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/i386/StubDispatch.S Add NO_EXEC_STACK_DIRECTIVE (but currently missing required include).
src/coreclr/runtime/i386/AllocFast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/arm64/WriteBarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/arm64/StubDispatch.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/arm64/AllocFast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/arm/WriteBarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/arm/StubDispatch.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/arm/AllocFast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/amd64/WriteBarriers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/amd64/StubDispatch.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/runtime/amd64/AllocFast.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/s390x/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/s390x/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/s390x/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/s390x/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/riscv64/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/riscv64/dispatchexceptionwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/riscv64/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/riscv64/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/riscv64/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/ppc64le/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/ppc64le/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/ppc64le/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/ppc64le/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/loongarch64/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/loongarch64/dispatchexceptionwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/loongarch64/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/loongarch64/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/loongarch64/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/loongarch64/activationhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/i386/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/i386/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/i386/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/i386/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/dispatchexceptionwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/context.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm64/activationhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/arm/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/exceptionhelper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/dispatchexceptionwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/debugbreak.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/context2.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/context.S Include unixasmmacros.inc and append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/callsignalhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/src/arch/amd64/activationhandlerwrapper.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/pal/inc/unixasmmacros.inc Define NO_EXEC_STACK_DIRECTIVE for ELF+clang (22+).
src/coreclr/nativeaot/Runtime/unix/unixasmmacros.inc Define NO_EXEC_STACK_DIRECTIVE for ELF+clang (22+).
src/coreclr/nativeaot/Runtime/riscv64/UniversalTransition.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/riscv64/PInvoke.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/riscv64/MiscStubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/riscv64/InteropThunksHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/riscv64/GcProbe.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/riscv64/ExceptionHandling.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/loongarch64/UniversalTransition.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/loongarch64/PInvoke.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/loongarch64/MiscStubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/loongarch64/InteropThunksHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/loongarch64/GcProbe.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/loongarch64/ExceptionHandling.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/i386/MiscStubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/UniversalTransition.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/ThunkPoolThunks.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/PInvoke.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/MiscStubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/InteropThunksHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/GcProbe.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/ExceptionHandling.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm64/CachedInterfaceDispatchAot.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm/UniversalTransition.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm/PInvoke.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm/MiscStubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm/InteropThunksHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm/GcProbe.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/arm/ExceptionHandling.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/UniversalTransition.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/ThunkPoolThunks.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/PInvoke.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/MiscStubs.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/InteropThunksHelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/GcProbe.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/ExceptionHandling.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/nativeaot/Runtime/amd64/CachedInterfaceDispatchAot.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/dlls/mscordac/palredefines.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/dlls/mscordac/libredefines.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/s390x/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/riscv64/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/ppc64le/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/loongarch64/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/i386/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/arm64/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/arm/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/ee/amd64/dbghelpers.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/di/riscv64/floatconversion.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/di/loongarch64/floatconversion.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/di/arm64/floatconversion.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/di/arm/floatconversion.S Append NO_EXEC_STACK_DIRECTIVE.
src/coreclr/debug/di/amd64/floatconversion.S Append NO_EXEC_STACK_DIRECTIVE.

jtschuster and others added 2 commits March 12, 2026 09:49
… directive

Instead of defining a NO_EXEC_STACK_DIRECTIVE macro and requiring every .S
file to invoke it, emit the .note.GNU-stack section directly in the two
unixasmmacros.inc files using .pushsection/.popsection. This removes the
boilerplate from ~160 .S files and ensures any new .S file that includes
unixasmmacros.inc automatically gets the section.

Also adds a missing #include "unixasmmacros.inc" to context.S which was
the only .S file that didn't already include it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Include unixasmmacros.inc (or AsmMacros_Shared.h) in the 5 empty
i386 stub .S files that previously had no includes. Without this,
these files would produce .o files missing .note.GNU-stack when
compiled with clang 22+.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

[11.0-preview.2] Native AoT compilation fails on Linux

4 participants