about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-12-29 13:39:51 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-12-29 13:39:51 +0100
commitecca96c03e9067bac1608fa4231bbb9b7dd1e47d (patch)
tree73ae7a85b19ac7c9dc891ef3d7b044607d032c90 /src
parent49231a593a5039a6390c6d71caa49799de51a54e (diff)
downloadbox64-ecca96c03e9067bac1608fa4231bbb9b7dd1e47d.tar.gz
box64-ecca96c03e9067bac1608fa4231bbb9b7dd1e47d.zip
Reworked how /proc/self/maps is tranformed
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c64
1 files changed, 34 insertions, 30 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 0df3bc09..e0c52008 100755
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -1592,39 +1592,43 @@ void ResetSpecialCaseMainElf(elfheader_t* h)
 
 void CreateMemorymapFile(box64context_t* context, int fd)
 {
+    // this will tranform current memory map
+    // by anotating anonymous entry that belong to emulated elf
+    // also anonymising current stack
+    // and setting emulated stack as the current one
+
+    char* line = NULL;
+    size_t len = 0;
     char buff[1024];
-    struct stat st;
     int dummy;
-    (void)dummy;
-
-    elfheader_t *h = context->elfs[0];
-
-    if (stat(h->path, &st)) {
-        printf_log(LOG_INFO, "Failed to stat file %s (creating memory maps \"file\")!", h->path);
-        // Some constants, to have "valid" values
-        st.st_dev = makedev(0x03, 0x00);
-        st.st_ino = 0;
-    }
-
-    // TODO: create heap entry?
-
-    for (size_t i=0; i<h->numPHEntries; ++i) {
-        if (h->PHEntries[i].p_memsz == 0) continue;
-
-        sprintf(buff, "%016lx-%016lx %c%c%c%c %016lx %02x:%02x %ld %s\n", (uintptr_t)h->PHEntries[i].p_vaddr + h->delta,
-            (uintptr_t)h->PHEntries[i].p_vaddr + h->PHEntries[i].p_memsz + h->delta,
-            (h->PHEntries[i].p_type & (PF_R|PF_X) ? 'r':'-'), (h->PHEntries[i].p_type & PF_W ? 'w':'-'),
-            (h->PHEntries[i].p_type & PF_X ? 'x':'-'), 'p', // p for private or s for shared
-            (uintptr_t)h->PHEntries[i].p_offset,
-            major(st.st_dev), minor(st.st_dev), st.st_ino, h->path);
-        
-        dummy = write(fd, buff, strlen(buff));
+    FILE* f = fopen("/proc/self/maps", "r");
+    if(!f)
+        return;
+    while(getline(&line, &len, f)>0) {
+        // line is like
+        // aaaadd750000-aaaadd759000 r-xp 00000000 103:02 13386730                  /usr/bin/cat
+        uintptr_t start, end;
+        if (sscanf(line, "%zx-%zx", &start, &end)==2) {
+            elfheader_t* h = FindElfAddress(my_context, start);
+            size_t l = strlen(line);
+            if(h && l<73) {
+                sprintf(buff, "%s%*s\n", line, 74-strlen(line), h->name);
+                dummy = write(fd, buff, strlen(buff));
+            } else if(start==(uintptr_t)my_context->stack) {
+                sprintf(buff, "%s%*s\n", line, 74-strlen(line), "[stack]");
+                dummy = write(fd, buff, strlen(buff));
+            } else if (strstr(line, "[stack]")) {
+                char* p = strstr(line, "[stack]")-1;
+                while (*p==' ' || *p=='\t') --p;
+                p[1]='\0';
+                strcat(line, "\n");
+                write(fd, line, strlen(line));
+            } else {
+                write(fd, line, strlen(line));
+            }
+        }
     }
-    // create stack entry
-    sprintf(buff, "%16lx-%16lx %c%c%c%c %16lx %02x:%02x %ld %s\n", 
-        (uintptr_t)context->stack, (uintptr_t)context->stack+context->stacksz,
-        'r','w','-','p', 0L, 0, 0, 0L, "[stack]");
-    dummy = write(fd, buff, strlen(buff));
+    fclose(f);
 }
 
 void ElfAttachLib(elfheader_t* head, library_t* lib)