[cfe-dev] Implementing linux randstruct plugin for clang?

Friedman, Eli via cfe-dev cfe-dev at lists.llvm.org
Fri Sep 22 14:38:02 PDT 2017


On 9/22/2017 1:28 PM, Hal Finkel wrote:
>
> On 09/22/2017 02:05 PM, Friedman, Eli via cfe-dev wrote:
>> On 9/22/2017 8:49 AM, Vlad Tsyrklevich wrote:
>>> I thought a little about implementing PAX_RANDSTRUCT for clang a 
>>> couple months back but I didn't get to the point where I implemented 
>>> anything. My notes indicate that my two ideas at the time I left it 
>>> were: (1) see if there's a point between parsing and codegen that a 
>>> clang plugin could insert a TreeTransform to rewrite struct 
>>> definitions, or (2) perform randomization as an LLVM pass that 
>>> rewrites types and the GEPs, GVs, etc. referencing those types.
>>>
>>> For approach #2 you would need to hook into offsetof()--Linux 
>>> defines offsetof() as both __builtin_offsetof() and ((size_t) 
>>> &((TYPE *)0)->MEMBER) in different places. The latter would 
>>> transform into a GEP and shouldn't require special casing, while the 
>>> former might mean it's not doable as an LLVM pass alone. Thinking 
>>> about it now, if you wanted to implement the unoptimized version of 
>>> RANDSTRUCT (where elements are randomized across cache lines) you 
>>> would also need to hook into sizeof() as well. I might be missing 
>>> other code constructs that would further complicate the pass approach.
>>
>> The very latest point you can reorder the members of a struct without 
>> imposing weird restrictions is in RecordLayoutBuilder (which is run 
>> as part of semantic analysis). After that, constant-folding of 
>> sizeof/offsetof/etc. starts happening.
>
> How does this work across translation units?
>

The way the gcc plugin works is that there's a global seed, generated by 
the build system, which is passed to the compiler.  The order of a 
struct only varies based on the global seed and properties of the struct 
itself, so every translation unit will consistently shuffle a given 
struct the same way.

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project




More information about the cfe-dev mailing list