NAME=oon
FILE=bins/mach0/mac-ls2
CMDS=<<EOF
oon
ol
EOF
EXPECT=<<EOF
 4 * r-- 0x00009730 bins/mach0/mac-ls2
EOF
RUN

NAME=oonn
FILE=bins/mach0/mac-ls2
CMDS=<<EOF
pfn~?
oonn
pfn~?
ol~?
EOF
EXPECT=<<EOF
41
99
1
EOF
RUN

NAME=oml=
FILE=bins/mach0/mac-ls2
BROKEN=1
CMDS=oml=
EXPECT=<<EOF

0*  0x100000000 ################-------------- 0x100005000 r-x   3     fmap.TEXT
1   0x100005000 ---------------####----------- 0x100006000 r--   3     fmap.DATA
2   0x100006000 ------------------############ 0x10000a000 r--   3     fmap.LINKEDIT
=>  0x1000011e8 ------------------------------ 0x1000012e8
EOF
RUN

NAME=obo baddrs
FILE=bins/mach0/mac-ls2
ARGS=-B0x50000
CMDS=<<EOF
s
o bins/mach0/mac-ls
s
obo 3
s
obo 4
s
EOF
EXPECT=<<EOF
0x511e8
0x100001058
0x511e8
0x100001058
EOF
RUN

NAME=oom
FILE=bins/elf/libmagic.so
CMDS=<<EOF
ol~?
oom
ol~malloc?
EOF
EXPECT=<<EOF
4
1
EOF
RUN

NAME=o-[0]
FILE=malloc://1024
CMDS=o- `o~[0]`;o
EXPECT=<<EOF
EOF
RUN

NAME=oj-
FILE=malloc://1024
CMDS=o- `oj~{[0].fd}`;o
EXPECT=<<EOF
EOF
RUN

NAME=o =
FILE=malloc://1024
CMDS=<<EOF
o =;ol~?
EOF
EXPECT=<<EOF
2
EOF
RUN

NAME=om
FILE=malloc://1024
CMDS=<<EOF
om `ol~[0]` 0x4000
oml~?
EOF
EXPECT=<<EOF
2
EOF
RUN

NAME=om2
FILE=malloc://1024
CMDS=<<EOF
om `ol~[0]` 0x4000
om `ol~[0]` 0x4000
oml~?
EOF
EXPECT=<<EOF
3
EOF
RUN

NAME=omn - crash
FILE==
CMDS=omn
EXPECT=<<EOF
EOF
RUN

NAME=oob 10
FILE=bins/elf/analysis/hello-linux-x86_64
CMDS=<<EOF
10oob
pi 1
EOF
EXPECT=<<EOF
xor ebp, ebp
EOF
RUN

NAME=oo+ 10
FILE=bins/elf/analysis/hello-linux-x86_64
CMDS=<<EOF
10oo+
pi 1
EOF
EXPECT=<<EOF
xor ebp, ebp
EOF
RUN

NAME=oob consider baddr
FILE=bins/mach0/mac-ls
CMDS=<<EOF
e bin.baddr=0xf00000
k old_v=`ieq`
oob
iI~baddr[1]
ie:vaddr:quiet
p8 10 @ entry0
p8 10 @ `k old_v`
EOF
EXPECT=<<EOF
0x00f00000
0x00f01058
554889e5415741564155
ffffffffffffffffffff
EOF
RUN

NAME=oob consider laddr 32bit
FILE=bins/mach0/fatmach0-3true
ARGS=-a x86 -b 32
CMDS=<<EOF
e bin.laddr=0x5000
e bin.baddr=-1
oob
iI~laddr[1]
iI~baddr[1]
EOF
EXPECT=<<EOF
0x00000000
0x00001000
EOF
RUN

NAME=oob consider laddr 64bit
FILE=bins/mach0/fatmach0-3true
ARGS=-a x86 -b 64
CMDS=<<EOF
e bin.laddr=0x5000
e bin.baddr=-1
oob
iI~laddr[1]
iI~baddr[1]
EOF
EXPECT=<<EOF
0x00000000
0x100000000
EOF
RUN

