Map when .vmsize (not .filesize). More debugging DPRINTF;

modified:   stub/src/amd64-darwin.macho-main.c
	also *.macho-fold.h, *.macho-fold.map
This commit is contained in:
John Reiser 2018-09-22 13:06:45 -07:00
parent bb1f9cdecd
commit c1cfde21d7

View File

@ -128,6 +128,7 @@ xread(Extent *x, void *buf, size_t count)
for (j = count; 0!=j--; ++p, ++q) { for (j = count; 0!=j--; ++p, ++q) {
*q = *p; *q = *p;
} }
DPRINTF(" buf: %%x %%x %%x\\n", ((int *)buf)[0], ((int *)buf)[1], ((int *)buf)[2]);
x->buf += count; x->buf += count;
x->size -= count; x->size -= count;
} }
@ -480,15 +481,18 @@ xfind_pages(
int j; int j;
unsigned mflags = ((mhdr->filetype == MH_DYLINKER || mhdr->flags & MH_PIE) ? 0 : MAP_FIXED); unsigned mflags = ((mhdr->filetype == MH_DYLINKER || mhdr->flags & MH_PIE) ? 0 : MAP_FIXED);
mflags += MAP_PRIVATE | MAP_ANON; // '+' can optimize better than '|' mflags += MAP_PRIVATE | MAP_ANON; // '+' can optimize better than '|'
DPRINTF("xfind_pages mhdr=%%p sc=%%p ncmds=%%d addr=%%p\\n", DPRINTF("xfind_pages mhdr=%%p sc=%%p ncmds=%%d addr=%%p mflags=%%x\\n",
mhdr, sc, ncmds, addr); mhdr, sc, ncmds, addr, mflags);
for (j=0; j < ncmds; ++j, for (j=0; j < ncmds; ++j,
(sc = (Mach_segment_command const *)((sc->cmdsize>>2) + (unsigned const *)sc)) (sc = (Mach_segment_command const *)((sc->cmdsize>>2) + (unsigned const *)sc))
) { ) if (LC_SEGMENT==sc->cmd) {
DPRINTF(" #%%d cmd=%%x cmdsize=%%x\\n", j, sc->cmd, sc->cmdsize); DPRINTF(" #%%d cmd=%%x cmdsize=%%x vmaddr=%%p vmsize==%%p lo=%%p mflags=%%x\\n",
if (LC_SEGMENT==sc->cmd && sc->vmsize && sc->filesize) { j, sc->cmd, sc->cmdsize, sc->vmaddr, sc->vmsize, lo, mflags);
if (0==(1+ lo) // 1st LC_SEGMENT if (sc->vmsize // theoretically occupies address space
&& mhdr->filetype == MH_DYLINKER // of /usr/lib/dyld && !(sc->vmaddr==0 && (MAP_FIXED & mflags)) // but ignore PAGEZERO when MAP_FIXED
) {
if (mhdr->filetype == MH_DYLINKER // /usr/lib/dyld
&& 0==(1+ lo) // 1st LC_SEGMENT
&& sc->vmaddr != 0 // non-floating address && sc->vmaddr != 0 // non-floating address
) { ) {
// "pre-linked" dyld on MacOS 10.11.x El Capitan // "pre-linked" dyld on MacOS 10.11.x El Capitan
@ -504,12 +508,19 @@ xfind_pages(
} }
lo -= ~PAGE_MASK & lo; // round down to page boundary lo -= ~PAGE_MASK & lo; // round down to page boundary
hi = PAGE_MASK & (hi - lo - PAGE_MASK -1); // page length hi = PAGE_MASK & (hi - lo - PAGE_MASK -1); // page length
DPRINTF(" addr=%%p lo=%%p len=%%p mflags=%%x\\n", addr, lo, hi, mflags);
if (MAP_FIXED & mflags) { if (MAP_FIXED & mflags) {
addr = lo; addr = lo;
int rv = munmap((void *)addr, hi);
if (rv) {
DPRINTF("munmap addr=%%p len=%%p, rv=%%x\\n", addr, hi, rv);
}
} }
DPRINTF(" addr=%%p lo=%%p len=%%p mflags=%%x\\n", addr, lo, hi, mflags);
addr = (Addr)mmap((void *)addr, hi, PROT_NONE, mflags, MAP_ANON_FD, 0); addr = (Addr)mmap((void *)addr, hi, PROT_NONE, mflags, MAP_ANON_FD, 0);
DPRINTF(" addr=%%p\\n", addr); DPRINTF(" addr=%%p\\n", addr);
if (~PAGE_MASK & addr) {
err_exit(6);
}
return (Addr)(addr - lo); return (Addr)(addr - lo);
} }
@ -536,7 +547,7 @@ do_xmap(
(sc = (Mach_segment_command *)((sc->cmdsize>>2) + (unsigned *)sc)) (sc = (Mach_segment_command *)((sc->cmdsize>>2) + (unsigned *)sc))
) { ) {
DPRINTF(" #%%d cmd=%%x cmdsize=%%x\\n", j, sc->cmd, sc->cmdsize); DPRINTF(" #%%d cmd=%%x cmdsize=%%x\\n", j, sc->cmd, sc->cmdsize);
if (LC_SEGMENT==sc->cmd && sc->filesize) { if (LC_SEGMENT==sc->cmd && sc->vmsize) {
Extent xo; Extent xo;
size_t mlen = xo.size = sc->filesize; size_t mlen = xo.size = sc->filesize;
xo.buf = (void *)(reloc + sc->vmaddr); xo.buf = (void *)(reloc + sc->vmaddr);
@ -863,7 +874,7 @@ finish:
done: done:
va_end(va); va_end(va);
return n; return n;
} }
#endif //} #endif //}