X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/45e1f8b055043e54be35462852ab6649d634da7c..d1b1c8d9119229dbeed06cd252917e54a1cb77f6:/lunaix-os/kernel/exe/elf32/elf32bfmt.c diff --git a/lunaix-os/kernel/exe/elf32/elf32bfmt.c b/lunaix-os/kernel/exe/elf32/elf32bfmt.c index 451c394..da94735 100644 --- a/lunaix-os/kernel/exe/elf32/elf32bfmt.c +++ b/lunaix-os/kernel/exe/elf32/elf32bfmt.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -13,6 +12,26 @@ elf32_read(struct v_file* elf, void* data, size_t off, size_t len) return pcache_read(elf->inode, data, len, off); } +static int +elf32_do_open(struct elf32* elf, struct v_file* elf_file) +{ + int status = 0; + elf->pheaders = NULL; + elf->elf_file = elf_file; + + if ((status = elf32_read_ehdr(elf)) < 0) { + elf32_close(elf); + return status; + } + + if ((status = elf32_read_phdr(elf)) < 0) { + elf32_close(elf); + return status; + } + + return 0; +} + int elf32_open(struct elf32* elf, const char* path) { @@ -28,27 +47,15 @@ elf32_open(struct elf32* elf, const char* path) return error; } - return elf32_openat(elf, elffile); + return elf32_do_open(elf, elffile); } int -elf32_openat(struct elf32* elf, const void* elf_vfile) +elf32_openat(struct elf32* elf, void* elf_vfile) { - int status = 0; - elf->pheaders = NULL; - elf->elf_file = elf_vfile; - - if ((status = elf32_read_ehdr(elf)) < 0) { - elf32_close(elf); - return status; - } - - if ((status = elf32_read_phdr(elf)) < 0) { - elf32_close(elf); - return status; - } - - return 0; + // so the ref count kept in sync + vfs_ref_file(elf_vfile); + return elf32_do_open(elf, elf_vfile); } int @@ -164,12 +171,19 @@ elf32_read_phdr(struct elf32* elf) } int -elf32_check_exec(const struct elf32* elf) +elf32_check_exec(const struct elf32* elf, int type) +{ + const struct elf32_ehdr* ehdr = &elf->eheader; + + return (ehdr->e_entry) && ehdr->e_type == type; +} + +int +elf32_check_arch(const struct elf32* elf) { const struct elf32_ehdr* ehdr = &elf->eheader; return *(u32_t*)(ehdr->e_ident) == ELFMAGIC && ehdr->e_ident[EI_CLASS] == ELFCLASS32 && - ehdr->e_ident[EI_DATA] == ELFDATA2LSB && ehdr->e_type == ET_EXEC && - ehdr->e_machine == EM_386; -} + ehdr->e_ident[EI_DATA] == ELFDATA2LSB && ehdr->e_machine == EM_386; +} \ No newline at end of file