NAME=kernelcache LC_KEXT name without NUL terminator
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c000001000000000c0000000200000070010000000000000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000000000000000000000000000000000000000000000000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff001000000000000000200000000000000000000000000000000000000000000000000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00100000000000000030000000000000000000000000000000000000000000000000000000000000350000803800000000400007f0ffffff00000000000000000000000000000000414141414141414141414141414141414141414141414141
oba 0
iSq
EOF
EXPECT=<<EOF
0x00001000 0x00002000 -r-x AAAAAAAAAAAAAAAAAAAAAAAA.0.__PRELINK_INFO.__info
0x00002000 0x00003000 -r-x AAAAAAAAAAAAAAAAAAAAAAAA.1.__PRELINK_TEXT.__text
0x00003000 0x00004000 -r-x AAAAAAAAAAAAAAAAAAAAAAAA.2.__PRELINK_DATA.__data
0x00001000 0x00002000 -r-x 0.__PRELINK_INFO.__info
0x00002000 0x00003000 -r-x 1.__PRELINK_TEXT.__text
0x00003000 0x00004000 -r-x 2.__PRELINK_DATA.__data
EOF
RUN

NAME=kernelcache LC_KEXT name padded with NULs
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c000001000000000c0000000200000070010000000000000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000000000000000000000000000000000000000000000000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff001000000000000000200000000000000000000000000000000000000000000000000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00100000000000000030000000000000000000000000000000000000000000000000000000000000350000803800000000400007f0ffffff00000000000000000000000000000000636f6d2e6578616d706c652e647269766572000000000000
oba 0
iSq
EOF
EXPECT=<<EOF
0x00001000 0x00002000 -r-x com.example.driver.0.__PRELINK_INFO.__info
0x00002000 0x00003000 -r-x com.example.driver.1.__PRELINK_TEXT.__text
0x00003000 0x00004000 -r-x com.example.driver.2.__PRELINK_DATA.__data
0x00001000 0x00002000 -r-x 0.__PRELINK_INFO.__info
0x00002000 0x00003000 -r-x 1.__PRELINK_TEXT.__text
0x00003000 0x00004000 -r-x 2.__PRELINK_DATA.__data
EOF
RUN

NAME=kernelcache plist dict value without a key
FILE=malloc://4096
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000500000030030000000020000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff0004000000000000000000000000000000040000000000000700000005000000000000000000000019000000980000005f5f5052454c494e4b5f54455854000000440007f0ffffff000100000000000000040000000000000001000000000000070000000500000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000440007f0ffffff00010000000000000004 @ 0x0
wx 19000000980000005f5f5052454c494e4b5f44415441000000450007f0ffffff000100000000000000050000000000000001000000000000070000000500000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000450007f0ffffff00010000000000000005 @ 0x100
wx 000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000480007f0ffffff3d0000000000000000080000000000003d00000000000000070000000500000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000480007f0ffffff3d000000000000000008 @ 0x190
wx 05000000200100000600000044 @ 0x230
wx 00440007f0ffffff @ 0x340
wx 3c646963743e3c6b65793e613c2f6b65793e3c737472696e673e783c2f737472696e673e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x800
oba 0
iI~^bintype
ob-*
?e closed
EOF
EXPECT=<<EOF
closed
EOF
RUN

NAME=kernelcache plist dict with one key per value
FILE=malloc://4096
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000500000030030000000020000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff0004000000000000000000000000000000040000000000000700000005000000000000000000000019000000980000005f5f5052454c494e4b5f54455854000000440007f0ffffff000100000000000000040000000000000001000000000000070000000500000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000440007f0ffffff00010000000000000004 @ 0x0
wx 19000000980000005f5f5052454c494e4b5f44415441000000450007f0ffffff000100000000000000050000000000000001000000000000070000000500000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000450007f0ffffff00010000000000000005 @ 0x100
wx 000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000480007f0ffffff490000000000000000080000000000004900000000000000070000000500000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000480007f0ffffff49000000000000000008 @ 0x190
wx 05000000200100000600000044 @ 0x230
wx 00440007f0ffffff @ 0x340
wx 3c646963743e3c6b65793e613c2f6b65793e3c737472696e673e783c2f737472696e673e3c6b65793e623c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x800
oba 0
iI~^bintype
ob-*
?e closed
EOF
EXPECT=<<EOF
bintype  ios
closed
EOF
RUN

