Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Issue 5 changes #6

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 60 additions & 31 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,61 +1,87 @@
NAME=uf2_plugin
R2_PLUGIN_PATH=$(shell r2 -H R2_USER_PLUGINS)
LIBEXT=$(shell r2 -H LIBEXT)
# CFLAGS=-g -fPIC $(shell pkg-config --cflags r_anal)
# LDFLAGS=-shared $(shell pkg-config --libs r_anal)
CFLAGS=-g -fPIC -I$(shell r2 -H R2_INCDIR) -I$(shell r2 -H R2_INCDIR)/sdb/
LDFLAGS=-shared -L$(shell r2 -H R2_LIBDIR) -lr_anal
OBJS=$(NAME).o
LIB=$(NAME).$(LIBEXT)

# CFLAGS=-g -fPIC $(shell pkg-config --cflags r_core)
# LDFLAGS=-shared $(shell pkg-config --libs r_core)
CFLAGS=-g -fPIC -I$(shell r2 -H R2_INCDIR)
LDFLAGS=-shared -L$(shell r2 -H R2_LIBDIR) -lr_core

SRCS_IO=io_uf2.c
SRCS_FS=fs_uf2.c
SRCS_BIN=bin_uf2.c

OBJS_IO=$(SRCS_IO:%.c=%.o)
OBJS_FS=$(SRCS_FS:%.c=%.o)
OBJS_BIN=$(SRCS_BIN:%.c=%.o)

TARGET_IO=io_uf2.$(LIBEXT)
TARGET_FS=fs_uf2.$(LIBEXT)
TARGET_BIN=bin_uf2.$(LIBEXT)

TARGETS=$(TARGET_IO) $(TARGET_FS) $(TARGET_BIN)

