fix .bss in floating dyld
changed src/stub/src/amd64-darwin.macho-upxmain.c
This commit is contained in:
committed by
Markus F.X.J. Oberhumer
parent
3774704326
commit
3e065ead65
@@ -518,8 +518,8 @@ do_xmap(
|
|||||||
) if (LC_SEGMENT_64==sc->cmd && sc->vmsize!=0) {
|
) if (LC_SEGMENT_64==sc->cmd && sc->vmsize!=0) {
|
||||||
Extent xo;
|
Extent xo;
|
||||||
size_t mlen = xo.size = sc->filesize;
|
size_t mlen = xo.size = sc->filesize;
|
||||||
unsigned char *addr = xo.buf = (unsigned char *)sc->vmaddr;
|
unsigned char *addr = xo.buf = base + (unsigned char *)sc->vmaddr;
|
||||||
unsigned char *haddr = sc->vmsize + addr;
|
unsigned char *haddr = sc->vmsize + addr;
|
||||||
size_t frag = (int)(uint64_t)addr &~ PAGE_MASK;
|
size_t frag = (int)(uint64_t)addr &~ PAGE_MASK;
|
||||||
addr -= frag;
|
addr -= frag;
|
||||||
mlen += frag;
|
mlen += frag;
|
||||||
@@ -528,17 +528,17 @@ do_xmap(
|
|||||||
// Decompressor can overrun the destination by 3 bytes. [x86 only]
|
// Decompressor can overrun the destination by 3 bytes. [x86 only]
|
||||||
size_t const mlen3 = mlen + (xi ? 3 : 0);
|
size_t const mlen3 = mlen + (xi ? 3 : 0);
|
||||||
unsigned const prot = VM_PROT_READ | VM_PROT_WRITE;
|
unsigned const prot = VM_PROT_READ | VM_PROT_WRITE;
|
||||||
unsigned const flags = ((addr + base) ? MAP_FIXED : 0) | MAP_PRIVATE |
|
unsigned const flags = (addr ? MAP_FIXED : 0) | MAP_PRIVATE |
|
||||||
((xi || 0==sc->filesize) ? MAP_ANON : 0);
|
((xi || 0==sc->filesize) ? MAP_ANON : 0);
|
||||||
int const fdm = ((0==sc->filesize) ? MAP_ANON_FD : fdi);
|
int const fdm = ((0==sc->filesize) ? MAP_ANON_FD : fdi);
|
||||||
off_t const offset = sc->fileoff + fat_offset;
|
off_t const offset = sc->fileoff + fat_offset;
|
||||||
|
|
||||||
DPRINTF((STR_mmap(), addr + base, mlen3, prot, flags, fdm, offset));
|
DPRINTF((STR_mmap(), addr, mlen3, prot, flags, fdm, offset));
|
||||||
unsigned char *mapa = mmap(addr + base, mlen3, prot, flags, fdm, offset);
|
unsigned char *mapa = mmap(addr, mlen3, prot, flags, fdm, offset);
|
||||||
if (MAP_FAILED == mapa) {
|
if (MAP_FAILED == mapa) {
|
||||||
err_exit(8);
|
err_exit(8);
|
||||||
}
|
}
|
||||||
if (0 == (addr + base)) { // dyld auto-relocate
|
if (0 == addr) { // dyld auto-relocate
|
||||||
base = (unsigned long)mapa; // relocation constant
|
base = (unsigned long)mapa; // relocation constant
|
||||||
}
|
}
|
||||||
addr = mapa;
|
addr = mapa;
|
||||||
@@ -703,6 +703,9 @@ typedef struct {
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
// Entry via JMP
|
||||||
|
asm("movl 1*8(%%rbp),%0; leaq 2*8(%%rbp),%1" : "=r" (argc), "=r" (argv) : );
|
||||||
|
|
||||||
Mach_header64 const *mhdr0 = (Mach_header64 const *)((~0ul<<16) & (unsigned long)&main);
|
Mach_header64 const *mhdr0 = (Mach_header64 const *)((~0ul<<16) & (unsigned long)&main);
|
||||||
Mach_command const *ptr = (Mach_command const *)(1+ mhdr0);
|
Mach_command const *ptr = (Mach_command const *)(1+ mhdr0);
|
||||||
f_unfilter *f_unf;
|
f_unfilter *f_unf;
|
||||||
|
|||||||
Reference in New Issue
Block a user