NAME=kernelcache io read swizzle only rebases its own descriptor
FILE=malloc://0x1100
ARGS=-n -w
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000500000080030000000020000000000019000000980000005f5f544558540000000000000000000000400007f0ffffff000800000000000000000000000000000008000000000000070000000500000001000000000000005f5f7468726561645f737461727473005f5f544558540000000000000000000000470007f0ffffff0c000000000000000007 @ 0x0
wx 19000000980000005f5f5052454c494e4b5f54455854000000480007f0ffffff000100000000000000080000000000000001000000000000070000000500000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000480007f0ffffff00010000000000000008 @ 0xb8
wx 19000000980000005f5f5052454c494e4b5f44415441000000490007f0ffffff000100000000000000090000000000000001000000000000070000000500000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000490007f0ffffff00010000000000000009 @ 0x150
wx 19000000980000005f5f5052454c494e4b5f494e464f000000500007f0ffffff000100000000000000100000000000000001000000000000070000000500000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff0d000000000000000010 @ 0x1e8
wx 05000000200100000600000044 @ 0x280
wx 0900000809 @ 0x705
wx 34120000000010807856000000000080 @ 0x900
wx 3c646963743e3c2f646963743e @ 0x1000
oba 0
e io.va=false
pv8 2 @ 0x900
o malloc://64
wx 7f454c4602010100000000000000000002003e000100000078004000000000000000000000000000000000000000000000000000000000000000371337130000
oba 0
p8 4
op 3
ooi
pv8 2 @ 0x900
o-3
ob-3
op 4
p8 4
EOF
EXPECT=<<EOF
0xfffffff007005234
0xfffffff007009678
7f454c46
0xfffffff007005234
0xfffffff007009678
7f454c46
EOF
RUN

NAME=kernelcache constructor pointer that wraps the text bounds check
FILE=malloc://16384
CMDS=<<EOF
wx cffaedfe0c000001000000000c0000000400000000020000000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000470007f0ffffff000000000000000000070000000000000000000000000000070000000700000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000470007f0ffffff00000000000000000007 @ 0x0
wx 000000000000000019000000980000005f5f5052454c494e4b5f54455854000000480007f0ffffff100000000000000000080000000000001000000000000000070000000700000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000480007f0ffffff10000000000000000008 @ 0xb0
wx 19000000980000005f5f5052454c494e4b5f44415441000000490007f0ffffff100000000000000000090000000000001000000000000000070000000700000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000490007f0ffffff10000000000000000009 @ 0x150
wx 0000000000000000350000803800000000500007f0ffffff00100000000000002000000000000000636f6d2e6578616d706c652e6b657874 @ 0x1e0
wx cffaedfe0c000001000000000b0000000200000030010000000000000000000019000000980000005f5f544558545f45584543000000000000600007f0fffffff0010000000000000020000000000000f001000000000000070000000700000001000000000000005f5f74657874000000000000000000005f5f544558545f45584543000000000000600007f0fffffff0010000000000000020 @ 0x1000
wx 000000000000000019000000980000005f5f444154415f434f4e53540000000000700007f0ffffff080000000000000000300000000000000800000000000000070000000700000001000000000000005f5f6d6f645f696e69745f66756e63005f5f444154415f434f4e53540000000000700007f0ffffff08000000000000000030 @ 0x10b0
wx 1f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d5 @ 0x2000
wx f8ffffffffffffff @ 0x3000
oba 0
iI~^bintype
?e ok
EOF
EXPECT=<<EOF
bintype  ios
ok
EOF
RUN

