| <!--===- docs/FAQ.md |
| |
| Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| See https://llvm.org/LICENSE.txt for license information. |
| SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| --> |
| |
| # Frequently Asked Questions (FAQ) |
| |
| ```{contents} |
| --- |
| local: |
| --- |
| ``` |
| |
| ## Driver |
| |
| ### Why do I get a warning or an error about an executable stack? |
| |
| This occurs because Flang's implementation of pointers to internal procedures requires an executable stack. |
| |
| An internal procedure has a "host scope", which is the scope in which it is contained. |
| It can access variables defined in that host scope. |
| When an internal procedure is referenced from outside its host scope (for example, via a procedure pointer), the implementation must ensure that it can still access variables from the host scope. |
| To achieve this, the current implementation of Flang generates a small piece of code, called a "trampoline", on the stack. |
| When the procedure is called, this trampoline is executed. |
| The trampoline is on the stack, so the stack itself must be executable. |
| For a more detailed explanation of trampolines, please refer to the [design document](InternalProcedureTrampolines.md). |
| |
| An executable stack increases the risk and impact of certain classes of security vulnerabilities, such as [stack buffer overflows](https://llsoftsec.github.io/llsoftsecbook/#stack-buffer-overflows). |
| Therefore, modern linkers often issue a warning or an error if an executable stack is not explicitly requested by the developer. |
| For instance, the GNU Linker (`ld`) issues a warning while the LLVM Linker (`lld`) emits an error. |
| |
| ```{note} |
| The trampoline code generated by Flang is not itself a security risk. |
| The risk comes from the possibility of executing malicious code that an attacker has placed on the stack. |
| You should determine whether such risks are appropriate for your software. |
| ``` |
| |
| When you use the Flang driver (the `flang` command) to generate executables, you can instruct the linker to enable an executable stack with the `-Wl,-z,execstack` or `-Xlinker -zexecstack` flag. |
| |
| ```console |
| $ flang src.f90 -fuse-ld=ld |
| /path/to/ld: warning: src.o: requires executable stack (because the .note.GNU-stack section is executable) |
| $ flang src.f90 -fuse-ld=ld -Wl,-z,execstack |
| |
| $ flang src.f90 -fuse-ld=lld |
| ld.lld: error: src.o: requires an executable stack, but -z execstack is not specified |
| flang-22: error: linker command failed with exit code 1 (use -v to see invocation) |
| $ flang src.f90 -fuse-ld=lld -Wl,-z,execstack |
| ``` |