-#include <lunaix/common.h>
#include <lunaix/exebi/elf32.h>
#include <lunaix/fs.h>
#include <lunaix/mm/valloc.h>
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)
{
return error;
}
- return elf32_openat(elf, elffile);
+ return elf32_do_open(elf, elffile);
}
int
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
}
int
-elf32_check_exec(const struct elf32* elf)
+elf32_check_exec(const struct elf32* elf, int type)
{
- struct elf32_ehdr* ehdr = &elf->eheader;
+ 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