NAME=kernelcache constructor pointer inside the kext text
FILE=malloc://16384
CMDS=<<EOF
wx cffaedfe0c000001000000000c0000000400000000020000000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000470007f0ffffff000000000000000000070000000000000000000000000000070000000700000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000470007f0ffffff00000000000000000007 @ 0x0
wx 000000000000000019000000980000005f5f5052454c494e4b5f54455854000000480007f0ffffff100000000000000000080000000000001000000000000000070000000700000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000480007f0ffffff10000000000000000008 @ 0xb0
wx 19000000980000005f5f5052454c494e4b5f44415441000000490007f0ffffff100000000000000000090000000000001000000000000000070000000700000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000490007f0ffffff10000000000000000009 @ 0x150
wx 0000000000000000350000803800000000500007f0ffffff00100000000000002000000000000000636f6d2e6578616d706c652e6b657874 @ 0x1e0
wx cffaedfe0c000001000000000b0000000200000030010000000000000000000019000000980000005f5f544558545f45584543000000000000600007f0fffffff0010000000000000020000000000000f001000000000000070000000700000001000000000000005f5f74657874000000000000000000005f5f544558545f45584543000000000000600007f0fffffff0010000000000000020 @ 0x1000
wx 000000000000000019000000980000005f5f444154415f434f4e53540000000000700007f0ffffff080000000000000000300000000000000800000000000000070000000700000001000000000000005f5f6d6f645f696e69745f66756e63005f5f444154415f434f4e53540000000000700007f0ffffff08000000000000000030 @ 0x10b0
wx 1f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d51f2003d5 @ 0x2000
wx 00600007f0ffffff @ 0x3000
oba 0
iI~^bintype
?e ok
EOF
EXPECT=<<EOF
bintype  ios
ok
EOF
RUN

NAME=kernelcache stub GOT before the file adds no symbol
FILE=malloc://12288
CMDS=<<EOF
wx cffaedfe0c000001000000000c0000000500000040020000000000000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff0004000000000000000000000000000000040000000000000700000005000000000000000000000019000000980000005f5f5052454c494e4b5f54455854000000440007f0ffffff000100000000000000040000000000000001000000000000070000000500000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000440007f0ffffff00010000000000000004 @ 0x0
wx 19000000980000005f5f5052454c494e4b5f44415441000000450007f0ffffff000100000000000000050000000000000001000000000000070000000500000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000450007f0ffffff00010000000000000005 @ 0x100
wx 000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000460007f0ffffff100000000000000000060000000000001000000000000000070000000500000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000460007f0ffffff10000000000000000006 @ 0x190
wx 350000803000000000500007f0ffffff00100000000000002000000000000000636f6d2e6170706c652e78 @ 0x230
wx cffaedfe0c000001000000000b0000000200000080010000000000000000000019000000e80000005f5f544558545f45584543000000000000500007f0ffffff000500000000000000100000000000000005000000000000070000000500000002000000000000005f5f74657874000000000000000000005f5f544558545f4558454300000000000100000000000000f0ffffffffffffff0004 @ 0x1000
wx 00000000000000005f5f73747562730000000000000000005f5f544558545f45584543000000000000530007f0ffffff0c000000000000000003 @ 0x10b0
wx 000000000000000019000000980000005f5f444154415f434f4e53540000000000550007f0ffffff000100000000000000150000000000000001000000000000070000000500000001000000000000005f5f676f7400000000000000000000005f5f444154415f434f4e53540000000000550007f0ffffff08000000000000000005 @ 0x1100
wx f0ffffd01002009100021fd6 @ 0x1300
wx 8877665544332211 @ 0x2000
oba 0
is~exp.,stub.~?
EOF
EXPECT=<<EOF
0
EOF
RUN

NAME=kernelcache stub GOT inside the file names the export
FILE=malloc://12288
CMDS=<<EOF
wx cffaedfe0c000001000000000c0000000500000040020000000000000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff0004000000000000000000000000000000040000000000000700000005000000000000000000000019000000980000005f5f5052454c494e4b5f54455854000000440007f0ffffff000100000000000000040000000000000001000000000000070000000500000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000440007f0ffffff00010000000000000004 @ 0x0
wx 19000000980000005f5f5052454c494e4b5f44415441000000450007f0ffffff000100000000000000050000000000000001000000000000070000000500000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000450007f0ffffff00010000000000000005 @ 0x100
wx 000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000460007f0ffffff100000000000000000060000000000001000000000000000070000000500000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000460007f0ffffff10000000000000000006 @ 0x190
wx 350000803000000000500007f0ffffff00100000000000002000000000000000636f6d2e6170706c652e78 @ 0x230
wx cffaedfe0c000001000000000b0000000200000080010000000000000000000019000000e80000005f5f544558545f45584543000000000000500007f0ffffff000500000000000000100000000000000005000000000000070000000500000002000000000000005f5f74657874000000000000000000005f5f544558545f4558454300000000000100000000000000f0ffffffffffffff0004 @ 0x1000
wx 00000000000000005f5f73747562730000000000000000005f5f544558545f45584543000000000000530007f0ffffff0c000000000000000003 @ 0x10b0
wx 000000000000000019000000980000005f5f444154415f434f4e53540000000000550007f0ffffff000100000000000000150000000000000001000000000000070000000500000001000000000000005f5f676f7400000000000000000000005f5f444154415f434f4e53540000000000550007f0ffffff08000000000000000005 @ 0x1100
wx 100000b01002009100021fd6 @ 0x1300
wx 8877665544332211 @ 0x2000
oba 0
is~exp.[6]
EOF
EXPECT=<<EOF
exp.x.0x1122334455667788
EOF
RUN

