Struct ether accesses netif anonymously
[akaros.git] / kern / src / elf.c
index 171fa30..eb06184 100644 (file)
@@ -80,7 +80,9 @@ static int load_one_elf(struct proc *p, struct file *f, uintptr_t pgoffset,
                goto fail;
        }
        #endif
-       #ifdef CONFIG_X86_64
+       /* Not sure what RISCV's 64 bit kernel can do here, so this check is x86
+        * only */
+       #ifdef CONFIG_X86
        if (elf32) {
                printk("[kernel] load_one_elf: 32 bit elf on 64 bit kernel\n");
                goto fail;
@@ -266,8 +268,13 @@ int load_elf(struct proc* p, struct file* f)
                struct file *interp = do_file_open(ei.interp, 0, 0);
                if (!interp)
                        return -1;
-               /* Load dynamic linker one page into the address space */
-               int error = load_one_elf(p, interp, 1, &interp_ei, TRUE);
+               /* Load dynamic linker at 1M. Obvious MIB joke avoided.
+                * It used to be loaded at page 1, but the existence of valid addresses
+                * that low masked bad derefs through NULL pointer structs. This in turn
+                * helped us waste a full day debugging a bug in the Go runtime. True!
+                * Note that MMAP_LOWEST_VA also has this value but we want to make this
+                * explicit. */
+               int error = load_one_elf(p, interp, MiB>>12, &interp_ei, TRUE);
                kref_put(&interp->f_kref);
                if (error)
                        return -1;