location_by_biggest_range() computed each location-list entry's PC-range
size as (begin - end). For a normal [begin, end) range (begin < end) this
underflows and wraps to a huge ut64, so the entry with the *smallest* span
was always chosen as a variable's single representative storage instead of
the largest.
This breaks functions whose register arguments and locals are described by
location lists, e.g.
item: [low, X): DW_OP_reg0 ; [X, high): DW_OP_reg8
input_buffer: [low, Y): DW_OP_reg1 ; [Y, high): DW_OP_reg10
with DW_AT_frame_base = DW_OP_call_frame_cfa (.debug_loc + DW_AT_GNU_locviews,
no .debug_loclists). The wrongly-picked short entry is frequently one that
does not resolve to a valid RzAnalysisVarStorage (e.g. an implicit
DW_OP_stack_value piece), leaving the variable with EVAL_PENDING storage. The
affected variables then fail to materialize and 'afv'/'afvl' reports nothing
for the whole function -- even though the arguments live plainly in registers
and need no CFA computation.
Computing the span as (end - begin) selects the genuinely largest range, so
each variable resolves to the register it occupies for most of the function
and the register arguments load correctly.
Co-authored-by: Anton Kochkov <anton.kochkov@gmail.com>
1263 lines
44 KiB
Text
1263 lines
44 KiB
Text
NAME=global variables list
|
|
FILE=bins/elf/float_ex1/float_ex1_globals
|
|
CMDS=<<EOF
|
|
aaa
|
|
avglt
|
|
EOF
|
|
EXPECT=<<EOF
|
|
name type size address decl_file decl_line decl_col
|
|
--------------------------------------------------------------------------------------------------------------------
|
|
bb const float 0x4 0x402010 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 16 13
|
|
b const float 0x4 0x402068 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 39 21
|
|
aa double 0x8 0x404038 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 17 8
|
|
a float 0x4 0x404040 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 38 15
|
|
staticsome some_t 0x16 0x404060 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 15 15
|
|
EOF
|
|
RUN
|
|
|
|
NAME=afvx
|
|
FILE=bins/elf/ls.odd
|
|
CMDS=<<EOF
|
|
af
|
|
afvx
|
|
afv=
|
|
EOF
|
|
EXPECT=<<EOF
|
|
afvR
|
|
arg3 0x5312
|
|
afvW
|
|
arg3
|
|
* arg3
|
|
R 0x5312 mov r9, rdx
|
|
EOF
|
|
RUN
|
|
|
|
NAME=afvx2
|
|
FILE=bins/mach0/mac-ls
|
|
CMDS=<<EOF
|
|
af
|
|
afvx
|
|
afv=
|
|
EOF
|
|
EXPECT=<<EOF
|
|
afvR
|
|
argv 0x10000106c
|
|
argc 0x10000106f
|
|
var_648h 0x100001072
|
|
var_650h 0x100001617,0x100001691
|
|
var_65ch 0x100001784
|
|
var_658h 0x10000173c,0x100001807,0x10000181c
|
|
var_654h 0x100001736,0x1000017dd,0x1000017f2
|
|
var_660h 0x1000017d4
|
|
var_668h 0x1000018f1
|
|
var_66ch 0x10000190b
|
|
var_678h 0x100001911
|
|
var_3ch 0x10000179e
|
|
var_448h 0x1000015f8
|
|
var_38h 0x1000010d6
|
|
var_36h 0x1000010f0
|
|
afvW
|
|
argv
|
|
argc
|
|
var_648h
|
|
var_650h 0x100001079
|
|
var_65ch 0x100001137,0x100001315
|
|
var_658h 0x10000114c,0x1000014f2
|
|
var_654h 0x100001156,0x1000012d8
|
|
var_660h 0x100001160,0x1000014ce
|
|
var_668h 0x100001597
|
|
var_66ch 0x1000015a3
|
|
var_678h 0x1000015ad
|
|
var_3ch
|
|
var_448h
|
|
var_38h
|
|
var_36h
|
|
* var_648h
|
|
R 0x100001072 lea rax, qword [var_648h]
|
|
* var_650h
|
|
R 0x100001617 lea rbx, qword [var_650h]
|
|
R 0x100001691 lea rsi, qword [var_650h]
|
|
W 0x100001079 mov qword [var_650h], rax
|
|
* var_65ch
|
|
R 0x100001784 cmp dword [var_65ch], 0x00
|
|
W 0x100001137 mov dword [var_65ch], 0x00
|
|
W 0x100001315 mov dword [var_65ch], 0x01
|
|
* var_658h
|
|
R 0x10000173c or ebx, dword [var_658h]
|
|
R 0x100001807 cmp dword [var_658h], 0x00
|
|
R 0x10000181c cmp dword [var_658h], 0x00
|
|
W 0x10000114c mov dword [var_658h], 0x00
|
|
W 0x1000014f2 mov dword [var_658h], 0x01
|
|
* var_654h
|
|
R 0x100001736 mov ebx, dword [var_654h]
|
|
R 0x1000017dd cmp dword [var_654h], 0x00
|
|
R 0x1000017f2 cmp dword [var_654h], 0x00
|
|
W 0x100001156 mov dword [var_654h], 0x00
|
|
W 0x1000012d8 mov dword [var_654h], 0x01
|
|
* var_660h
|
|
R 0x1000017d4 cmp dword [var_660h], 0x00
|
|
W 0x100001160 mov dword [var_660h], 0x00
|
|
W 0x1000014ce mov dword [var_660h], 0x01
|
|
* var_668h
|
|
R 0x1000018f1 mov rax, qword [var_668h]
|
|
W 0x100001597 mov qword [var_668h], rcx
|
|
* var_66ch
|
|
R 0x10000190b mov edi, dword [var_66ch]
|
|
W 0x1000015a3 mov dword [var_66ch], eax
|
|
* var_678h
|
|
R 0x100001911 mov rsi, qword [var_678h]
|
|
W 0x1000015ad mov qword [var_678h], rax
|
|
* var_3ch
|
|
R 0x10000179e lea rdi, qword [var_3ch]
|
|
* var_448h
|
|
R 0x1000015f8 lea rdi, qword [var_448h]
|
|
* var_38h
|
|
R 0x1000010d6 lea rdx, qword [var_38h]
|
|
* var_36h
|
|
R 0x1000010f0 movzx eax, word [var_36h]
|
|
* argv
|
|
R 0x10000106c mov rbx, rsi
|
|
* argc
|
|
R 0x10000106f mov r14d, edi
|
|
EOF
|
|
RUN
|
|
|
|
NAME=afvxa
|
|
FILE=bins/elf/ls.odd
|
|
CMDS=<<EOF
|
|
af
|
|
afv=
|
|
afvxv
|
|
EOF
|
|
EXPECT=<<EOF
|
|
* arg3
|
|
R 0x5312 mov r9, rdx
|
|
afvR
|
|
afvW
|
|
EOF
|
|
RUN
|
|
|
|
NAME=afvxa2
|
|
FILE=bins/mach0/mac-ls
|
|
CMDS=<<EOF
|
|
af
|
|
afv=
|
|
afvxa
|
|
EOF
|
|
EXPECT=<<EOF
|
|
* var_648h
|
|
R 0x100001072 lea rax, qword [var_648h]
|
|
* var_650h
|
|
R 0x100001617 lea rbx, qword [var_650h]
|
|
R 0x100001691 lea rsi, qword [var_650h]
|
|
W 0x100001079 mov qword [var_650h], rax
|
|
* var_65ch
|
|
R 0x100001784 cmp dword [var_65ch], 0x00
|
|
W 0x100001137 mov dword [var_65ch], 0x00
|
|
W 0x100001315 mov dword [var_65ch], 0x01
|
|
* var_658h
|
|
R 0x10000173c or ebx, dword [var_658h]
|
|
R 0x100001807 cmp dword [var_658h], 0x00
|
|
R 0x10000181c cmp dword [var_658h], 0x00
|
|
W 0x10000114c mov dword [var_658h], 0x00
|
|
W 0x1000014f2 mov dword [var_658h], 0x01
|
|
* var_654h
|
|
R 0x100001736 mov ebx, dword [var_654h]
|
|
R 0x1000017dd cmp dword [var_654h], 0x00
|
|
R 0x1000017f2 cmp dword [var_654h], 0x00
|
|
W 0x100001156 mov dword [var_654h], 0x00
|
|
W 0x1000012d8 mov dword [var_654h], 0x01
|
|
* var_660h
|
|
R 0x1000017d4 cmp dword [var_660h], 0x00
|
|
W 0x100001160 mov dword [var_660h], 0x00
|
|
W 0x1000014ce mov dword [var_660h], 0x01
|
|
* var_668h
|
|
R 0x1000018f1 mov rax, qword [var_668h]
|
|
W 0x100001597 mov qword [var_668h], rcx
|
|
* var_66ch
|
|
R 0x10000190b mov edi, dword [var_66ch]
|
|
W 0x1000015a3 mov dword [var_66ch], eax
|
|
* var_678h
|
|
R 0x100001911 mov rsi, qword [var_678h]
|
|
W 0x1000015ad mov qword [var_678h], rax
|
|
* var_3ch
|
|
R 0x10000179e lea rdi, qword [var_3ch]
|
|
* var_448h
|
|
R 0x1000015f8 lea rdi, qword [var_448h]
|
|
* var_38h
|
|
R 0x1000010d6 lea rdx, qword [var_38h]
|
|
* var_36h
|
|
R 0x1000010f0 movzx eax, word [var_36h]
|
|
* argv
|
|
R 0x10000106c mov rbx, rsi
|
|
* argc
|
|
R 0x10000106f mov r14d, edi
|
|
afvR
|
|
argv 0x10000106c
|
|
argc 0x10000106f
|
|
afvW
|
|
argv
|
|
argc
|
|
EOF
|
|
RUN
|
|
|
|
NAME=afvxv
|
|
FILE=bins/elf/ls.odd
|
|
CMDS=<<EOF
|
|
af
|
|
afv=
|
|
afvxv
|
|
EOF
|
|
EXPECT=<<EOF
|
|
* arg3
|
|
R 0x5312 mov r9, rdx
|
|
afvR
|
|
afvW
|
|
EOF
|
|
RUN
|
|
|
|
NAME=afvxv2
|
|
FILE=bins/mach0/mac-ls
|
|
CMDS=<<EOF
|
|
af
|
|
afv=
|
|
afvxv
|
|
EOF
|
|
EXPECT=<<EOF
|
|
* var_648h
|
|
R 0x100001072 lea rax, qword [var_648h]
|
|
* var_650h
|
|
R 0x100001617 lea rbx, qword [var_650h]
|
|
R 0x100001691 lea rsi, qword [var_650h]
|
|
W 0x100001079 mov qword [var_650h], rax
|
|
* var_65ch
|
|
R 0x100001784 cmp dword [var_65ch], 0x00
|
|
W 0x100001137 mov dword [var_65ch], 0x00
|
|
W 0x100001315 mov dword [var_65ch], 0x01
|
|
* var_658h
|
|
R 0x10000173c or ebx, dword [var_658h]
|
|
R 0x100001807 cmp dword [var_658h], 0x00
|
|
R 0x10000181c cmp dword [var_658h], 0x00
|
|
W 0x10000114c mov dword [var_658h], 0x00
|
|
W 0x1000014f2 mov dword [var_658h], 0x01
|
|
* var_654h
|
|
R 0x100001736 mov ebx, dword [var_654h]
|
|
R 0x1000017dd cmp dword [var_654h], 0x00
|
|
R 0x1000017f2 cmp dword [var_654h], 0x00
|
|
W 0x100001156 mov dword [var_654h], 0x00
|
|
W 0x1000012d8 mov dword [var_654h], 0x01
|
|
* var_660h
|
|
R 0x1000017d4 cmp dword [var_660h], 0x00
|
|
W 0x100001160 mov dword [var_660h], 0x00
|
|
W 0x1000014ce mov dword [var_660h], 0x01
|
|
* var_668h
|
|
R 0x1000018f1 mov rax, qword [var_668h]
|
|
W 0x100001597 mov qword [var_668h], rcx
|
|
* var_66ch
|
|
R 0x10000190b mov edi, dword [var_66ch]
|
|
W 0x1000015a3 mov dword [var_66ch], eax
|
|
* var_678h
|
|
R 0x100001911 mov rsi, qword [var_678h]
|
|
W 0x1000015ad mov qword [var_678h], rax
|
|
* var_3ch
|
|
R 0x10000179e lea rdi, qword [var_3ch]
|
|
* var_448h
|
|
R 0x1000015f8 lea rdi, qword [var_448h]
|
|
* var_38h
|
|
R 0x1000010d6 lea rdx, qword [var_38h]
|
|
* var_36h
|
|
R 0x1000010f0 movzx eax, word [var_36h]
|
|
* argv
|
|
R 0x10000106c mov rbx, rsi
|
|
* argc
|
|
R 0x10000106f mov r14d, edi
|
|
afvR
|
|
var_648h 0x100001072
|
|
var_650h 0x100001617,0x100001691
|
|
var_65ch 0x100001784
|
|
var_658h 0x10000173c,0x100001807,0x10000181c
|
|
var_654h 0x100001736,0x1000017dd,0x1000017f2
|
|
var_660h 0x1000017d4
|
|
var_668h 0x1000018f1
|
|
var_66ch 0x10000190b
|
|
var_678h 0x100001911
|
|
var_3ch 0x10000179e
|
|
var_448h 0x1000015f8
|
|
var_38h 0x1000010d6
|
|
var_36h 0x1000010f0
|
|
afvW
|
|
var_648h
|
|
var_650h 0x100001079
|
|
var_65ch 0x100001137,0x100001315
|
|
var_658h 0x10000114c,0x1000014f2
|
|
var_654h 0x100001156,0x1000012d8
|
|
var_660h 0x100001160,0x1000014ce
|
|
var_668h 0x100001597
|
|
var_66ch 0x1000015a3
|
|
var_678h 0x1000015ad
|
|
var_3ch
|
|
var_448h
|
|
var_38h
|
|
var_36h
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Detect register args used only by callee
|
|
FILE==
|
|
CMDS=<<EOF
|
|
e asm.bytes=true
|
|
e asm.arch=x86
|
|
e asm.bits=64
|
|
e analysis.cc=ms
|
|
wx 40534883ec20418bd8e80a00000003c34883c4205bc3cccc2bca8bc1c3
|
|
aa
|
|
pd 13
|
|
EOF
|
|
EXPECT=<<EOF
|
|
/ fcn.00000000(int64_t arg1, int64_t arg2, int64_t arg3);
|
|
| ; arg int64_t arg1 @ rcx
|
|
| ; arg int64_t arg2 @ rdx
|
|
| ; arg int64_t arg3 @ r8
|
|
| 0x00000000 4053 push rbx
|
|
| 0x00000002 4883ec20 sub rsp, 0x20
|
|
| 0x00000006 418bd8 mov ebx, r8d ; arg3
|
|
| 0x00000009 e80a000000 call fcn.00000018
|
|
| 0x0000000e 03c3 add eax, ebx
|
|
| 0x00000010 4883c420 add rsp, 0x20
|
|
| 0x00000014 5b pop rbx
|
|
\ 0x00000015 c3 ret
|
|
0x00000016 cc int3
|
|
0x00000017 cc int3
|
|
; CALL XREF from fcn.00000000 @ 0x9
|
|
/ fcn.00000018(int64_t arg1, int64_t arg2);
|
|
| ; arg int64_t arg1 @ rcx
|
|
| ; arg int64_t arg2 @ rdx
|
|
| 0x00000018 2bca sub ecx, edx ; arg2
|
|
| 0x0000001a 8bc1 mov eax, ecx ; arg1
|
|
\ 0x0000001c c3 ret
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Detect register args type used only by callees
|
|
FILE=bins/pe/rarg_detection.dll
|
|
CMDS=<<EOF
|
|
s sym.rarg_detection.dll_funcB
|
|
af
|
|
s sym.rarg_detection.dll_funcC
|
|
af
|
|
afvl
|
|
EOF
|
|
EXPECT=<<EOF
|
|
arg int64_t arg3 @ r8
|
|
arg const char *s @ rcx
|
|
arg int64_t arg2 @ rdx
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Variables in register save stack area
|
|
FILE=bins/pe/testx64.exe
|
|
CMDS=<<EOF
|
|
s 0x14000184c
|
|
af
|
|
afvl
|
|
EOF
|
|
EXPECT=<<EOF
|
|
var int64_t var_8h @ stack + 0x8
|
|
var int64_t var_10h @ stack + 0x10
|
|
var int64_t var_18h @ stack + 0x18
|
|
var int64_t var_20h @ stack + 0x20
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Variable access with misc registers (x86)
|
|
FILE==
|
|
ARGS=-a x86 -b 64
|
|
CMDS=<<EOF
|
|
e asm.flags=false
|
|
e asm.bytes=true
|
|
e analysis.cc=ms
|
|
wx 488bc448895808488970104889781841574881ecb00000008364242000488d48884c8d9c24b0000000498b5b10498b7318498b7b20498be3415fc3
|
|
af
|
|
aaef
|
|
afvx
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
afvR
|
|
var_98h 0x18
|
|
var_8h 0x21
|
|
var_0h
|
|
var_s8h 0x29
|
|
var_s10h 0x2d
|
|
var_s18h 0x31
|
|
var_78h
|
|
afvW
|
|
var_98h 0x18
|
|
var_8h
|
|
var_0h
|
|
var_s8h 0x3
|
|
var_s10h 0x7
|
|
var_s18h 0xb
|
|
var_78h
|
|
/ fcn.00000000();
|
|
| ; var int64_t var_98h @ stack - 0x98
|
|
| ; var int64_t var_78h @ stack - 0x78
|
|
| ; var int64_t var_8h @ stack - 0x8
|
|
| ; var int64_t var_0h @ stack + 0x0
|
|
| ; var int64_t var_s8h @ stack + 0x8
|
|
| ; var int64_t var_s10h @ stack + 0x10
|
|
| ; var int64_t var_s18h @ stack + 0x18
|
|
| 0x00000000 488bc4 mov rax, rsp
|
|
| 0x00000003 48895808 mov qword [var_s8h], rbx
|
|
| 0x00000007 48897010 mov qword [var_s10h], rsi
|
|
| 0x0000000b 48897818 mov qword [var_s18h], rdi
|
|
| 0x0000000f 4157 push r15
|
|
| 0x00000011 4881ecb00000. sub rsp, 0xb0
|
|
| 0x00000018 8364242000 and dword [var_98h], 0x00
|
|
| 0x0000001d 488d4888 lea rcx, qword [var_78h]
|
|
| 0x00000021 4c8d9c24b000. lea r11, qword [var_8h]
|
|
| 0x00000029 498b5b10 mov rbx, qword [var_s8h]
|
|
| 0x0000002d 498b7318 mov rsi, qword [var_s10h]
|
|
| 0x00000031 498b7b20 mov rdi, qword [var_s18h]
|
|
| 0x00000035 498be3 mov rsp, r11
|
|
| 0x00000038 415f pop r15
|
|
\ 0x0000003a c3 ret
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Variable access with misc registers (ARM)
|
|
FILE==
|
|
ARGS=-a arm -b 16
|
|
CMDS=<<EOF
|
|
e asm.bytes=true
|
|
e asm.flags=false
|
|
e asm.comments=false
|
|
e cfg.bigendian=false
|
|
wx 80b483b000af78600b467b8013467b707b78002b03d07a887b689a6103e07b881a047b689a6100bf0c37bd465df8047b7047
|
|
af
|
|
aaef
|
|
afvx
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
afvR
|
|
arg1 0x6
|
|
arg2 0x8
|
|
arg3 0xc
|
|
var_10h
|
|
var_ch 0x18,0x22
|
|
var_eh 0x16,0x1e
|
|
var_fh 0x10
|
|
var_4h
|
|
afvW
|
|
arg1
|
|
arg2
|
|
arg3
|
|
var_10h
|
|
var_ch 0x6
|
|
var_eh 0xa
|
|
var_fh 0xe
|
|
var_4h
|
|
/ fcn.00000000(int16_t arg1, int16_t arg2, int16_t arg3);
|
|
| ; arg int16_t arg1 @ r0
|
|
| ; arg int16_t arg2 @ r1
|
|
| ; arg int16_t arg3 @ r2
|
|
| ; var int32_t var_10h @ stack - 0x10
|
|
| ; var int8_t var_fh @ stack - 0xf
|
|
| ; var int16_t var_eh @ stack - 0xe
|
|
| ; var int32_t var_ch @ stack - 0xc
|
|
| ; var int32_t var_4h @ stack - 0x4
|
|
| 0x00000000 80b4 push {r7}
|
|
| 0x00000002 83b0 sub sp, 0xc
|
|
| 0x00000004 00af add r7, var_10h
|
|
| 0x00000006 7860 str r0, [var_ch]
|
|
| 0x00000008 0b46 mov r3, r1
|
|
| 0x0000000a 7b80 strh r3, [var_eh]
|
|
| 0x0000000c 1346 mov r3, r2
|
|
| 0x0000000e 7b70 strb r3, [var_fh]
|
|
| 0x00000010 7b78 ldrb r3, [var_fh]
|
|
| 0x00000012 002b cmp r3, 0
|
|
| ,=< 0x00000014 03d0 beq 0x1e
|
|
| | 0x00000016 7a88 ldrh r2, [var_eh]
|
|
| | 0x00000018 7b68 ldr r3, [var_ch]
|
|
| | 0x0000001a 9a61 str r2, [r3, 0x18]
|
|
| ,==< 0x0000001c 03e0 b 0x26
|
|
| |`-> 0x0000001e 7b88 ldrh r3, [var_eh]
|
|
| | 0x00000020 1a04 lsls r2, r3, 0x10
|
|
| | 0x00000022 7b68 ldr r3, [var_ch]
|
|
| | 0x00000024 9a61 str r2, [r3, 0x18]
|
|
| `--> 0x00000026 00bf nop
|
|
| 0x00000028 0c37 adds r7, 0xc
|
|
| 0x0000002a bd46 mov sp, r7
|
|
| 0x0000002c 5df8047b pop {r7}
|
|
\ 0x00000030 7047 bx lr
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Takeover variables
|
|
FILE==
|
|
ARGS=-a x86 -b 32
|
|
CMDS=<<EOF
|
|
wx e805000000e80600000039d1742577145589e583ec048b5d088b4d0c895dfc83f90174098b45fc8945fc49ebf28b45fc89ec5dc3
|
|
aac
|
|
afvl @ 10
|
|
afvx @ 10
|
|
afvl @ 16
|
|
afvx @ 16
|
|
EOF
|
|
EXPECT=<<EOF
|
|
afvR
|
|
afvW
|
|
var int32_t var_8h @ stack - 0x4
|
|
arg int32_t var_4h @ stack + 0x0
|
|
arg int32_t arg_4h @ stack + 0x8
|
|
arg int32_t arg_8h @ stack + 0xc
|
|
afvR
|
|
arg_4h 0x16
|
|
arg_8h 0x19
|
|
var_4h 0x24,0x2d
|
|
var_8h
|
|
afvW
|
|
arg_4h
|
|
arg_8h
|
|
var_4h 0x27
|
|
var_8h 0x1c
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Analyze function with 0 basic blocks
|
|
FILE=bins/elf/ls
|
|
CMDS=<<EOF
|
|
af+ a @ 0
|
|
aa
|
|
EOF
|
|
EXPECT=
|
|
RUN
|
|
|
|
NAME=Analyze vars accessed from bp (x86)
|
|
FILE=bins/elf/vars-x86_64-bp
|
|
CMDS=<<EOF
|
|
s sym.varfunc
|
|
af
|
|
afvl
|
|
EOF
|
|
EXPECT=<<EOF
|
|
var int64_t var_18h @ stack - 0x18
|
|
var int64_t var_14h @ stack - 0x14
|
|
var int64_t var_10h @ stack - 0x10
|
|
var int64_t var_ch @ stack - 0xc
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Vars from dwarf accessed from bp (x86)
|
|
FILE=bins/elf/vars-x86_64-bp
|
|
CMDS=<<EOF
|
|
aaa
|
|
s sym.varfunc
|
|
e asm.comments=0
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
/ int varfunc()
|
|
| ; var int lightbulb @ stack - 0x18
|
|
| ; var int sun @ stack - 0x14
|
|
| ; var int last @ stack - 0x10
|
|
| ; var int chance @ stack - 0xc
|
|
| 0x0000113c push rbp ; main.c:9
|
|
| 0x0000113d mov rbp, rsp
|
|
| 0x00001140 sub rsp, 0x10
|
|
| 0x00001144 mov dword [lightbulb], 0x01 ; main.c:15
|
|
| 0x0000114b mov dword [sun], 0x02 ; main.c:16
|
|
| 0x00001152 mov dword [last], 0x03 ; main.c:17
|
|
| 0x00001159 mov dword [chance], 0x04 ; main.c:18
|
|
| 0x00001160 mov eax, 0x00 ; main.c:20
|
|
| 0x00001165 call dbg.leaffunc
|
|
| 0x0000116a mov eax, dword [chance] ; main.c:22
|
|
| 0x0000116d mov dword [sun], eax
|
|
| 0x00001170 mov eax, dword [lightbulb] ; main.c:23
|
|
| 0x00001173 leave ; main.c:24
|
|
\ 0x00001174 ret
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Analyze vars accessed from sp (x86)
|
|
FILE=bins/elf/vars-x86_64-sp
|
|
CMDS=<<EOF
|
|
s sym.varfunc
|
|
af
|
|
afvl
|
|
EOF
|
|
EXPECT=<<EOF
|
|
var int64_t var_10h @ stack - 0x10
|
|
var int64_t var_ch @ stack - 0xc
|
|
var int64_t var_8h @ stack - 0x8
|
|
var int64_t var_4h @ stack - 0x4
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Vars from dwarf accessed from sp (x86)
|
|
FILE=bins/elf/vars-x86_64-sp
|
|
CMDS=<<EOF
|
|
aaa
|
|
s sym.varfunc
|
|
e asm.comments=0
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
/ int varfunc()
|
|
| ; var int lightbulb @ stack - 0x10
|
|
| ; var int sun @ stack - 0xc
|
|
| ; var int last @ stack - 0x8
|
|
| ; var int chance @ stack - 0x4
|
|
| 0x00001137 sub rsp, 0x10 ; main.c:9
|
|
| 0x0000113b mov dword [rsp], 0x01 ; main.c:15
|
|
| 0x00001142 mov dword [sun], 0x02 ; main.c:16
|
|
| 0x0000114a mov dword [last], 0x03 ; main.c:17
|
|
| 0x00001152 mov dword [chance], 0x04 ; main.c:18
|
|
| 0x0000115a mov eax, 0x00 ; main.c:20
|
|
| 0x0000115f call dbg.leaffunc
|
|
| 0x00001164 mov eax, dword [chance] ; main.c:22
|
|
| 0x00001168 mov dword [sun], eax
|
|
| 0x0000116c mov eax, dword [rsp] ; main.c:23
|
|
| 0x0000116f add rsp, 0x10 ; main.c:24
|
|
\ 0x00001173 ret
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Vars and Args from dwarf accessed from sp (x86)
|
|
FILE=bins/elf/vars_args/example.x64
|
|
CMDS=<<EOF
|
|
aaa
|
|
s dbg.foo
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
; CALL XREF from dbg.main @ 0x11c0
|
|
/ int foo(int num)
|
|
| ; var int64_t arg1 @ rdi
|
|
| ; arg int num @ stack - 0x2c
|
|
| ; var int int_one @ stack - 0x20
|
|
| ; var long int long_twenty @ stack - 0x18
|
|
| ; var short int minus_seven @ stack - 0x24
|
|
| ; var int mult_int @ stack - 0x1c
|
|
| ; var long int add_long @ stack - 0x10
|
|
| ; var short int sub_short @ stack - 0x22
|
|
| 0x00001139 push rbp ; example.c:3
|
|
| 0x0000113a mov rbp, rsp
|
|
| 0x0000113d sub rsp, 0x30
|
|
| 0x00001141 mov dword [num], edi ; arg1
|
|
| 0x00001144 mov dword [int_one], 0x01 ; example.c:4
|
|
| 0x0000114b mov qword [long_twenty], 0x14 ; example.c:5
|
|
| 0x00001153 mov word [minus_seven], 0xfff9 ; example.c:6
|
|
| 0x00001159 mov edx, dword [int_one] ; example.c:7
|
|
| 0x0000115c mov eax, edx
|
|
| 0x0000115e add eax, eax
|
|
| 0x00001160 add eax, edx
|
|
| 0x00001162 add eax, eax
|
|
| 0x00001164 mov dword [mult_int], eax
|
|
| 0x00001167 mov rax, qword [long_twenty] ; example.c:8
|
|
| 0x0000116b add rax, 0x07
|
|
| 0x0000116f mov qword [add_long], rax
|
|
| 0x00001173 movzx eax, word [minus_seven] ; example.c:9
|
|
| 0x00001177 sub eax, 0x09
|
|
| 0x0000117a mov word [sub_short], ax
|
|
| 0x0000117e movsx esi, word [sub_short] ; example.c:11
|
|
| 0x00001182 mov rcx, qword [add_long]
|
|
| 0x00001186 mov edx, dword [mult_int]
|
|
| 0x00001189 mov eax, dword [num]
|
|
| 0x0000118c mov r8d, esi
|
|
| 0x0000118f mov esi, eax
|
|
| 0x00001191 lea rax, qword str.result__d__d__ld__ld ; 0x2004 ; "result %d %d %ld %ld\n"
|
|
| 0x00001198 mov rdi, rax ; const char *format
|
|
| 0x0000119b mov eax, 0x00
|
|
| 0x000011a0 call sym.imp.printf ; int printf(const char *format)
|
|
| 0x000011a5 mov eax, 0x0a ; example.c:13
|
|
| 0x000011aa leave ; example.c:14
|
|
\ 0x000011ab ret
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Function arguments from DWARF (arm)
|
|
FILE=bins/elf/float_ex1/float_ex1_arm
|
|
CMDS=<<EOF
|
|
aaa
|
|
s sym.fn1
|
|
e asm.comments=0
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
;-- fn1:
|
|
/ dbg.fn1 (int a, char *g, double q, struct Some *gg, some_t **out);
|
|
| ; var int16_t var_20h @ stack - 0x20
|
|
| ; arg some_t **out @ stack - 0x1e
|
|
| ; arg struct Some *gg @ stack - 0x1a
|
|
| ; arg double q @ stack - 0x16
|
|
| ; arg char *g @ stack - 0xe
|
|
| ; arg int a @ stack - 0xa
|
|
| 0x000005e0 push {r7, lr}
|
|
| 0x000005e2 sub sp, 0x18
|
|
| 0x000005e4 add r7, var_20h
|
|
| 0x000005e6 str r0, [r7, 0x14]
|
|
| 0x000005e8 str r1, [r7, 0x10]
|
|
| 0x000005ea vstr d0, [r7, 8]
|
|
| 0x000005ee str r2, [r7, 4]
|
|
| 0x000005f0 str r3, [r7]
|
|
| 0x000005f2 ldr r3, [r7, 4]
|
|
| 0x000005f4 cmp r3, 0
|
|
| ,=< 0x000005f6 beq 0x5fe
|
|
| | 0x000005f8 ldr r3, [r7]
|
|
| | 0x000005fa cmp r3, 0
|
|
| ,==< 0x000005fc bne 0x602
|
|
| |`-> 0x000005fe movs r3, 0
|
|
| |,=< 0x00000600 b 0x642
|
|
| `--> 0x00000602 movs r0, 0x14
|
|
| | 0x00000604 blx sym.imp.malloc
|
|
| | 0x00000608 mov r3, r0
|
|
| | 0x0000060a mov r2, r3
|
|
| | 0x0000060c ldr r3, [r7]
|
|
| | 0x0000060e str r2, [r3]
|
|
| | 0x00000610 ldr r3, [r7]
|
|
| | 0x00000612 ldr r3, [r3]
|
|
| | 0x00000614 ldr r2, [r7, 0x14]
|
|
| | 0x00000616 str r2, [r3]
|
|
| | 0x00000618 ldr r3, [r7]
|
|
| | 0x0000061a ldr r3, [r3]
|
|
| | 0x0000061c adds r3, 4
|
|
| | 0x0000061e movs r2, 5
|
|
| | 0x00000620 ldr r1, [r7, 0x10]
|
|
| | 0x00000622 mov r0, r3
|
|
| | 0x00000624 blx sym.imp.strncpy
|
|
| | 0x00000628 ldr r3, [r7]
|
|
| | 0x0000062a ldr r3, [r3]
|
|
| | 0x0000062c vldr d7, [r7, 8]
|
|
| | 0x00000630 vcvt.f32.f64 s15, d7
|
|
| | 0x00000634 vstr s15, [r3, 0xc]
|
|
| | 0x00000638 ldr r3, [r7]
|
|
| | 0x0000063a ldr r3, [r3]
|
|
| | 0x0000063c ldr r2, [r7, 4]
|
|
| | 0x0000063e str r2, [r3, 0x10]
|
|
| | 0x00000640 movs r3, 1
|
|
| `-> 0x00000642 mov r0, r3
|
|
| 0x00000644 adds r7, 0x18
|
|
| 0x00000646 mov sp, r7
|
|
\ 0x00000648 pop {r7, pc}
|
|
EOF
|
|
BROKEN=1
|
|
RUN
|
|
|
|
NAME=Function arguments from DWARF (arm_nodebug)
|
|
FILE=bins/elf/float_ex1/float_ex1_arm_nodebug
|
|
BROKEN=1
|
|
CMDS=<<EOF
|
|
aaa
|
|
s sym.fn1
|
|
e asm.comments=0
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
/ sym.fn1 (int16_t arg1, int16_t arg2, int16_t arg3, int16_t arg4);
|
|
| ; arg int16_t arg1 @ r0
|
|
| ; arg int16_t arg2 @ r1
|
|
| ; arg int16_t arg3 @ r2
|
|
| ; arg int16_t arg4 @ r3
|
|
| ; var int16_t var_20h @ stack - 0x20
|
|
| 0x000005e0 push {r7, lr}
|
|
| 0x000005e2 sub sp, 0x18
|
|
| 0x000005e4 add r7, var_20h
|
|
| 0x000005e6 str r0, [r7, 0x14]
|
|
| 0x000005e8 str r1, [r7, 0x10]
|
|
| 0x000005ea vstr d0, [r7, 8]
|
|
| 0x000005ee str r2, [r7, 4]
|
|
| 0x000005f0 str r3, [r7]
|
|
| 0x000005f2 ldr r3, [r7, 4]
|
|
| 0x000005f4 cmp r3, 0
|
|
| ,=< 0x000005f6 beq 0x5fe
|
|
| | 0x000005f8 ldr r3, [r7]
|
|
| | 0x000005fa cmp r3, 0
|
|
| ,==< 0x000005fc bne 0x602
|
|
| |`-> 0x000005fe movs r3, 0
|
|
| |,=< 0x00000600 b 0x642
|
|
| `--> 0x00000602 movs r0, 0x14
|
|
| | 0x00000604 blx sym.imp.malloc
|
|
| | 0x00000608 mov r3, r0
|
|
| | 0x0000060a mov r2, r3
|
|
| | 0x0000060c ldr r3, [r7]
|
|
| | 0x0000060e str r2, [r3]
|
|
| | 0x00000610 ldr r3, [r7]
|
|
| | 0x00000612 ldr r3, [r3]
|
|
| | 0x00000614 ldr r2, [r7, 0x14]
|
|
| | 0x00000616 str r2, [r3]
|
|
| | 0x00000618 ldr r3, [r7]
|
|
| | 0x0000061a ldr r3, [r3]
|
|
| | 0x0000061c adds r3, 4
|
|
| | 0x0000061e movs r2, 5
|
|
| | 0x00000620 ldr r1, [r7, 0x10]
|
|
| | 0x00000622 mov r0, r3
|
|
| | 0x00000624 blx sym.imp.strncpy
|
|
| | 0x00000628 ldr r3, [r7]
|
|
| | 0x0000062a ldr r3, [r3]
|
|
| | 0x0000062c vldr d7, [r7, 8]
|
|
| | 0x00000630 vcvt.f32.f64 s15, d7
|
|
| | 0x00000634 vstr s15, [r3, 0xc]
|
|
| | 0x00000638 ldr r3, [r7]
|
|
| | 0x0000063a ldr r3, [r3]
|
|
| | 0x0000063c ldr r2, [r7, 4]
|
|
| | 0x0000063e str r2, [r3, 0x10]
|
|
| | 0x00000640 movs r3, 1
|
|
| `-> 0x00000642 mov r0, r3
|
|
| 0x00000644 adds r7, 0x18
|
|
| 0x00000646 mov sp, r7
|
|
\ 0x00000648 pop {r7, pc}
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Function arguments from DWARF (arm_stripped)
|
|
FILE=bins/elf/float_ex1/float_ex1_arm_stripped
|
|
BROKEN=1
|
|
CMDS=<<EOF
|
|
aaa
|
|
s 0x5e0
|
|
e asm.comments=0
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
/ fcn.000005e0 (int16_t arg1, int16_t arg2, int16_t arg3, int16_t arg4);
|
|
| ; arg int16_t arg1 @ r0
|
|
| ; arg int16_t arg2 @ r1
|
|
| ; arg int16_t arg3 @ r2
|
|
| ; arg int16_t arg4 @ r3
|
|
| ; var int16_t var_20h @ stack - 0x20
|
|
| 0x000005e0 push {r7, lr}
|
|
| 0x000005e2 sub sp, 0x18
|
|
| 0x000005e4 add r7, var_20h
|
|
| 0x000005e6 str r0, [r7, 0x14]
|
|
| 0x000005e8 str r1, [r7, 0x10]
|
|
| 0x000005ea vstr d0, [r7, 8]
|
|
| 0x000005ee str r2, [r7, 4]
|
|
| 0x000005f0 str r3, [r7]
|
|
| 0x000005f2 ldr r3, [r7, 4]
|
|
| 0x000005f4 cmp r3, 0
|
|
| ,=< 0x000005f6 beq 0x5fe
|
|
| | 0x000005f8 ldr r3, [r7]
|
|
| | 0x000005fa cmp r3, 0
|
|
| ,==< 0x000005fc bne 0x602
|
|
| |`-> 0x000005fe movs r3, 0
|
|
| |,=< 0x00000600 b 0x642
|
|
| `--> 0x00000602 movs r0, 0x14
|
|
| | 0x00000604 blx sym.imp.malloc
|
|
| | 0x00000608 mov r3, r0
|
|
| | 0x0000060a mov r2, r3
|
|
| | 0x0000060c ldr r3, [r7]
|
|
| | 0x0000060e str r2, [r3]
|
|
| | 0x00000610 ldr r3, [r7]
|
|
| | 0x00000612 ldr r3, [r3]
|
|
| | 0x00000614 ldr r2, [r7, 0x14]
|
|
| | ;-- aav.0x00000616:
|
|
| | 0x00000616 str r2, [r3]
|
|
| | 0x00000618 ldr r3, [r7]
|
|
| | 0x0000061a ldr r3, [r3]
|
|
| | 0x0000061c adds r3, 4
|
|
| | 0x0000061e movs r2, 5
|
|
| | 0x00000620 ldr r1, [r7, 0x10]
|
|
| | 0x00000622 mov r0, r3
|
|
| | 0x00000624 blx sym.imp.strncpy
|
|
| | 0x00000628 ldr r3, [r7]
|
|
| | 0x0000062a ldr r3, [r3]
|
|
| | 0x0000062c vldr d7, [r7, 8]
|
|
| | 0x00000630 vcvt.f32.f64 s15, d7
|
|
| | 0x00000634 vstr s15, [r3, 0xc]
|
|
| | 0x00000638 ldr r3, [r7]
|
|
| | 0x0000063a ldr r3, [r3]
|
|
| | 0x0000063c ldr r2, [r7, 4]
|
|
| | 0x0000063e str r2, [r3, 0x10]
|
|
| | 0x00000640 movs r3, 1
|
|
| `-> 0x00000642 mov r0, r3
|
|
| 0x00000644 adds r7, 0x18
|
|
| 0x00000646 mov sp, r7
|
|
\ 0x00000648 pop {r7, pc}
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Function va_args arguments from DWARF
|
|
FILE=bins/elf/float_ex1/float_ex1_hightec
|
|
CMDS=<<EOF
|
|
aaa
|
|
(sig; afvl; afvlt; afs; pd 1; echo "---------")
|
|
s dbg.printf
|
|
.(sig)
|
|
s dbg.prout
|
|
.(sig)
|
|
s dbg._fpadd_parts
|
|
.(sig)
|
|
s dbg.strnlen_s
|
|
.(sig)
|
|
s dbg._Wctomb
|
|
.(sig)
|
|
s dbg._Mbtowc
|
|
.(sig)
|
|
s dbg.feraiseexcept
|
|
.(sig)
|
|
s dbg._Atrealloc
|
|
.(sig)
|
|
s dbg.fn1
|
|
.(sig)
|
|
EOF
|
|
EXPECT=<<EOF
|
|
var va_list ap @ stack + 0x4
|
|
var int32_t arg5 @ a4
|
|
arg const char *fmt @ a6
|
|
var int ans @ ...
|
|
is_arg name type constraints origin addr
|
|
-----------------------------------------------------------------------------------------------------------------------------------------
|
|
false ap va_list DWARF loclist: [(0x80000c22, 20): CFA+0, (0x80000c36, 5): a7, (0x80000c3b, 1): CFA+0]
|
|
false arg5 int32_t rizin a4
|
|
true fmt const char * DWARF loclist: [(0x80000c22, 10): a4, (0x80000c2c, 15): a6, (0x80000c3b, 1): <evaluation waiting>]
|
|
false ans int DWARF empty
|
|
int printf(const char *fmt, ...);
|
|
; CALL XREFS from dbg.main @ 0x8000054e, 0x80000636
|
|
/ int printf(const char *fmt, ...)
|
|
| ; var int32_t arg5 @ a4
|
|
| ; arg const char *fmt @ a6
|
|
| ; var int ans @ ...
|
|
| ; var va_list ap @ stack + 0x4
|
|
| 0x80000c22 mov.aa a6, a4 ; printf.c:10 ; arg5
|
|
---------
|
|
arg void *str @ a15
|
|
var int32_t arg5 @ a4
|
|
arg const char *buf @ a5
|
|
arg size_t n @ d4
|
|
is_arg name type constraints origin addr
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
true str void * DWARF loclist: [(0x80000c04, 6): a4, (0x80000c0a, 24): a15]
|
|
false arg5 int32_t rizin a4
|
|
true buf const char * DWARF loclist: [(0x80000c04, 12): a5, (0x80000c10, 3): a4, (0x80000c13, 15): <evaluation waiting>]
|
|
true n size_t DWARF loclist: [(0x80000c04, 10): d4, (0x80000c0e, 5): d5, (0x80000c13, 7): d15, (0x80000c1a, 8): <evaluation waiting>]
|
|
void * prout(void *str, const char *buf, size_t n);
|
|
/ void * prout(void *str, const char *buf, size_t n)
|
|
| ; var int32_t arg5 @ a4
|
|
| ; arg void *str @ a15
|
|
| ; arg const char *buf @ a5
|
|
| ; arg size_t n @ d4
|
|
| 0x80000c04 mov.aa a15, a4 ; printf.c:5 ; arg5
|
|
---------
|
|
arg fp_number_type *b @ a12
|
|
arg fp_number_type *a @ a13
|
|
arg fp_number_type *tmp @ a15
|
|
var int32_t arg5 @ a4
|
|
var int32_t arg6 @ a5
|
|
var int32_t arg7 @ a6
|
|
var int a_normal_exp @ d15
|
|
var int b_normal_exp @ d2
|
|
var fractype a_fraction @ COMPOSITE
|
|
var intfrac tfraction @ COMPOSITE
|
|
var fractype b_fraction @ COMPOSITE
|
|
is_arg name type constraints origin addr
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
true b fp_number_type * DWARF loclist: [(0x80003c60, 44): a5, (0x80003c8c, 2): a2, (0x80003c8e, 4): a5, (0x80003c92, 6): a2, (0x80003c98, 28): a5, (0x80003cb4, 2): a2, (0x80003cb6, 4): a5, (0x80003cba, 47): a2, (0x80003ce9, 39): a12, (0x80003d10, 13): a2, (0x80003d1d, 41): a12, (0x80003d46, 16): a2, (0x80003d56, 172): a12, (0x80003e02, 2): <evaluation waiting>]
|
|
true a fp_number_type * DWARF loclist: [(0x80003c60, 60): a4, (0x80003c9c, 18): a2, (0x80003cae, 6): <evaluation waiting>, (0x80003cb4, 53): a4, (0x80003ce9, 39): a13, (0x80003d10, 13): a4, (0x80003d1d, 41): a13, (0x80003d46, 16): a4, (0x80003d56, 172): a13, (0x80003e02, 2): <evaluation waiting>]
|
|
true tmp fp_number_type * DWARF loclist: [(0x80003c60, 137): a6, (0x80003ce9, 39): a15, (0x80003d10, 13): a6, (0x80003d1d, 41): a15, (0x80003d46, 16): a6, (0x80003d56, 148): a15, (0x80003dea, 24): a2, (0x80003e02, 2): <evaluation waiting>]
|
|
false arg5 int32_t rizin a4
|
|
false arg6 int32_t rizin a5
|
|
false arg7 int32_t rizin a6
|
|
false a_normal_exp int DWARF loclist: [(0x80003cbc, 144): d15, (0x80003d4c, 6): a4+8, (0x80003d52, 54): d15, (0x80003d88, 16): a15+8, (0x80003dc6, 10): d15, (0x80003dd0, 6): a15+8]
|
|
false b_normal_exp int DWARF loclist: [(0x80003cc0, 32): d2, (0x80003ce0, 9): <evaluation waiting>, (0x80003d10, 13): d2, (0x80003d46, 16): d2]
|
|
false a_fraction fractype DWARF loclist: [(0x80003cd4, 104): composite: [(.0, 32): d10, (.0, 32): d11], (0x80003d44, 12): composite: [(.0, 32): d10, (.0, 32): d11], (0x80003d50, 2): a4+12, (0x80003d52, 176): composite: [(.0, 32): d10, (.0, 32): d11]]
|
|
false tfraction intfrac DWARF composite: [(.0, 32): d2, (.0, 32): d3]
|
|
false b_fraction fractype DWARF loclist: [(0x80003cd8, 48): composite: [(.0, 32): d8, (.0, 32): d9], (0x80003d0e, 244): composite: [(.0, 32): d8, (.0, 32): d9]]
|
|
fp_number_type * _fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp);
|
|
; CALL XREF from dbg.__adddf3 @ 0x80003e32
|
|
; CALL XREF from dbg.__subdf3 @ 0x80003e72
|
|
/ fp_number_type * _fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp)
|
|
| ; var int32_t arg5 @ a4
|
|
| ; var int32_t arg6 @ a5
|
|
| ; var int32_t arg7 @ a6
|
|
| ; arg fp_number_type *a @ a13
|
|
| ; arg fp_number_type *b @ a12
|
|
| ; arg fp_number_type *tmp @ a15
|
|
| ; var intfrac tfraction @ COMPOSITE
|
|
| ; var int a_normal_exp @ d15
|
|
| ; var int b_normal_exp @ d2
|
|
| ; var fractype a_fraction @ COMPOSITE
|
|
| ; var fractype b_fraction @ COMPOSITE
|
|
| 0x80003c60 ld.bu d15, [a4]#0 ; fp-bit.c:604 ; arg5
|
|
---------
|
|
var const char *sc @ a2
|
|
arg const char *s @ a4
|
|
arg size_t maxsize @ d4
|
|
is_arg name type constraints origin addr
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
false sc const char * DWARF a2
|
|
true s const char * DWARF loclist: [(0x800030ca, 18): a4, (0x800030dc, 4): <evaluation waiting>, (0x800030e0, 10): a4, (0x800030ea, 2): a2]
|
|
true maxsize size_t DWARF loclist: [(0x800030ca, 8): d4, (0x800030ea, 2): d4]
|
|
size_t strnlen_s(const char *s, size_t maxsize);
|
|
; CALL XREF from dbg._Fail_s @ 0x8000191e
|
|
/ size_t strnlen_s(const char *s, size_t maxsize)
|
|
| ; arg const char *s @ a4
|
|
| ; arg size_t maxsize @ d4
|
|
| ; var const char *sc @ a2
|
|
| 0x800030ca mov d2, #0 ; strnlen_s.c:6
|
|
---------
|
|
arg mbstate_t *pst @ a12
|
|
var _Statab *pwcstate @ a13
|
|
arg char *s @ a15
|
|
var int32_t arg5 @ a4
|
|
var int32_t arg6 @ a5
|
|
arg wchar_t wc @ d15
|
|
var _Statab *pmbstate @ ...
|
|
is_arg name type constraints origin addr
|
|
------------------------------------------------------------------------------------------------------
|
|
true pst mbstate_t * DWARF loclist: [(0x800018a6, 21): a5, (0x800018bb, 49): a12]
|
|
false pwcstate _Statab * DWARF a13
|
|
true s char * DWARF loclist: [(0x800018a6, 21): a4, (0x800018bb, 49): a15]
|
|
false arg5 int32_t rizin a4
|
|
false arg6 int32_t rizin a5
|
|
true wc wchar_t DWARF loclist: [(0x800018a6, 21): d4, (0x800018bb, 49): d15]
|
|
false pmbstate _Statab * DWARF empty
|
|
int _Wctomb(char *s, wchar_t wc, mbstate_t *pst);
|
|
; CALL XREF from dbg._Putstr @ 0x800014d2
|
|
/ int _Wctomb(char *s, wchar_t wc, mbstate_t *pst)
|
|
| ; var int32_t arg5 @ a4
|
|
| ; var int32_t arg6 @ a5
|
|
| ; arg char *s @ a15
|
|
| ; arg wchar_t wc @ d15
|
|
| ; arg mbstate_t *pst @ a12
|
|
| ; var _Statab *pmbstate @ ...
|
|
| ; var _Statab *pwcstate @ a13
|
|
| 0x800018a6 movh.a a2, #0xd000 ; xwctomb.c:123
|
|
---------
|
|
arg wchar_t *pwc @ a4
|
|
arg const char *s @ a5
|
|
arg mbstate_t *pst @ a6
|
|
arg size_t nin @ d4
|
|
is_arg name type constraints origin addr
|
|
---------------------------------------------------------------------------------------------------
|
|
true pwc wchar_t * DWARF loclist: [(0x80003084, 23): a4, (0x8000309b, 21): a14]
|
|
true s const char * DWARF loclist: [(0x80003084, 23): a5, (0x8000309b, 21): a13]
|
|
true pst mbstate_t * DWARF loclist: [(0x80003084, 23): a6, (0x8000309b, 21): a12]
|
|
true nin size_t DWARF loclist: [(0x80003084, 23): d4, (0x8000309b, 21): d15]
|
|
int _Mbtowc(wchar_t *pwc, const char *s, size_t nin, mbstate_t *pst);
|
|
; CALL XREF from dbg._Printf @ 0x80000d02
|
|
/ int _Mbtowc(wchar_t *pwc, const char *s, size_t nin, mbstate_t *pst)
|
|
| ; arg wchar_t *pwc @ a4
|
|
| ; arg const char *s @ a5
|
|
| ; arg size_t nin @ d4
|
|
| ; arg mbstate_t *pst @ a6
|
|
| 0x80003084 movh.a a15, #0xd000 ; xmbtowc.c:150
|
|
---------
|
|
arg int except @ d4
|
|
is_arg name type constraints origin addr
|
|
-------------------------------------------
|
|
true except int DWARF d4
|
|
int feraiseexcept(int except);
|
|
; CALL XREF from dbg._Feraise @ 0x8000343e
|
|
/ int feraiseexcept(int except)
|
|
| ; arg int except @ d4
|
|
| 0x800037d8 mov d2, #0 ; feraiseexcept.c:173
|
|
---------
|
|
var size_t size_arg @ a0
|
|
var Ppvoidfn newfuns @ a12
|
|
var size_t inc @ d15
|
|
is_arg name type constraints origin addr
|
|
----------------------------------------------------------------------------------------------------
|
|
false size_arg size_t rizin a0
|
|
false newfuns Ppvoidfn DWARF loclist: [(0x800019aa, 14): a2, (0x800019b8, 100): a12]
|
|
false inc size_t DWARF d15
|
|
int _Atrealloc();
|
|
; CALL XREF from dbg.atexit @ 0x80001a4c
|
|
; CALL XREF from dbg._Atexit @ 0x800033b8
|
|
/ int _Atrealloc()
|
|
| ; var size_t size_arg @ a0
|
|
| ; var size_t inc @ d15
|
|
| ; var Ppvoidfn newfuns @ a12
|
|
| 0x80001994 movh.a a15, #0xd000 ; exit.c:22
|
|
---------
|
|
arg some_t **out @ stack - 0x18
|
|
arg struct Some *gg @ stack - 0x14
|
|
arg double q @ stack - 0x10
|
|
arg char *g @ stack - 0x8
|
|
arg int a @ stack - 0x4
|
|
var size_t size_arg @ a0
|
|
var int32_t arg5 @ a4
|
|
var int32_t arg6 @ a5
|
|
var int32_t arg7 @ a6
|
|
is_arg name type constraints origin addr
|
|
--------------------------------------------------------
|
|
true out some_t ** DWARF a14-24
|
|
true gg struct Some * DWARF a14-20
|
|
true q double DWARF a14-16
|
|
true g char * DWARF a14-8
|
|
true a int DWARF a14-4
|
|
false size_arg size_t rizin a0
|
|
false arg5 int32_t rizin a4
|
|
false arg6 int32_t rizin a5
|
|
false arg7 int32_t rizin a6
|
|
void dbg.fn1(int a, char *g, double q, struct Some *gg, some_t **out);
|
|
; CALL XREF from dbg.main @ 0x8000059e
|
|
/ _Bool fn1(int a, char *g, double q, struct Some *gg, some_t **out)
|
|
| ; var int32_t arg5 @ a4
|
|
| ; var int32_t arg6 @ a5
|
|
| ; var int32_t arg7 @ a6
|
|
| ; var size_t size_arg @ a0
|
|
| ; arg int a @ stack - 0x4
|
|
| ; arg char *g @ stack - 0x8
|
|
| ; arg double q @ stack - 0x10
|
|
| ; arg struct Some *gg @ stack - 0x14
|
|
| ; arg some_t **out @ stack - 0x18
|
|
| 0x8000041c mov.aa a14, sp ; float_ex1.c:15
|
|
---------
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Function arguments from DWARF (tricore-gcc)
|
|
FILE=bins/elf/float_ex1/float_ex1_tricore_gcc
|
|
CMDS=<<EOF
|
|
aaa
|
|
s sym.fn1
|
|
e asm.comments=0
|
|
pdf
|
|
EOF
|
|
EXPECT=<<EOF
|
|
/ sym.fn1(size_t nbytes, int32_t arg5, int32_t arg6, int32_t arg7);
|
|
| ; arg size_t nbytes @ a0
|
|
| ; arg int32_t arg5 @ a4
|
|
| ; arg int32_t arg6 @ a5
|
|
| ; arg int32_t arg7 @ a6
|
|
| 0x800004ce mov.aa a14, sp
|
|
| 0x800004d0 sub.a sp, #0x18
|
|
| 0x800004d2 st.w [a14]#-4, d4
|
|
| 0x800004d6 st.a [a14]#-8, a4
|
|
| 0x800004da st.d [a14]#-0x10, e6
|
|
| 0x800004de st.a [a14]#-0x14, a5
|
|
| 0x800004e2 st.a [a14]#-0x18, a6
|
|
| 0x800004e6 ld.w d15, [a14]#-0x14
|
|
| ,=< 0x800004ea jz d15, 0x800004f2
|
|
| | 0x800004ec ld.w d15, [a14]#-0x18
|
|
| ,==< 0x800004f0 jnz d15, 0x800004f6
|
|
| |`-> 0x800004f2 mov d15, #0
|
|
| |,=< 0x800004f4 j 0x8000054c
|
|
| `--> 0x800004f6 mov d4, #0x14
|
|
| | 0x800004fa call dbg.malloc
|
|
| | 0x800004fe mov.aa a15, a2
|
|
| | 0x80000500 mov.d d15, a15
|
|
| | 0x80000502 ld.a a15, [a14]#-0x18
|
|
| | 0x80000506 st.w [a15]#0, d15
|
|
| | 0x80000508 ld.a a15, [a14]#-0x18
|
|
| | 0x8000050c ld.a a15, [a15]#0
|
|
| | 0x8000050e ld.w d15, [a14]#-4
|
|
| | 0x80000512 st.w [a15]#0, d15
|
|
| | 0x80000514 ld.a a15, [a14]#-0x18
|
|
| | 0x80000518 nop
|
|
| | 0x8000051a ld.w d15, [a15]#0
|
|
| | 0x8000051c mov.a a15, d15
|
|
| | 0x8000051e add.a a15, #4
|
|
| | 0x80000520 mov d4, #5
|
|
| | 0x80000522 ld.a a5, [a14]#-8
|
|
| | 0x80000526 mov.aa a4, a15
|
|
| | 0x80000528 call dbg.strncpy
|
|
| | 0x8000052c ld.a a15, [a14]#-0x18
|
|
| | 0x80000530 ld.a a15, [a15]#0
|
|
| | 0x80000532 ld.d e4, [a14]#-0x10
|
|
| | 0x80000536 call dbg.__truncdfsf2
|
|
| | 0x8000053a mov d15, d2
|
|
| | 0x8000053c st.w [a15]#0xc, d15
|
|
| | 0x8000053e ld.a a15, [a14]#-0x18
|
|
| | 0x80000542 ld.a a15, [a15]#0
|
|
| | 0x80000544 ld.w d15, [a14]#-0x14
|
|
| | 0x80000548 st.w [a15]#0x10, d15
|
|
| | 0x8000054a mov d15, #1
|
|
| `-> 0x8000054c mov d2, d15
|
|
\ 0x8000054e ret
|
|
EOF
|
|
RUN
|
|
|
|
NAME=Repeated function analysis - arguments and vars
|
|
FILE=bins/elf/analysis/001.make.elf.x86_64
|
|
CMDS=<<EOF
|
|
aaa
|
|
s 0x0040bbe0
|
|
afi
|
|
echo ---
|
|
afvl
|
|
pd 1
|
|
aaa
|
|
afvl
|
|
pd 1
|
|
aaa
|
|
afvl
|
|
pd 1
|
|
EOF
|
|
EXPECT=<<EOF
|
|
offset: 0x0040bbe0
|
|
name: sym.variable_expand_for_file
|
|
size: 129
|
|
is-pure: false
|
|
realsz: 120
|
|
stackframe: 0
|
|
call-convention: amd64
|
|
cyclomatic-cost: 37
|
|
cyclomatic-complexity: 3
|
|
loops: 1
|
|
bits: 64
|
|
type: sym
|
|
num-bbs: 5
|
|
edges: 6
|
|
end-bbs: 1
|
|
call-refs: 0x0040b0f0 C 0x0040b0f0 J
|
|
data-refs: 0x006331a0 0x00636050 0x006331a0 0x00636050 0x006331a0 0x00636050
|
|
code-xrefs: 0x0040cc17 C 0x00412775 C
|
|
noreturn: false
|
|
in-degree: 2
|
|
out-degree: 1
|
|
data-xrefs:
|
|
locals: 3
|
|
args: 2
|
|
var char *result @ rax
|
|
var struct variable_set_list *savev @ rbp
|
|
var floc *savef @ rbx
|
|
arg const char *line @ rdi
|
|
arg struct file *file @ rsi
|
|
---
|
|
var char *result @ rax
|
|
var struct variable_set_list *savev @ rbp
|
|
var floc *savef @ rbx
|
|
arg const char *line @ rdi
|
|
arg struct file *file @ rsi
|
|
; CALL XREF from dbg.expand_deps @ 0x40cc17
|
|
; CALL XREF from dbg.pattern_search @ 0x412775
|
|
/ char *sym.variable_expand_for_file(const char *line, struct file *file);
|
|
| ; arg const char *line @ rdi
|
|
| ; arg struct file *file @ rsi
|
|
| ; var char *result @ rax
|
|
| ; var struct variable_set_list *savev @ rbp
|
|
| ; var floc *savef @ rbx
|
|
| 0x0040bbe0 test rsi, rsi ; expand.c:458 ; file
|
|
var char *result @ rax
|
|
var struct variable_set_list *savev @ rbp
|
|
var floc *savef @ rbx
|
|
arg const char *line @ rdi
|
|
arg struct file *file @ rsi
|
|
; CALL XREF from dbg.expand_deps @ 0x40cc17
|
|
; CALL XREF from dbg.pattern_search @ 0x412775
|
|
/ char *sym.variable_expand_for_file(const char *line, struct file *file);
|
|
| ; arg const char *line @ rdi
|
|
| ; arg struct file *file @ rsi
|
|
| ; var char *result @ rax
|
|
| ; var struct variable_set_list *savev @ rbp
|
|
| ; var floc *savef @ rbx
|
|
| 0x0040bbe0 test rsi, rsi ; expand.c:458 ; file
|
|
var char *result @ rax
|
|
var struct variable_set_list *savev @ rbp
|
|
var floc *savef @ rbx
|
|
arg const char *line @ rdi
|
|
arg struct file *file @ rsi
|
|
; CALL XREF from dbg.expand_deps @ 0x40cc17
|
|
; CALL XREF from dbg.pattern_search @ 0x412775
|
|
/ char *sym.variable_expand_for_file(const char *line, struct file *file);
|
|
| ; arg const char *line @ rdi
|
|
| ; arg struct file *file @ rsi
|
|
| ; var char *result @ rax
|
|
| ; var struct variable_set_list *savev @ rbp
|
|
| ; var floc *savef @ rbx
|
|
| 0x0040bbe0 test rsi, rsi ; expand.c:458 ; file
|
|
EOF
|
|
RUN
|