Cleanup repository
This commit is contained in:
parent
f81ca9e33b
commit
77f937a368
10 changed files with 2681 additions and 1 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -23,3 +23,5 @@ setup.log
|
||||||
*.plugin
|
*.plugin
|
||||||
ml_dwarf_write.bin
|
ml_dwarf_write.bin
|
||||||
tmp.marshal
|
tmp.marshal
|
||||||
|
dwarfsynth.tar.gz
|
||||||
|
tmp
|
||||||
|
|
4
csmith/.gitignore
vendored
4
csmith/.gitignore
vendored
|
@ -1 +1,3 @@
|
||||||
0[0-9]/
|
platform.info
|
||||||
|
investigation
|
||||||
|
kept_tests
|
||||||
|
|
14
test/rec.c
Normal file
14
test/rec.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int fac(int n) {
|
||||||
|
if(n <= 0)
|
||||||
|
return 0;
|
||||||
|
if(n == 1)
|
||||||
|
return 1;
|
||||||
|
return n * fac(n-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
printf("%d\n", fac(4));
|
||||||
|
return 0;
|
||||||
|
}
|
1
tools/check_rbp_rsp_shift/.gitignore
vendored
Normal file
1
tools/check_rbp_rsp_shift/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.log
|
8
tools/check_rbp_rsp_shift/Makefile
Normal file
8
tools/check_rbp_rsp_shift/Makefile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
TARGETS:= \
|
||||||
|
$(shell find /usr/bin -executable) \
|
||||||
|
$(shell find /usr/lib -executable)
|
||||||
|
|
||||||
|
all: $(TARGETS:=.elf)
|
||||||
|
|
||||||
|
%.elf:
|
||||||
|
@readelf -wF "$*" 2>/dev/null | ./check_rbp_rsp_shift.py "$*"
|
94
tools/check_rbp_rsp_shift/check_rbp_rsp_shift.py
Executable file
94
tools/check_rbp_rsp_shift/check_rbp_rsp_shift.py
Executable file
|
@ -0,0 +1,94 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
from enum import IntEnum
|
||||||
|
import sys
|
||||||
|
|
||||||
|
""" Parse a `readelf -wF` output, trying to locate CFA=f(rbp) to CFA=g(rsp) changes,
|
||||||
|
and to detect the offset applied to rsp in such cases. """
|
||||||
|
|
||||||
|
|
||||||
|
class Eof(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
program_name = sys.argv[1]
|
||||||
|
|
||||||
|
|
||||||
|
def log_entry(entry):
|
||||||
|
print("[{}] {}".format(program_name, entry))
|
||||||
|
|
||||||
|
|
||||||
|
def parse_line(line):
|
||||||
|
spl = line.strip().split(" ")
|
||||||
|
addr = int(spl[0], 16)
|
||||||
|
cfa = spl[1]
|
||||||
|
return addr, cfa
|
||||||
|
|
||||||
|
|
||||||
|
def match_fde_header(line):
|
||||||
|
spl = line.strip().split()
|
||||||
|
if len(spl) == 6 and spl[3] == "FDE":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class CfaType(IntEnum):
|
||||||
|
OTHER = 0
|
||||||
|
RSP_BASED = 1
|
||||||
|
RBP_BASED = 2
|
||||||
|
|
||||||
|
|
||||||
|
def get_cfa_type(cfa):
|
||||||
|
if cfa.startswith("rsp"):
|
||||||
|
return CfaType.RSP_BASED
|
||||||
|
if cfa.startswith("rbp"):
|
||||||
|
return CfaType.RBP_BASED
|
||||||
|
return CfaType.OTHER
|
||||||
|
|
||||||
|
|
||||||
|
def parse_fde(lines):
|
||||||
|
# Read until FDE head
|
||||||
|
for line in lines:
|
||||||
|
if match_fde_header(line):
|
||||||
|
break
|
||||||
|
|
||||||
|
try:
|
||||||
|
post_header = next(lines) # Waste a line — FDE columns head
|
||||||
|
if not post_header.strip(): # Empty FDE — return now
|
||||||
|
return True
|
||||||
|
except StopIteration:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Read each row until an empty line is found
|
||||||
|
|
||||||
|
prev_rbp = False # Was the last line rbp indexed?
|
||||||
|
closed_rbp_block = False # Was there already a rbp-indexed block which is over?
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if not line: # Empty line — FDE end
|
||||||
|
return True
|
||||||
|
|
||||||
|
addr, cfa = parse_line(line)
|
||||||
|
cfa_type = get_cfa_type(cfa)
|
||||||
|
|
||||||
|
if cfa_type == CfaType.RSP_BASED and prev_rbp:
|
||||||
|
closed_rbp_block = True
|
||||||
|
if cfa != "rsp+8":
|
||||||
|
log_entry(
|
||||||
|
"(E) {}: CFA={} after %rbp-based index".format(hex(addr), cfa)
|
||||||
|
)
|
||||||
|
|
||||||
|
if cfa_type == CfaType.RBP_BASED:
|
||||||
|
prev_rbp = True
|
||||||
|
if closed_rbp_block:
|
||||||
|
log_entry("(W) {}: two %rbp blocks in function".format(addr))
|
||||||
|
else:
|
||||||
|
prev_rbp = False
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
handle = sys.stdin
|
||||||
|
while parse_fde(handle):
|
||||||
|
pass
|
2510
tools/check_rbp_rsp_shift/positive_test.in
Normal file
2510
tools/check_rbp_rsp_shift/positive_test.in
Normal file
File diff suppressed because it is too large
Load diff
19
tools/check_rbp_rsp_shift/readdr.py
Normal file
19
tools/check_rbp_rsp_shift/readdr.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
for line in sys.stdin:
|
||||||
|
if not line.startswith("["):
|
||||||
|
print(line, end="") # not our lines?
|
||||||
|
continue
|
||||||
|
firstpar = line.find(")")
|
||||||
|
if firstpar < 0:
|
||||||
|
print(line, end="")
|
||||||
|
continue
|
||||||
|
|
||||||
|
addr_beg = firstpar + 2
|
||||||
|
addr_end = line.find(":", addr_beg)
|
||||||
|
addr = line[addr_beg:addr_end]
|
||||||
|
hexaddr = hex(int(addr))
|
||||||
|
repl = line[:addr_beg] + hexaddr + line[addr_end:]
|
||||||
|
print(repl, end="")
|
20
tools/check_rbp_rsp_shift/show_asm_of.py
Normal file
20
tools/check_rbp_rsp_shift/show_asm_of.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_disasm(elfpath, addr):
|
||||||
|
output = subprocess.check_output([' # TODO
|
||||||
|
|
||||||
|
|
||||||
|
for line in sys.stdin:
|
||||||
|
line_data = line.strip().split(":")[0]
|
||||||
|
elfpath, kind, addr = line_data.split()
|
||||||
|
elfpath = elfpath[1:-1] # Remove '[]'
|
||||||
|
if kind != "(E)":
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(line, end="")
|
||||||
|
print(fetch_disasm(elfpath, addr), end="")
|
||||||
|
print("------")
|
10
tools/check_rbp_rsp_shift/show_asm_of.sh
Normal file
10
tools/check_rbp_rsp_shift/show_asm_of.sh
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
grep "(E)" | while read line; do
|
||||||
|
elf=$(echo "$line" | cut -d' ' -f1 | sed 's/\[\(.*\)\]/\1/g')
|
||||||
|
addr=$(echo "$line" | sed 's/^.*0x\([0-9a-fA-F]*\):.*$/\1/g')
|
||||||
|
|
||||||
|
echo "$line"
|
||||||
|
objdump -d "$elf" | grep -C 1 -e "^ *$addr:"
|
||||||
|
echo "-----"
|
||||||
|
done
|
Loading…
Reference in a new issue