NAME=oob from malloc
FILE=malloc://1024
CMDS=<<EOF
wx 7f454c4601010100b32ae9310000000002000300010000000800200020000000010000000000000000002000010000001b0300001b0300000700000000100000e901000000b0e8a502000049e7551ff1c2a03ff17995d4f3f241adf35954d7a87b543f48e7551ff1c3a03ff179bc17f3795487eb79543fc0b0ddf14b78543ff1b4d41632fc944be0c0563ed179e60b197f563ff190273df179bf3e412aeda9f3595485f579543f1987553ff1914c3df1796722677b743f856aeddaf159548dec91813ef179bd7df379544dc722d1e48491ed09f05954859979543f19c3553ff190733df1795e1fa60b3b519659245e820a2350831d781f8216264d88577a11fb73546c9e0b2646d11b214bd10d3c5ad1092650921c274cd10a315a9c0a744b9e59365ad10d265e921c3011df57747d881c7a11df735412cf59074a921a314c8259751ed13a3b51960b354b8415354b98163a4cdf577a35d1597901d1203b4ad11a3551d10a31519559395ad1003b4a835927509d0c20569e177b5c9e14395a9f0d271f900d744b991c745e9316225ad11435569d59355b950b7a11df7354c511b6cac511c2838b48c9899750f5818854b6c7c55fff99915eb199c552e48b865afb8fc512a4e0c511b6cac511bbc7c81cbbc7c81cbbc7c81cbbc7c81cbbc7c81cbbc7c81cbbc7c81cbbc7c81cbbe0ef65fe839611f9848011fe8b9611f7ca9550e49e8c52e3868443fa93c542fb8b895db6998c4bf3c4cb1f9ca28a41f3ca9016fa86c556f39ec542f9878011f09f8b11e1839159b683911f9ce0bc5ee3ca8650f8ca8f5eff84c55cf3ca8445b693845fff99915ed6849049f38ecb5ee48dc55ee4ca8a5fb6c99654f58e8047d68c9754f3848a55f3c48b54e2e0ef74f89e8043b69e8d54b6ba8442e59d8a43f2cadf11b6cae53196ea3ff17954d6f079543f414894b632c950f271bae4d6f079543fd24894b63287978ff2b4d4fc41f092b606f08d92c0a9ffdd0bbabd3cf179548f393a65ff78baede0f37954fe187bea37f1595492f0bab6c4708a3f3bf92c972d2390b84b00200089c689f7b9a5020000c1e902ad35f179543fabe2f7c3e9010000003231c089c3fec0cd80c3
oba
i~bintype[1]
.ie*
p8 10 @ entry0
EOF
EXPECT=<<EOF
elf
b32ae931000000000200
EOF
RUN

NAME=ob select files
FILE=malloc://1024
CMDS=<<EOF
e scr.null=true
o malloc://512
e scr.null=false
i~file[1]
obo 3
i~file[1]
obo 4
i~file[1]
obo 3
i~file[1]
EOF
EXPECT=<<EOF
malloc://512
malloc://1024
malloc://512
malloc://1024
EOF
RUN

NAME=ob select files binobj
FILE=bins/elf/libmagic.so
CMDS=<<EOF
iiq~?
e scr.null=true
o malloc://1024
e scr.null=false
iiq~?
EOF
EXPECT=<<EOF
38
0
EOF
RUN

NAME=ob select files binobj2
FILE=bins/elf/libmagic.so
CMDS=<<EOF
isq~?
e scr.null=true
o bins/elf/true32
e scr.null=false
isq~?
# raise back
op `ol~:0[0]`
isq~?
EOF
EXPECT=<<EOF
408
46
408
EOF
RUN

NAME=ob 0 fix
FILE=<<EOF
bins/elf/_Exit (42)
bins/elf/libverifyPass.so
bins/elf/libc.so.6
EOF
CMDS=<<EOF
obl~[0-1]
echo
ob 1; i~^fd
ob 2; i~^fd
ob 0; i~^fd
EOF
EXPECT=<<EOF
0 3
1 5
2 9

fd       5
fd       9
fd       3
EOF
RUN

NAME=oC
FILE==
CMDS=<<EOF
wx 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
s 0x10
px 16~:1
echo
oC $b
px 16~:1
echo
oml
echo
omp 1
px 16~:1
EOF
EXPECT=<<EOF
0x00000010  1011 1213 1415 1617 1819 1a1b 1c1d 1e1f  ................

0x00000010  2021 2223 2425 2627 2829 2a2b 2c2d 2e2f   !"#$%&'()*+,-./

 1 fd: 3 +0x00000000 0x00000000 - 0x000001ff rwx 
 2 fd: 4 +0x00000000 0x00000000 * 0x000000ff rwx 

0x00000010  1011 1213 1415 1617 1819 1a1b 1c1d 1e1f  ................
EOF
RUN

NAME=malloc ob fix
FILE=--
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
o malloc://1024
obl
EOF
EXPECT=<<EOF
0 3 x86-64 ba:0x00000000 sz:1024 malloc://1024
EOF
RUN

