This mechanism was inspired by NSA. As described all hooks stored in huge struct security_hooks_list, but it`s format is different in each version. We can determine which list belongs to what hook with disasm magic. Lets see function that calls security hooks - for example security_path_chown:
.text:FFFFFFC010496448 security_path_chown ; CODE XREF: chown_common+104↑p.text:FFFFFFC010496448 STP X29, X30, [SP,#-0x18+var_18]!.text:FFFFFFC01049644C MOV X29, SP.text:FFFFFFC010496450 STP X20, X21, [SP,#0x18+var_s0].text:FFFFFFC010496454 STR X22, [SP,#0x18+var_s10].text:FFFFFFC010496458 MOV X20, path.text:FFFFFFC01049645C MOV W21, W1.text:FFFFFFC010496460 MOV path, X30.text:FFFFFFC010496464 MOV W22, W2.text:FFFFFFC010496468 loc_FFFFFFC010496468 ; DATA XREF: .init.data:FFFFFFC0111474C0↓o.text:FFFFFFC010496468 BL _mcount.text:FFFFFFC01049646C LDR X0, [path,#8].text:FFFFFFC010496470 LDR X0, [X0,#0x30].text:FFFFFFC010496474 LDR W0, [X0,#0xC].text:FFFFFFC010496478 TBNZ W0, #9, loc_FFFFFFC0104964B4.text:FFFFFFC01049647C ADRP X0, #security_hook_heads_0.path_chown@PAGE.text:FFFFFFC010496480 STR X19, [X29,#0x18+var_8].text:FFFFFFC010496484 LDR X19, [X0,#security_hook_heads_0.path_chown@PAGEOFF]