NAME=Fat Mach-O x86 section hashes and string file offsets
FILE=bins/mach0/ls-m1
ARGS=-a x86 -b64 -e bin.relocs=false
CMDS=<<EOF
iSj sha1~{0}
ph sha1 0x3a63 @ 0x1000039ac
izj~{97.paddr}
EOF
EXPECT=<<EOF
{"name":"0.__TEXT.__text","size":14947,"vsize":14947,"type":"REGULAR","perm":"-r-x","flags":2147484672,"sha1":"33e7174c48543d45f195a48d6887b2a0cb5525ea","paddr":31148,"vaddr":4294982060}
33e7174c48543d45f195a48d6887b2a0cb5525ea
48875
EOF
RUN

NAME=Fat Mach-O arm64 section hashes and string file offsets
FILE=bins/mach0/ls-m1
ARGS=-a arm -b64 -e bin.relocs=false
CMDS=<<EOF
iSj sha1~{0}
ph sha1 0x3c10 @ 0x100003830
izj~{96.paddr}
EOF
EXPECT=<<EOF
{"name":"0.__TEXT.__text","size":15376,"vsize":15376,"type":"REGULAR","perm":"-r-x","flags":2147484672,"sha1":"16cf10f874b4d2ff398f21a2ac2bb4dfc37784ae","paddr":112688,"vaddr":4294981680}
16cf10f874b4d2ff398f21a2ac2bb4dfc37784ae
130756
EOF
RUN

NAME=Thin Mach-O section hashes
FILE=bins/mach0/hello-macos-arm64-chained
ARGS=-e bin.relocs=false
CMDS=<<EOF
iSj sha1~{0}
ph sha1 0x350 @ 0x100003a7c
EOF
EXPECT=<<EOF
{"name":"0.__TEXT.__text","size":848,"vsize":848,"type":"REGULAR","perm":"-r-x","flags":2147484672,"sha1":"166b6f168896f7ecef6cfd5866d364a38566bb6d","paddr":14972,"vaddr":4294982268}
166b6f168896f7ecef6cfd5866d364a38566bb6d
EOF
RUN

NAME=Fat Mach-O constructor reads use slice offsets and report file offsets
FILE=bins/mach0/hellocxx-osx-fat-intel
ARGS=-a x86 -b64 -e bin.relocs=false
CMDS=<<EOF
ieej~{0.hpaddr}
ieej~{0.vaddr}
e io.va=false
p8 8 @ 0x5028
EOF
EXPECT=<<EOF
20520
4294970311
c70b000001000000
EOF
RUN

NAME=Fat Mach-O x86 section extraction preserves bytes
FILE=bins/mach0/ls-m1
ARGS=-a x86 -b64 -e bin.relocs=false -e log.level=0
CMDS=<<EOF
rmrf .tmp/fat-x86-sections
iSx .tmp/fat-x86-sections
e io.va=false
o .tmp/fat-x86-sections/section_0.__TEXT.__text_0.bin
ph sha1 $s @ 0
o-.
rmrf .tmp/fat-x86-sections
EOF
EXPECT=<<EOF
33e7174c48543d45f195a48d6887b2a0cb5525ea
EOF
RUN

NAME=Fat Mach-O x86 segment extraction uses file sizes
FILE=bins/mach0/ls-m1
ARGS=-a x86 -b64 -e bin.relocs=false -e log.level=0
CMDS=<<EOF
rmrf .tmp/fat-x86-segments
iSSx .tmp/fat-x86-segments
e io.va=false
o .tmp/fat-x86-segments/segment___TEXT_0.bin
ph sha1 $s @ 0
o-.
o .tmp/fat-x86-segments/segment___LINKEDIT_2.bin
?v $s
ph sha1 $s @ 0
o-.
rmrf .tmp/fat-x86-segments
EOF
EXPECT=<<EOF
623343a749ac3bc429c1177d2354a82bddc45418
0x5c60
4e6c0157c12d2de2dd56103d80720a55a0a77af3
EOF
RUN

