aboutsummaryrefslogtreecommitdiffstats
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rwxr-xr-xbfd/codegen.py81
-rwxr-xr-xbfd/load.py35
-rw-r--r--bfd/makefile2
-rw-r--r--bfd/test/makefile6
4 files changed, 120 insertions, 4 deletions
diff --git a/bfd/codegen.py b/bfd/codegen.py
new file mode 100755
index 0000000..fbac4a8
--- /dev/null
+++ b/bfd/codegen.py
@@ -0,0 +1,81 @@
+#!/bin/python3
+
+import argparse
+import code
+import readline
+
+default_header="#include <stdint.h>\n"
+main_sig="int main(int argc, char** argv)>"
+def_kw="#define "
+def_name = []
+separator="fff"
+def_value = []
+
+class Argparser(object):
+ def __init__(self):
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--arglist", nargs="+", type=str, help="list of args")
+ parser.add_argument("--hex", action="store_true", help="generate hex(string) code, otherwise generate int", default=False)
+ self.args = parser.parse_args()
+ self.code = {}
+
+class CodeGen_Arg(object):
+ def __init__(self, arglist):
+ self.arglist = arglist
+ self.def_name = []
+ self.def_value = []
+
+ def get_ret_type(self, type):
+ pass
+
+ def gen_cast(self):
+ for argtype in self.arglist:
+ if argtype == "int8": self.def_name.append("i8")
+ elif argtype == "uint8":self.def_name.append("u8")
+ elif argtype == "uchar":self.def_name.append("c")
+ elif argtype == "char":self.def_name.append("c")
+ elif argtype == "lightuserdata":self.def_name.append("p")
+ elif argtype == "bool":self.def_name.append("b")
+ elif argtype == "int16":self.def_name.append("i16")
+ elif argtype == "uint16":self.def_name.append("u16")
+ elif argtype == "int32":self.def_name.append("i32")
+ elif argtype == "uint32":self.def_name.append("u32")
+ elif argtype == "int64":self.def_name.append("i64")
+ elif argtype == "uint64":self.def_name.append("u64")
+ elif argtype == "int128":self.def_name.append("i128")
+ elif argtype == "uint128":self.def_name.append("u128")
+ elif argtype == "float":self.def_name.append("f")
+ elif argtype == "double":self.def_name.append("d")
+ elif argtype == "long double":self.def_name.append("ld")
+ elif argtype == "string":self.def_name.append("s")
+ elif argtype == "custom":self.def_name.append("x")
+ else:
+ raise Exception("codegen : unknown type")
+
+ def debugdump(self):
+ for argtype in self.arglist:
+ print(argtype)
+
+ def genhex():
+ pass
+
+ def genint():
+ pass
+
+# write code here
+def premain():
+ argparser = Argparser()
+ codegen = CodeGen_Arg(argparser.args.arglist)
+ codegen.debugdump()
+
+def main():
+ try:
+ premain()
+ except:
+ variables = globals().copy()
+ variables.update(locals())
+ shell = code.InteractiveConsole(variables)
+ shell.interact(banner="DEBUG REPL")
+
+if __name__ == "__main__":
+ main()
diff --git a/bfd/load.py b/bfd/load.py
index 08adfc5..ae984c8 100755
--- a/bfd/load.py
+++ b/bfd/load.py
@@ -24,6 +24,8 @@ class CLIArgParser(object):
parser.add_argument("--objcode", action='store_true', help="dump objects", default=False)
parser.add_argument("--test", action='store_true', help="test switch", default=False)
parser.add_argument("--dynsym", action='store_true', help="dump dynamic symbol table", default=False)
+ parser.add_argument("--dlpath", action='store_true', help="dump dynamic linker path", default=False)
+ parser.add_argument("--section", type=str, help="dump a section")
self.args = parser.parse_args()
if self.args.obj is None:
raise Exception("no object file provided. please specify an object with --obj.")
@@ -296,6 +298,7 @@ class ELF(object):
self.symbol_table_e = []
self.data_section = []
self.text_section = []
+ self.dlpath = str()
def init(self, size):
self.size = size
@@ -449,6 +452,36 @@ class ELF(object):
print(name)
return ret_list
+ def dump_section(self, section_name):
+ for section in self.shhdr:
+ name = self.read_section_name(byte2int(section.sh_name))
+ if name == section_name:
+ self.so.seek(byte2int(section.sh_offset))
+ obj = self.so.read(byte2int(section.sh_size))
+ if section_name == ".interp": self.dlpath = repr(obj)
+ count = int()
+ strrep = []
+ for byte in obj:
+ if count%16 == 0:
+ for ch in strrep:
+ if ord(ch) > 16: print(ch, end = '')
+ else: pass
+ print()
+ strrep = []
+ print(format(count, "06x"), ': ', end='')
+ strrep.append(str(chr(byte)))
+ print(format(byte, '02x') + ' ', end='')
+ else:
+ strrep += str(chr(byte))
+ print(format(byte, '02x') + ' ', end='')
+ count += 1
+ for i in range(0, 16-count%16): print(" ", end="")
+ for ch in strrep:
+ if ord(ch) > 16: print(ch, end = '')
+ else: pass
+ print()
+ return self.dlpath
+
def dump_obj_size(self, stt_type, dump_b):
ret_list = []
for entry in self.string_tb_e:
@@ -706,6 +739,8 @@ def main():
elif argparser.args.test: elf.dump_symbol_string(ELF_ST_TYPE.STT_FUNC, True)
elif argparser.args.test: elf.dump_symbol_string(ELF_ST_TYPE.STT_OBJECT, True)
elif argparser.args.dynsym: elf.dump_st_entries_dyn()
+ elif argparser.args.dlpath: elf.dump_section(".interp")
+ elif argparser.args.section: elf.dump_section(argparser.args.section)
except:
variables = globals().copy()
variables.update(locals())
diff --git a/bfd/makefile b/bfd/makefile
index 2720678..0788260 100644
--- a/bfd/makefile
+++ b/bfd/makefile
@@ -7,7 +7,7 @@ TARGET=main
##################################RULES################################
.DEFAULT:all
-.PHONY:all clean help $(TARGET) $(TARGET).so test
+.PHONY:all clean help test
all:$(TARGET) $(TARGET).so test
diff --git a/bfd/test/makefile b/bfd/test/makefile
index 8282536..7115100 100644
--- a/bfd/test/makefile
+++ b/bfd/test/makefile
@@ -7,9 +7,9 @@ TARGET=test
##################################RULES################################
.DEFAULT:all
-.PHONY:all clean help $(TARGET) ASM
+.PHONY:all clean help
-all:$(TARGET) $(TARGET).so ASM
+all:$(TARGET) $(TARGET).so $(TARGET).asm
.c.o:
$(CC) $(CC_FLAGS) -c $< -o $@
@@ -17,7 +17,7 @@ all:$(TARGET) $(TARGET).so ASM
$(TARGET): $(TARGET).o
$(CC) $^ $(LD_FLAGS) -o $@
-ASM: $(TARGET).o
+$(TARGET).asm: $(TARGET).o
objdump -d -M intel -S $(TARGET).o > $(TARGET).asm
$(TARGET).so: $(TARGET).o