]> git.ipfire.org Git - people/ric9/pakfire.git/commitdiff
ELF: Add a function to fetch the interpreter
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Jan 2025 08:52:14 +0000 (08:52 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Jan 2025 08:52:14 +0000 (08:52 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/elf.c
src/pakfire/elf.h

index c6c681fabd0dee1482eff1c23514f31f84ff1769..d6863d2e76890ac46a7f72c699a16b3bc00a02fa 100644 (file)
@@ -55,6 +55,9 @@ struct pakfire_elf {
        // Strings
        size_t shstrndx;
 
+       // Interpreter
+       const char* interpreter;
+
        // GNU Build ID
        char* build_id;
 
@@ -421,6 +424,42 @@ static int pakfire_elf_dyn_walk(struct pakfire_elf* self,
        return 0;
 }
 
+static int pakfire_elf_fetch_interpreter(
+               struct pakfire_elf* self, const GElf_Phdr* phdr, void* data) {
+       Elf_Data* chunk = NULL;
+
+       switch (phdr->p_type) {
+               case PT_INTERP:
+                       chunk = elf_getdata_rawchunk(self->elf, phdr->p_offset, phdr->p_filesz, ELF_T_BYTE);
+                       if (!chunk || !chunk->d_buf) {
+                               ERROR(self->ctx, "Failed to fetch the interpreter\n");
+                               return -EINVAL;
+                       }
+
+                       // Store the interpreter
+                       self->interpreter = (const char*)chunk->d_buf;
+                       break;
+
+               default:
+                       break;
+       }
+
+       return 0;
+}
+
+const char* pakfire_elf_interpreter(struct pakfire_elf* self) {
+       int r;
+
+       // Fetch the interpreter if not available
+       if (!self->interpreter) {
+               r = pakfire_elf_foreach_program_header(self, pakfire_elf_fetch_interpreter, NULL);
+               if (r < 0)
+                       return NULL;
+       }
+
+       return self->interpreter;
+}
+
 int pakfire_elf_is_pie(struct pakfire_elf* self) {
        switch (pakfire_elf_type(self)) {
                // Shared Object files are good
index f723d52244ab125ab69e51c68df193926da7c840..a1d591797d3cd11d2006749491a7c930f9ad2c79 100644 (file)
@@ -43,6 +43,7 @@ int pakfire_elf_machine(struct pakfire_elf* self);
 int pakfire_elf_endianess(struct pakfire_elf* self);
 const char* pakfire_elf_build_id(struct pakfire_elf* self);
 const char* pakfire_elf_debuglink(struct pakfire_elf* self);
+const char* pakfire_elf_interpreter(struct pakfire_elf* elf);
 
 int pakfire_elf_is_pie(struct pakfire_elf* self);
 int pakfire_elf_has_ssp(struct pakfire_elf* self);