NAME=Fat Mach-O arm64 segment extraction uses file sizes
FILE=bins/mach0/ls-m1
ARGS=-a arm -b64 -e bin.relocs=false -e log.level=0
CMDS=<<EOF
rmrf .tmp/fat-arm64-segments
iSSx .tmp/fat-arm64-segments
e io.va=false
o .tmp/fat-arm64-segments/segment___TEXT_0.bin
ph sha1 $s @ 0
o-.
o .tmp/fat-arm64-segments/segment___LINKEDIT_3.bin
?v $s
ph sha1 $s @ 0
o-.
rmrf .tmp/fat-arm64-segments
EOF
EXPECT=<<EOF
62f28c2d31aeeafc99420eebdaaf9976175c4553
0x5aa0
3d8cb411bc1f24876b44c2d25b57eee2df359d84
EOF
RUN

NAME=Fat Mach-O arm64 section extraction preserves bytes
FILE=bins/mach0/ls-m1
ARGS=-a arm -b64 -e bin.relocs=false -e log.level=0
CMDS=<<EOF
rmrf .tmp/fat-arm64-sections
iSx .tmp/fat-arm64-sections
e io.va=false
o .tmp/fat-arm64-sections/section_0.__TEXT.__text_0.bin
ph sha1 $s @ 0
o-.
rmrf .tmp/fat-arm64-sections
EOF
EXPECT=<<EOF
16cf10f874b4d2ff398f21a2ac2bb4dfc37784ae
EOF
RUN

NAME=Fat Mach-O 32-bit CFString at slice end uses a file offset
FILE=malloc://768
ARGS=-a arm -b32 -e bin.relocs=false
CMDS=<<EOF
wx cafebabe000000010000000c00000009000001000000020000000000 @ 0
wx cefaedfe0c000000090000000200000001000000c00000000000000001000000c00000005f5f444154410000000000000000000000100000000200000000000000020000070000000300000002000000000000005f5f63737472696e67000000000000005f5f44415441000000000000000000008011000006000000800100000000000000000000000000000200000000000000000000005f5f6366737472696e670000000000005f5f4441544100000000000000000000f011000010000000f0010000000000000000000000000000000000000000000000000000 @ 0x100
wx 68656c6c6f00 @ 0x280
wx 00000000000000008011000005000000 @ 0x2f0
ob-0
oba 0
e io.va=true
iz~cstr.
EOF
EXPECT=<<EOF
0   0x000002f0 0x000011f0 5   6    1.__DATA.__cfstring ascii cstr.hello
EOF
RUN

NAME=Fat Mach-O 32-bit CFString ignores incomplete records
FILE=malloc://768
ARGS=-a arm -b32 -e bin.relocs=false
CMDS=<<EOF
wx cafebabe000000010000000c00000009000001000000020000000000 @ 0
wx cefaedfe0c000000090000000200000001000000c00000000000000001000000c00000005f5f444154410000000000000000000000100000000200000000000000020000070000000300000002000000000000005f5f63737472696e67000000000000005f5f44415441000000000000000000008011000006000000800100000000000000000000000000000200000000000000000000005f5f6366737472696e670000000000005f5f4441544100000000000000000000f01100000c000000f0010000000000000000000000000000000000000000000000000000 @ 0x100
wx 68656c6c6f00 @ 0x280
wx 00000000000000008011000005000000 @ 0x2f0
ob-0
oba 0
e io.va=true
iz~cstr.
EOF
EXPECT=<<EOF
EOF
RUN

NAME=Fat Mach-O 64-bit CFString at slice end uses a file offset
FILE=malloc://768
ARGS=-a x86 -b64 -e bin.relocs=false
CMDS=<<EOF
wx cafebabe000000010100000700000003000001000000020000000000 @ 0
wx cffaedfe07000001030000000200000001000000e8000000000000000000000019000000e80000005f5f44415441000000000000000000000010000000000000000200000000000000000000000000000002000000000000070000000300000002000000000000005f5f63737472696e67000000000000005f5f44415441000000000000000000008011000000000000060000000000000080010000000000000000000000000000020000000000000000000000000000005f5f6366737472696e670000000000005f5f4441544100000000000000000000e0110000000000002000000000000000e001000000000000000000000000000000000000000000000000000000000000 @ 0x100
wx 68656c6c6f00 @ 0x280
wx 0000000000000000000000000000000080110000000000000500000000000000 @ 0x2e0
ob-0
oba 0
e io.va=true
iz~cstr.
EOF
EXPECT=<<EOF
0   0x000002e0 0x000011e0 5   6    1.__DATA.__cfstring ascii cstr.hello
EOF
RUN