NAME=kernelcache plist IDREF chain expanding exponentially is rejected
FILE=malloc://16384
TIMEOUT=10
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000200000058020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff17080000000000000010000003 @ 0x0
wx 00000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff00100000000000000020000003 @ 0xb0
wx 00000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00100000000000000030000003 @ 0x100
wx 000000000000000005000000200100000600000044 @ 0x150
wx 000000000000000000600007f0ffffff @ 0x260
wx 3c646963743e3c6b65793e6b303c2f6b65793e3c646963742049443d2230223e3c6b65793e733c2f6b65793e3c737472696e673e783c2f737472696e673e3c2f646963743e3c6b65793e6b313c2f6b65793e3c646963742049443d2231223e3c6b65793e613c2f6b65793e3c646963742049445245463d2230223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2230223e3c2f646963743e3c2f646963743e3c6b65793e6b323c2f6b65793e3c646963742049443d2232223e3c6b65793e613c2f6b65793e3c646963742049445245463d2231223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2231223e3c2f646963743e3c2f646963743e3c6b65793e6b333c2f6b65793e3c646963742049443d2233223e3c6b65793e613c2f6b65793e3c646963742049445245463d2232223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2232223e3c2f646963743e3c2f646963743e3c6b65793e6b343c2f6b65793e3c646963742049443d2234223e3c6b65793e613c2f6b65793e3c646963742049445245463d2233223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2233223e3c2f646963743e3c2f646963743e3c6b65793e6b353c2f6b65793e3c646963742049443d2235223e3c6b65793e613c2f6b65793e3c646963742049445245463d2234223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2234223e3c2f646963743e3c2f646963743e3c6b65793e6b363c2f6b65793e3c646963742049443d2236223e3c6b65793e613c2f6b65793e3c646963742049445245463d2235223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2235223e3c2f646963743e3c2f646963743e3c6b65793e6b373c2f6b65793e3c646963742049443d2237223e3c6b65793e613c2f6b65793e3c646963742049445245463d2236223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2236223e3c2f646963743e3c2f646963743e3c6b65793e6b383c2f6b65793e3c646963742049443d2238223e3c6b65793e613c2f6b65793e3c646963742049445245463d2237223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2237223e3c2f646963743e3c2f646963743e3c6b65793e6b393c2f6b65793e3c646963742049443d2239223e3c6b65793e613c2f6b65793e3c646963742049445245463d2238223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2238223e3c2f646963743e3c2f646963743e3c6b65793e6b31303c2f6b65793e3c646963742049443d223130223e3c6b65793e613c2f6b65793e3c646963742049445245463d2239223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2239223e3c2f646963743e3c2f646963743e3c6b65793e6b31313c2f6b65793e3c646963742049443d223131223e3c6b65793e613c2f6b65793e3c646963742049445245463d223130223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223130223e3c2f646963743e3c2f646963743e3c6b65793e6b31323c2f6b65793e3c646963742049443d223132223e3c6b65793e613c2f6b65793e3c646963742049445245463d223131223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223131223e3c2f646963743e3c2f646963743e3c6b65793e6b31333c2f6b65793e3c646963742049443d223133223e3c6b65793e613c2f6b65793e3c646963742049445245463d223132223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223132223e3c2f646963743e3c2f646963743e3c6b65793e6b31343c2f6b65793e3c646963742049443d223134223e3c6b65793e613c2f6b65793e3c646963742049445245463d223133223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223133223e3c2f646963743e3c2f646963743e3c6b65793e6b31353c2f6b65793e3c646963742049443d223135223e3c6b65793e613c2f6b65793e3c646963742049445245463d223134223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223134223e3c2f646963743e3c2f646963743e3c6b65793e6b31363c2f6b65793e3c646963742049443d223136223e3c6b65793e613c2f6b65793e3c646963742049445245463d223135223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223135223e3c2f646963743e3c2f646963743e3c6b65793e6b31373c2f6b65793e3c646963742049443d223137223e3c6b65793e613c2f6b65793e3c646963742049445245463d223136223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223136223e3c2f646963743e3c2f646963743e3c6b65793e6b31383c2f6b65793e3c646963742049443d223138223e3c6b65793e613c2f6b65793e3c646963742049445245463d223137223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223137223e3c2f646963743e3c2f646963743e3c6b65793e6b31393c2f6b65793e3c646963742049443d223139223e3c6b65793e613c2f6b65793e3c646963742049445245463d223138223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d223138223e3c2f646963743e3c2f646963743e3c2f646963743e @ 0x1000
oba 0
iI~^class
?e ok
EOF
EXPECT=<<EOF
ok
EOF
EXPECT_ERR=<<EOF
ERROR: Too many values produced by IDREF expansion
EOF
RUN

