diff --git a/Makefile b/Makefile index ec6f61b..32ea983 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,12 @@ BIN := kexp.bin SRC_DIR := src BUILD_DIR := build +KEXP_NO_PTHREADS ?= 0 CFLAGS := -O3 -Iinclude \ -fPIE -fcommon -fno-omit-frame-pointer -fno-zero-initialized-in-bss \ -ffreestanding -nostdlib -nostartfiles \ - -Wall -Wextra -Werror -Wno-int-conversion + -Wall -Wextra -Werror -Wno-int-conversion \ + -DKEXP_NO_PTHREADS=$(KEXP_NO_PTHREADS) SRCS := $(wildcard $(SRC_DIR)/*.c) OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS)) $(BUILD_DIR)/syscalls.o @@ -22,7 +24,7 @@ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(BUILD_DIR)/%.o: $(SRC_DIR)/%.S $(CC) $(CFLAGS) -c $< -o $@ - + $(BUILD_DIR)/$(BIN): $(OBJS) script.ld $(CC) $(CFLAGS) -Tscript.ld $(OBJS) -o $@ diff --git a/src/loader.c b/src/loader.c index 9a8ecc2..c572114 100644 --- a/src/loader.c +++ b/src/loader.c @@ -251,6 +251,12 @@ int init_loader_args() { } int run_loader() { + +#if defined(KEXP_NO_PTHREADS) && KEXP_NO_PTHREADS == 1 + log("calling elfldr entry directly @ %#lx", loader_ctx.entry); + int (*entry)(void *) = (int (*)(void *))loader_ctx.entry; + entry((void *)&loader_ctx.args); +# else uintptr_t pthread; uint32_t pthread_id; @@ -267,6 +273,7 @@ int run_loader() { notify("failed to join thread !!"); return -1; } +#endif notify("elfldr returned %#lx !!", *(uint64_t *)loader_ctx.args.ret);