NAME=Fat Mach-O 64-bit CFString ignores incomplete records
FILE=malloc://768
ARGS=-a x86 -b64 -e bin.relocs=false
CMDS=<<EOF
wx cafebabe000000010100000700000003000001000000020000000000 @ 0
wx cffaedfe07000001030000000200000001000000e8000000000000000000000019000000e80000005f5f44415441000000000000000000000010000000000000000200000000000000000000000000000002000000000000070000000300000002000000000000005f5f63737472696e67000000000000005f5f44415441000000000000000000008011000000000000060000000000000080010000000000000000000000000000020000000000000000000000000000005f5f6366737472696e670000000000005f5f4441544100000000000000000000e0110000000000001c00000000000000e001000000000000000000000000000000000000000000000000000000000000 @ 0x100
wx 68656c6c6f00 @ 0x280
wx 0000000000000000000000000000000080110000000000000500000000000000 @ 0x2e0
ob-0
oba 0
e io.va=true
iz~cstr.
EOF
EXPECT=<<EOF
EOF
RUN

NAME=Fat Mach-O 32-bit constructor target and pointer use file offsets
FILE=malloc://768
ARGS=-a arm -b32 -e bin.relocs=false
CMDS=<<EOF
wx cafebabe000000010000000c00000009000001000000020000000000 @ 0
wx cefaedfe0c0000000900000002000000020000009400000000000000010000007c0000005f5f544558540000000000000000000000100000000200000000000000020000070000000500000001000000000000005f5f6d6f645f696e69745f66756e63005f5f5445585400000000000000000000f011000004000000f0010000000000000000000000000000090000000000000000000000280000801800000040010000000000000000000000000000 @ 0x100
wx 40110000 @ 0x2f0
ob-0
oba 0
ieej~{0.paddr}
ieej~{0.vaddr}
ieej~{0.hpaddr}
EOF
EXPECT=<<EOF
576
4416
752
EOF
RUN

NAME=Fat Mach-O 64-bit constructor target and pointer use file offsets
FILE=malloc://768
ARGS=-a x86 -b64 -e bin.relocs=false
CMDS=<<EOF
wx cafebabe000000010100000700000003000001000000020000000000 @ 0
wx cffaedfe07000001030000000200000002000000b0000000000000000000000019000000980000005f5f54455854000000000000000000000010000000000000000200000000000000000000000000000002000000000000070000000500000001000000000000005f5f6d6f645f696e69745f66756e63005f5f5445585400000000000000000000e0110000000000000800000000000000e001000000000000000000000000000009000000000000000000000000000000280000801800000040010000000000000000000000000000 @ 0x100
wx 4011000000000000 @ 0x2e0
ob-0
oba 0
ieej~{0.paddr}
ieej~{0.vaddr}
ieej~{0.hpaddr}
EOF
EXPECT=<<EOF
576
4416
736
EOF
RUN

NAME=Fat Mach-O rejects constructor pointer tables outside the slice
FILE=malloc://768
ARGS=-a x86 -b64 -e bin.relocs=false -e log.level=0
CMDS=<<EOF
wx cafebabe000000010100000700000003000001000000020000000000 @ 0
wx cffaedfe07000001030000000200000002000000b0000000000000000000000019000000980000005f5f54455854000000000000000000000010000000000000000200000000000000000000000000000002000000000000070000000500000001000000000000005f5f6d6f645f696e69745f66756e63005f5f5445585400000000000000000000e0110000000000000800000000000000e001000000000000000000000000000009000000000000000000000000000000280000801800000040010000000000000000000000000000 @ 0x100
wx 4011000000000000 @ 0x2e0
wv4 0x220 @ 0x198
ob-0
oba 0
ieej
EOF
EXPECT=<<EOF
[]
EOF
RUN
