smithp35 wrote:

I have some small reservations about using ifunc resolvers like this. Mostly in 
that we are using a mechanism invented for a different purpose, and relying on 
some specific linker behaviour to make this case work.

This is similar to comments made in the Discourse post 
https://discourse.llvm.org/t/rfc-structure-protection-a-family-of-uaf-mitigation-techniques/85555/9
 but repeating them here as this is closest to the implementation.

As I understand it, this has a more limited and more specific use case than 
ifuncs. Traditional ifuncs which can be address taken or called, possibly in 
multiple ways, so it makes sense to use a symbol type STT_GNU_IFUNC rather than 
special relocation directives. The initializers for structure field protection 
are compiler generated, can not be legally called or address taken from user 
code, and only have one relocation type R_*_ABS64 (or 32 on a 32-bit platform). 
With an addition of a single relocation, something like R_*_ADDRINIT64 which 
would target a STT_FUNC resolver symbol. We can isolate the structure field 
initialization use case from an actual ifunc.

I guess it all comes down to whether structure field initialization needs, or 
benefits from being distinguished from an ifunc. Ifuncs seem to be quite easy 
to get wrong so being able to isolate this case has some attraction to me at 
least. It also handles the structure field that points to an ifunc relatively 
gracefully.

As you pointed out in your response, this does mean adding 2 relocations to 
every psABI that supports structure field protection rather than just one. 
Although I'd expect the alternative of having relocations that alternatively 
write "directly call" ifunc resolver or take address of function might require 
new relocations too?

https://github.com/llvm/llvm-project/pull/133531
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to