As I understand it, previous ROP-gadget hardening included compiler modifications on system/function call return, trap sleds, and some other stuff that I don't remember. This is on top of the kernel and library relink at every boot (to really make ASLR more potent).
These modifications include a verification that the jump is in the stack, and not at the tail of some function (and the other thing eludes my understanding).
These are some OpenBSD references on ROP hardening:
https://undeadly.org/cgi?action=article;sid=20170622065629
https://www.openbsd.org/papers/rop.pdf
https://www.openbsd.org/papers/asiabsdcon2019-rop-paper.pdf
I think that the most notorious exploit of "Return-Oriented Programming" (ROP-gadget) flaws was Solarwinds; I understand that a ROP exploit sealed their fate. Maybe Windows is doing some of this in their kernel.
"At this point, we noticed that Serv-U.dll and RhinoNET.dll both have ASLR support disabled, making them prime locations for ROP gadgets..."
https://www.microsoft.com/security/blog/2021/09/02/a-deep-di...