NAME=kernelcache plist with a few nested IDREFs
FILE=malloc://16384
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000200000058020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff81010000000000000010000003 @ 0x0
wx 00000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff00100000000000000020000003 @ 0xb0
wx 00000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00100000000000000030000003 @ 0x100
wx 000000000000000005000000200100000600000044 @ 0x150
wx 000000000000000000600007f0ffffff @ 0x260
wx 3c646963743e3c6b65793e6b303c2f6b65793e3c646963742049443d2230223e3c6b65793e733c2f6b65793e3c737472696e673e783c2f737472696e673e3c2f646963743e3c6b65793e6b313c2f6b65793e3c646963742049443d2231223e3c6b65793e613c2f6b65793e3c646963742049445245463d2230223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2230223e3c2f646963743e3c2f646963743e3c6b65793e6b323c2f6b65793e3c646963742049443d2232223e3c6b65793e613c2f6b65793e3c646963742049445245463d2231223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2231223e3c2f646963743e3c2f646963743e3c6b65793e6b333c2f6b65793e3c646963742049443d2233223e3c6b65793e613c2f6b65793e3c646963742049445245463d2232223e3c2f646963743e3c6b65793e623c2f6b65793e3c646963742049445245463d2232223e3c2f646963743e3c2f646963743e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    kernelcache
EOF
RUN

NAME=kernelcache __thread_starts entries repeating one chain are walked once
FILE=malloc://0x9000
ARGS=-n -w
TIMEOUT=10
CMDS=<<EOF2
e log.quiet=true
# arm64 kernelcache header: __TEXT with __thread_starts, the three __PRELINK sections and an LC_UNIXTHREAD
wx cffaedfe0c00000100000000020000000500000080030000000020000000000019000000980000005f5f544558540000000000000000000000400007f0ffffff009000000000000000000000000000000090000000000000070000000700000001000000000000005f5f7468726561645f737461727473005f5f544558540000000000000000000000440007f0ffffff843e000000000000000400000000000000000000000000000000000000000000000000000000000019000000980000005f5f5052454c494e4b5f54455854000000400017f0ffffff1000000000000000a0030000000000001000000000000000070000000700000001000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000400017f0ffffff1000000000000000a00300000000000000000000000000000000000000000000000000000000000019000000980000005f5f5052454c494e4b5f44415441000000400027f0ffffff1000000000000000b0030000000000001000000000000000070000000700000001000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000400027f0ffffff1000000000000000b00300000000000000000000000000000000000000000000000000000000000019000000980000005f5f5052454c494e4b5f494e464f000000400037f0ffffff2000000000000000c0030000000000002000000000000000070000000700000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000400037f0ffffff0d00000000000000c00300000000000000000000000000000000000000000000000000000000000005000000200100000600000044
wx 3c646963743e3c2f646963743e @ 0x3c0
# __thread_starts: flags word 0 (4 byte stride) followed by 4000 entries that all start the same chain
b 0x3e80
wow 88420000 @ 0x404
# the chain: 4000 overlapping pointers, each one pointing 4 bytes ahead (bits 51-61 hold the delta)
wow 00000800 @ 0x4288
b 0x100
oba 0
iI~class
pv4 @ 0x404
pv4 @ 0x4280
pv8 @ 0x4288
pv8 @ 0x8104
pv8 @ 0x8108
EOF2
EXPECT=<<EOF2
class    kernelcache
0x00004288
0x00004288
0x0708400007084000
0xfffffff007084000
0x0000000000000000
EOF2
RUN