NAME=oblj
FILE==
ARGS=-a x86 -b 64
CMDS=<<EOF
oblj~{}
EOF
EXPECT=<<EOF
[
  {
    "name": "malloc://512",
    "iofd": 3,
    "bfid": 0,
    "size": 512,
    "obj": {
      "arch": "x86",
      "bits": 64,
      "binoffset": 0,
      "objsize": 512
    }
  }
]
EOF
RUN

NAME=o+ writable maps fix
FILE=--
CMDS=<<EOF
o+ bins/elf/ls
oml
# Possible parallelism problem
# echo
# pv1
# $old=`pv1`
# wx 0x90
# pv1
# wx `$old?`
# pv1
EOF
EXPECT=<<EOF
 1 fd: 4 +0x00000000 0x00023560 - 0x00023f17 rwx vmap.reloc-targets
 2 fd: 3 +0x00000000 0x00000000 - 0x0000347f rwx fmap.LOAD0
 3 fd: 3 +0x00004000 0x00004000 * 0x00016790 rwx fmap.LOAD1
 4 fd: 3 +0x00017000 0x00017000 - 0x0001f7bf rwx fmap.LOAD2
 5 fd: 5 +0x00000000 0x00022268 - 0x00023557 rwx mmap.LOAD3
 6 fd: 6 +0x00020050 0x00021050 - 0x00022267 rwx vmap.LOAD3
EOF
RUN

NAME=o--
FILE==
ARGS=-a x86 -b 64
CMDS=<<EOF
o =
ol~?
obl
echo --
o--
ol~?
obl
EOF
EXPECT=<<EOF
2
0 3 x86-64 ba:0x00000000 sz:512 malloc://512
1 4 x86-64 ba:0x00000000 sz:512 malloc://512
--
0
EOF
RUN

NAME=o- 3
FILE==
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
o =
o- 3
ol~?
obl
EOF
EXPECT=<<EOF
1
1 4 x86-64 ba:0x00000000 sz:512 malloc://512
EOF
RUN

NAME=oc
FILE=bins/elf/true32
CMDS=<<EOF
obl~?
i
oc =
echo --
obl~?
i
EOF
EXPECT=<<EOF
1
fd       3
file     bins/elf/true32
size     0x560c
humansz  21.5K
mode     r-x
format   elf
iorw     false
block    0x100
type     EXEC (Executable file)
arch     x86
cpu      N/A
baddr    0x08048000
binsz    0x000050bc
bintype  elf
bits     32
class    ELF32
compiler N/A
dbg_file N/A
endian   LE
hdr.csum N/A
guid     N/A
intrp    /lib/ld-linux.so.2
laddr    0x00000000
lang     c
machine  Intel 80386
maxopsz  16
minopsz  1
os       linux
cc       N/A
pcalign  0
relro    partial
rpath    NONE
subsys   linux
stripped true
crypto   false
havecode true
va       true
sanitiz  false
static   false
linenum  false
lsyms    false
canary   true
PIE      false
RELROCS  false
NX       true
--
1
fd      3
file    malloc://512
size    0x200
humansz 512
mode    rwx
format  any
iorw    true
block   0x100
type    
EOF
RUN

NAME=ob
FILE=bins/elf/true32
CMDS=<<EOF
ob.
obf bins/elf/ls
ob.
ob 0
ob.
EOF
EXPECT=<<EOF
0
1
0
EOF
RUN

NAME=ox
FILE=bins/elf/true32
CMDS=<<EOF
ol
oml
ox 3 4
ol
oml
EOF
EXPECT=<<EOF
 3 * r-x 0x0000560c bins/elf/true32
 4 - r-x 0x000000b0 vfile://0/reloc-targets
 5 - rw- 0x00000184 null://388
 1 fd: 4 +0x00000000 0x0804e248 - 0x0804e2f7 r-- vmap.reloc-targets
 2 fd: 3 +0x00000000 0x08048000 * 0x0804c657 r-x fmap.LOAD0
 3 fd: 5 +0x00000000 0x0804e0bc - 0x0804e23f rw- mmap.LOAD1
 4 fd: 3 +0x00004ef0 0x0804def0 - 0x0804e0bb r-- fmap.LOAD1
 3 - r-x 0x000000b0 vfile://0/reloc-targets
 4 * r-x 0x0000560c bins/elf/true32
 5 - rw- 0x00000184 null://388
 1 fd: 4 +0x00000000 0x0804e248 - 0x0804e2f7 r-- vmap.reloc-targets
 2 fd: 3 +0x00000000 0x08048000 * 0x0804c657 r-x fmap.LOAD0
 3 fd: 5 +0x00000000 0x0804e0bc - 0x0804e23f rw- mmap.LOAD1
 4 fd: 3 +0x00004ef0 0x0804def0 - 0x0804e0bb r-- fmap.LOAD1
