4 ms·
Nested functions are cool, although not supported by clang. However they rely on Trampolines: https://gcc.gnu.org/onlinedocs/gccint/Trampolines.html https://gc
by majke 1y ago
Nested functions are cool, although not supported by clang.
However they rely on Trampolines:
https://gcc.gnu.org/onlinedocs/gccint/Trampolines.html https://gcc.gnu.org/onlinedocs/gccint/Trampolines.html
And trampolines need executable stack:
> The use of trampolines requires an executable stack, which is a security risk. To avoid this problem, GCC also supports another strategy: using descriptors for nested functions. Under this model, taking the address of a nested function results in a pointer to a non-executable function descriptor object. Initializing the static chain from the descriptor is handled at indirect call sites.
So, if I understand it right, instead trampoline on executable stack, the pointer to function and data is pushed into the "descriptor", and then there is an indirect call to this. I guess better than exec stack, but still...
- messe 1y agoThey only need an executable stack when they're not inlined. The always_inline keyword takes care of that here.
- uecker 1y agoThey only need trampolines when they access their local environment and you take their address. Without optimization a trampoline was generated whenever an address was taken, but I recently changed this in the development version of GCC to only do this when needed, so hopefully in the next released version you will not get a trampoline for many more cases. Here, there is no address being taken anyway, so you do not get a trampoline. (and I hope we get a solution without trampolines for the remaining cases as well)