NAME=kernelcache __PRELINK_INFO size larger than the file is clamped
FILE=malloc://16384
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000200000058020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0fffffff0ffffffffffff7f0010 @ 0x0
wx 00000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff00100000000000000020 @ 0xb0
wx 00000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00080000000000000030 @ 0x100
wx 000000000000000005000000200100000600000044 @ 0x150
wx 000000000000000000600007f0ffffff @ 0x260
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    kernelcache
EOF
RUN

NAME=mach0 with LC_UNIXTHREAD and kernel addresses but no prelink info is not a kernelcache
FILE=malloc://4096
ARGS=-n -w
CMDS=<<EOF
wx cffaedfe0c00000100000000020000000200000068010000000020000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff00100000000000000000000000000000001000000000000005000000050000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=kernelcache prelink info and text with the __DATA fallback
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c00000100000000020000000300000050020000000020000000000019000000e80000005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000002000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff0010000000000000002000000200000000000000000000000000000000000000000000000000000019000000480000005f5f444154410000000000000000000000800007f0ffffff00100000000000000030000000000000001000000000000005000000050000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    kernelcache
EOF
RUN

NAME=kernelcache MH_FILESET
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c000001000000000c0000000200000058020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff001000000000000000200000020000000000000000000000000000000000000000000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00100000000000000030000002000000000000000000000000000000000000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    kernelcache
EOF
RUN

NAME=mach0 empty __PRELINK_INFO segment is not a kernelcache
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c000001000000000200000003000000b0010000000020000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff0040000000000000000000000000000000400000000000000500000005000000000000000000000019000000480000005f5f5052454c494e4b5f494e464f000000800007f0ffffff00100000000000000010000000000000001000000000000005000000050000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=mach0 __PRELINK_INFO section other than __info is not a kernelcache
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c000001000000000200000002000000b8010000000020000000000019000000980000005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000001000000000000005f5f6a756e6b000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff00100000000000000010000002000000000000000000000000000000000000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=mach0 __PRELINK_INFO.__info without text and data is not a kernelcache
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c000001000000000200000002000000b8010000000020000000000019000000980000005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000001000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff00100000000000000010000002000000000000000000000000000000000000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=mach0 segment section count larger than its command is not a kernelcache
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c00000100000000020000000200000068010000000020000000000019000000480000005f5f544558540000000000000000000000400007f0ffffff00400000000000000000000000000000004000000000000005000000050000000000010000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=mach0 prelink sections with a later LC_LOAD_DYLIB are not a kernelcache
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c00000100000000020000000300000078020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f74657874000000000000000000005f5f5052454c494e4b5f54455854000000600007f0ffffff001000000000000000200000020000000000000000000000000000000000000000000000000000005f5f64617461000000000000000000005f5f5052454c494e4b5f44415441000000700007f0ffffff00100000000000000030000002000000000000000000000000000000000000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff00000000000000000c00000020000000180000000000000000000000000000007800000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=mach0 repeated __PRELINK_INFO.__info sections are not a kernelcache
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c00000100000000020000000200000058020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff00100000000000000010000002000000000000000000000000000000000000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
oba 0
iI~^class
EOF
EXPECT=<<EOF
class    MACH064
EOF
RUN

NAME=kernelcache loader does not count a repeated __PRELINK_INFO.__info twice
FILE=malloc://16384
ARGS=-n -w
CMDS=<<EOF
e log.quiet=true
wx cffaedfe0c00000100000000020000000200000058020000000020000000000019000000380100005f5f544558540000000000000000000000400007f0ffffff004000000000000000000000000000000040000000000000050000000500000003000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff001000000000000000100000020000000000000000000000000000000000000000000000000000005f5f696e666f000000000000000000005f5f5052454c494e4b5f494e464f000000500007f0ffffff00100000000000000010000002000000000000000000000000000000000000000000000000000000050000002001000006000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410007f0ffffff0000000000000000
wx 3c646963743e3c6b65793e783c2f6b65793e3c737472696e673e793c2f737472696e673e3c2f646963743e @ 0x1000
e bin.force=kernelcache
oba 0
iI~^class
EOF
EXPECT=<<EOF
EOF
RUN