EOF
RUN

NAME=ol quiet
FILE=bins/elf/true32
CMDS=<<EOF
olq
ol.
ol.q
EOF
EXPECT=<<EOF
3
4
5
 3 * r-x 0x0000560c bins/elf/true32
3
EOF
RUN

NAME=on+
FILE=bins/elf/true32
ARGS=-n
CMDS=<<EOF
cp `ol.t:uri:quiet` .true32-copy
on+ .true32-copy
p8 2
wx 9090
p8 2
o--
rm .true32-copy
EOF
EXPECT=<<EOF
7f45
9090
EOF
RUN

NAME=o=
FILE=bins/elf/true32
CMDS=<<EOF
o=
EOF
EXPECT=<<EOF
 3 * r-x 0x0000560c [#########################] bins/elf/true32
 4 - r-x 0x000000b0 [-------------------------] vfile://0/reloc-targets
 5 - rw- 0x00000184 [-------------------------] null://388
EOF
RUN

NAME=oa
FILE=bins/elf/true32
BROKEN=1
CMDS=<<EOF
pd 3
oa arm 64
pd 3
EOF
EXPECT=<<EOF
EOF
RUN

NAME=open priority
FILE=bins/elf/true32
CMDS=<<EOF
o bins/elf/true
op 3
ol~*
opn
opn
ol~*
opp
ol~*
opr
opr
ol~*
opr
ol~*
EOF
EXPECT=<<EOF
 3 * r-x 0x0000560c bins/elf/true32
 5 * rw- 0x00000184 null://388
 4 * r-x 0x000000b0 vfile://0/reloc-targets
11 * r-x 0x000087c0 vfile://1/patched
 3 * r-x 0x0000560c bins/elf/true32
EOF
RUN

NAME=open maps all VA
FILE=bins/elf/true32
CMDS=<<EOF
oml~true32
oma 3
oml~true32
EOF
EXPECT=<<EOF
 5 fd: 3 +0x00000000 0x00000000 * 0xfffffffffffffffe r-x bins/elf/true32
EOF
RUN

NAME=maps relocation
FILE==
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx 9090
pi 2
oml
omb 1 0x3000
oml
pi 2
pi 2 @ 0x3000
EOF
EXPECT=<<EOF
nop
nop
 1 fd: 3 +0x00000000 0x00000000 * 0x000001ff rwx 
 1 fd: 3 +0x00000000 0x00003000 - 0x000031ff rwx 
invalid
invalid
nop
nop
EOF
RUN

NAME=maps cur relocation and priority
FILE==
CMDS=<<EOF
o malloc://512
o malloc://512
o malloc://512
e asm.arch=x86
e asm.bits=64
omp 1
wx 9090
omp 2
wx c3c3
ompd 2
pi 2
oml
omb. 0x3000
omp 2
oml
pi 2
pi 2 @ 0x3000
EOF
EXPECT=<<EOF
nop
nop
 2 fd: 4 +0x00000000 0x00000000 - 0x000001ff rw- 
 3 fd: 5 +0x00000000 0x00000000 - 0x000001ff rw- 
 4 fd: 6 +0x00000000 0x00000000 - 0x000001ff rw- 
 1 fd: 3 +0x00000000 0x00000000 * 0x000001ff rwx 
 3 fd: 5 +0x00000000 0x00000000 - 0x000001ff rw- 
 4 fd: 6 +0x00000000 0x00000000 - 0x000001ff rw- 
 1 fd: 3 +0x00000000 0x00003000 - 0x000031ff rwx 
 2 fd: 4 +0x00000000 0x00000000 * 0x000001ff rw- 
ret
ret
nop
nop
EOF
RUN

NAME=maps_names
FILE==
CMDS=<<EOF
omn HelloMap
oml
omn-
oml
omni 1 HelloMap1
oml
omni- 1
oml
EOF
EXPECT=<<EOF
 1 fd: 3 +0x00000000 0x00000000 * 0x000001ff rwx HelloMap
 1 fd: 3 +0x00000000 0x00000000 * 0x000001ff rwx 
 1 fd: 3 +0x00000000 0x00000000 * 0x000001ff rwx HelloMap1
 1 fd: 3 +0x00000000 0x00000000 * 0x000001ff rwx 
EOF
RUN
