// ELF Object
Elf* elf;
+
+ // ELF Header
+ GElf_Ehdr ehdr;
};
static int pakfire_elf_init_libelf(struct pakfire_ctx* ctx) {
return 0;
}
+static int pakfire_elf_open_elf(struct pakfire_elf* self) {
+ GElf_Ehdr* ehdr = NULL;
+ int r;
+
+ // Make sure libelf is initialized
+ r = pakfire_elf_init_libelf(self->ctx);
+ if (r < 0)
+ return r;
+
+ // Open the ELF file
+ self->elf = elf_begin(self->fd, ELF_C_READ, NULL);
+ if (!self->elf) {
+ ERROR(self->ctx, "Could not open ELF file: %m\n");
+ return -errno;
+ }
+
+ // Is this actually an ELF file?
+ switch (elf_kind(self->elf)) {
+ case ELF_K_ELF:
+ break;
+
+ // Fail for everything else
+ default:
+ return -ENOTSUP;
+ }
+
+ // Fetch the ELF header
+ ehdr = gelf_getehdr(self->elf, &self->ehdr);
+ if (!ehdr) {
+ ERROR(self->ctx, "Could not fetch the ELF header: %s\n", elf_errmsg(-1));
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static void pakfire_elf_free(struct pakfire_elf* self) {
if (self->elf)
elf_end(self->elf);
goto ERROR;
}
- // Make sure libelf is initialized
- r = pakfire_elf_init_libelf(self->ctx);
- if (r < 0)
- goto ERROR;
-
// Open the ELF file
- self->elf = elf_begin(self->fd, ELF_C_READ, NULL);
- if (!self->elf) {
- ERROR(self->ctx, "Could not open ELF file: %m\n");
- r = -errno;
+ r = pakfire_elf_open_elf(self);
+ if (r < 0)
goto ERROR;
- }
// Return the pointer
*elf = self;
const char* pakfire_elf_path(struct pakfire_elf* self) {
return self->path;
}
+
+int pakfire_elf_type(struct pakfire_elf* self) {
+ return self->ehdr.e_type;
+}