CWD=$(shell pwd)
ELF_FILES=$(wildcard data/*.elf)

all: $(LIB) uf2families.sdb compile_flags.txt
all: $(TARGETS) compile_flags.txt

clean:
rm -f $(LIB) $(OBJS)
rm -f *.o *.$(LIBEXT)
rm -f compile_flags.txt
rm -f uf2families.sdb
rm -f uf2families.sdb.txt

$(LIB): $(OBJS) uf2families.sdb
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(LIB)
$(TARGET_IO): $(OBJS_IO)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_IO) -o $(TARGET_IO)

install: $(LIB)
$(TARGET_FS): $(OBJS_FS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_FS) -o $(TARGET_FS)

$(TARGET_BIN): $(OBJS_BIN)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_BIN) -o $(TARGET_BIN)

install: $(TARGETS)
mkdir -p $(R2_PLUGIN_PATH)
cp -f $(LIB) $(R2_PLUGIN_PATH)
cp -f $(TARGET_IO) $(R2_PLUGIN_PATH)
cp -f $(TARGET_FS) $(R2_PLUGIN_PATH)
cp -f $(TARGET_BIN) $(R2_PLUGIN_PATH)

install-symlink: $(LIB)
install-symlink: $(TARGET_IO)
mkdir -p $(R2_PLUGIN_PATH)
ln -s $(CWD)/$(LIB) $(R2_PLUGIN_PATH)/$(LIB)
ln -s $(CWD)/$(TARGET_IO) $(R2_PLUGIN_PATH)/$(TARGET_IO)
ln -s $(CWD)/$(TARGET_FS) $(R2_PLUGIN_PATH)/$(TARGET_FS)
ln -s $(CWD)/$(TARGET_BIN) $(R2_PLUGIN_PATH)/$(TARGET_BIN)

uninstall:
rm -f $(R2_PLUGIN_PATH)/$(LIB)

uf2families.sdb.txt: uf2families.json
@python3 uf2families_to_sdb.py > $@

uf2families.sdb: uf2families.sdb.txt
@sdb $@ = < $?
rm -f $(R2_PLUGIN_PATH)/$(TARGET_IO)
rm -f $(R2_PLUGIN_PATH)/$(TARGET_FS)
rm -f $(R2_PLUGIN_PATH)/$(TARGET_BIN)

compile_flags.txt:
touch $@
echo "-Wall" >> $@
echo "-I$(shell r2 -H R2_INCDIR)/sdb" >> $@
echo "-I$(shell r2 -H R2_INCDIR)" >> $@
echo "-L$(shell r2 -H R2_LIBDIR)" >> $@
echo "-lr_anal" >> $@
echo "-lr_core" >> $@

test: test_io test_fs test_bin
test_io: test_load_io $(ELF_FILES)
test_fs: test_load_fs
test_bin: test_load_bin

test_load_io: $(TARGET_IO)
@r2 -N -q -c 'Lo' -l ./$(TARGET_IO) -- | grep uf2

test: test_load $(ELF_FILES)
test_load_fs: $(TARGET_FS)
@r2 -N -q -c 'Lm' -l ./$(TARGET_FS) -- | grep uf2

test_load: $(LIB)
@r2 -l ./uf2_plugin.so -L | grep uf2
test_load_bin: $(TARGET_BIN)
@r2 -N -q -c 'Lb' -l ./$(TARGET_BIN) -- | grep uf2

$(ELF_FILES): $(LIB)
$(ELF_FILES): $(TARGET_IO)
$(eval OFFSET := $(shell r2 -N -q -c 's main; s' $@))
@printf "[i] main @ ${OFFSET} in $@ "
$(eval ELF_MAIN := $(shell r2 -N -q -c 's ${OFFSET}; af; p8f' $@))
$(eval UF2_MAIN := $(shell r2 -N -q -c 's ${OFFSET}; af; p8f' -l ./uf2_plugin.so uf2://$(@:.elf=.uf2)))
$(eval UF2_MAIN := $(shell r2 -N -q -c 's ${OFFSET}; af; p8f' -l ./$(TARGET_IO) uf2://$(@:.elf=.uf2)))
@if [ "${ELF_MAIN}" = "${UF2_MAIN}" ]; then\
echo "Ok";\
else\
Expand All @@ -66,4 +92,7 @@ $(ELF_FILES): $(LIB)
echo;\
fi

.PHONY: all clean install install-symlink uninstall test test_load $(ELF_FILES)
.PHONY: all clean install install-symlink uninstall test \
test_io test_load_io $(ELF_FILES) \
test_fs test_load_fs \
test_bin test_load_bin
57 changes: 57 additions & 0 deletions bin_uf2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/* radare - LGPL - Copyright 2024 - aviciano */

#include <r_core.h>

static RBinInfo *info(RBinFile *bf) {
r_return_val_if_fail (bf && bf->bo, NULL);
RBinInfo *ret = R_NEW0 (RBinInfo);
if (!ret) {
return NULL;
}
ret->file = strdup (bf->file);
ret->big_endian = false;
ret->type = strdup ("uf2");
return ret;

}

// TODO DRY extract uf2.h
#define UF2_MAGIC_START0 0x0A324655UL // "UF2\n


static bool check(RBinFile *bf, RBuffer *b) {
r_return_val_if_fail (b, false);
return r_buf_read_le32_at (b, 0) == UF2_MAGIC_START0;
}


static bool load(RBinFile *bf, RBuffer *buf, ut64 loadaddr) {
return true;
}

static void destroy(RBinFile *bf) {
r_return_if_fail (bf && bf->bo);
r_buf_free (bf->bo->bin_obj);
}

RBinPlugin r_bin_plugin_uf2 = {
.meta = {
.name = "uf2",
.desc = "uf2 bin plugin",
.license = "LGPL3",
},
// TODO
.load = load,
.destroy = destroy,
.check = check,
.info = info,
};

#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
.type = R_LIB_TYPE_BIN,
.data = &r_bin_plugin_uf2,
.version = R2_VERSION
};
#endif

21 changes: 21 additions & 0 deletions fs_uf2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* radare - LGPL - Copyright 2024 - aviciano */

#include <r_core.h>

RBinPlugin r_fs_plugin_uf2 = {
.meta = {
.name = "uf2",
.desc = "uf2 fs plugin",
.license = "LGPL3",
},
// TODO
};

#ifndef R2_PLUGIN_INCORE
R_API RLibStruct radare_plugin = {
.type = R_LIB_TYPE_FS,
.data = &r_fs_plugin_uf2,
.version = R2_VERSION
};
#endif

Loading