:: commit 76446d0c28af9c6b3dc71c3f62bd17742c2b4701

Marvin Friedrich <contact@marvinf.com> — 2025-03-19 10:38

parents: 4ff1f01225

lib/elf: Print name of unresolved symbol on panic

diff --git a/common/lib/elf.c b/common/lib/elf.c
index 659e3adc..0a39df95 100644
--- a/common/lib/elf.c
+++ b/common/lib/elf.c
@@ -30,6 +30,7 @@
 #define DT_RELRENT  0x00000025
 #define DT_SYMTAB   0x00000006
 #define DT_SYMENT   0x0000000b
+#define DT_STRTAB   0x00000005
 #define DT_PLTREL   0x00000014
 #define DT_PLTRELSZ 0x00000002
 #define DT_JMPREL   0x00000017
@@ -264,6 +265,7 @@ static bool elf64_apply_relocations(uint8_t *elf, struct elf64_hdr *hdr, void *b
 
     uint64_t symtab_offset = 0;
     uint64_t symtab_ent = 0;
+    uint64_t strtab_offset = 0;
 
     uint64_t dt_pltrel = 0;
     uint64_t dt_pltrelsz = 0;
@@ -309,6 +311,9 @@ static bool elf64_apply_relocations(uint8_t *elf, struct elf64_hdr *hdr, void *b
                 case DT_SYMTAB:
                     symtab_offset = dyn->d_un;
                     break;
+                case DT_STRTAB:
+                    strtab_offset = dyn->d_un;
+                    break;
                 case DT_SYMENT:
                     symtab_ent = dyn->d_un;
                     if (symtab_ent < sizeof(struct elf64_sym)) {
@@ -371,6 +376,18 @@ end_of_pt_segment:
         }
     }
 
+    if (strtab_offset != 0) {
+        for (uint16_t i = 0; i < hdr->ph_num; i++) {
+            struct elf64_phdr *_phdr = (void *)elf + (hdr->phoff + i * hdr->phdr_size);
+
+            if (_phdr->p_vaddr <= strtab_offset && _phdr->p_vaddr + _phdr->p_filesz > strtab_offset) {
+                strtab_offset -= _phdr->p_vaddr;
+                strtab_offset += _phdr->p_offset;
+                break;
+            }
+        }
+    }
+
     if (dt_jmprel != 0) {
         for (uint16_t i = 0; i < hdr->ph_num; i++) {
             struct elf64_phdr *_phdr = (void *)elf + (hdr->phoff + i * hdr->phdr_size);
@@ -516,7 +533,7 @@ end_of_pt_segment:
                         *ptr = 0;
                         break;
                     }
-                    panic(true, "elf: Unresolved symbol");
+                    panic(true, "elf: Unresolved symbol \"%s\"", elf + strtab_offset + s->st_name);
                 }
                 *ptr = slide + s->st_value
 #if defined (__aarch64__)
@@ -541,7 +558,7 @@ end_of_pt_segment:
                         *ptr = 0;
                         break;
                     }
-                    panic(true, "elf: Unresolved symbol");
+                    panic(true, "elf: Unresolved symbol \"%s\"", elf + strtab_offset + s->st_name);
                 }
                 *ptr = slide + s->st_value + relocation->r_addend;
                 break;
tab: 248 wrap: offon