i386: new stub strategy to avoid problems with early mmap layout
The stub occupies the same region that execve() would create for the original progam. The stub copies everything to a new area, erases the original region, replaces it with the de-compressed program, and erases the copy of itself via the escape hatch. The copy is inexpensive via mmap() of /proc/self/exe. modified: stub/src/i386-linux.elf-entry.S modified: stub/src/i386-linux.elf-fold.S modified: stub/src/i386-linux.elf-main.c modified: p_lx_elf.cpp modified: p_lx_elf.h modified: p_lx_interp.cpp modified: p_lx_interp.h modified: p_lx_sh.cpp modified: p_lx_sh.h modified: p_mach.cpp modified: p_mach.h modified: p_unix.cpp modified: p_unix.h modified: p_vmlinx.cpp plus .h, .map, .dump
This commit is contained in:
+5
-5
@@ -764,7 +764,7 @@ public:
|
||||
// called by the generic pack()
|
||||
virtual void pack1(OutputFile *, Filter &); // generate executable header
|
||||
virtual int pack2(OutputFile *, Filter &); // append compressed data
|
||||
virtual void pack3(OutputFile *, Filter &) /*= 0*/; // append loader
|
||||
virtual off_t pack3(OutputFile *, Filter &) /*= 0*/; // append loader
|
||||
virtual void pack4(OutputFile *, Filter &) /*= 0*/; // append PackHeader
|
||||
|
||||
virtual void pack4dylib(OutputFile *, Filter &, Addr init_address);
|
||||
@@ -987,7 +987,7 @@ public:
|
||||
virtual const char *getName() const { return "dylib/ppc32"; }
|
||||
virtual const char *getFullName(const options_t *) const { return "powerpc-darwin.dylib"; }
|
||||
protected:
|
||||
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||
virtual off_t pack3(OutputFile *, Filter &); // append loader
|
||||
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||
};
|
||||
|
||||
@@ -1002,7 +1002,7 @@ public:
|
||||
virtual const char *getName() const { return "dylib/ppc64le"; }
|
||||
virtual const char *getFullName(const options_t *) const { return "powerpc64le-darwin.dylib"; }
|
||||
protected:
|
||||
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||
virtual off_t pack3(OutputFile *, Filter &); // append loader
|
||||
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||
};
|
||||
|
||||
@@ -1069,7 +1069,7 @@ public:
|
||||
virtual const char *getName() const { return "dylib/i386"; }
|
||||
virtual const char *getFullName(const options_t *) const { return "i386-darwin.dylib"; }
|
||||
protected:
|
||||
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||
virtual off_t pack3(OutputFile *, Filter &); // append loader
|
||||
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||
};
|
||||
|
||||
@@ -1137,7 +1137,7 @@ public:
|
||||
virtual const char *getName() const { return "dylib/amd64"; }
|
||||
virtual const char *getFullName(const options_t *) const { return "amd64-darwin.dylib"; }
|
||||
protected:
|
||||
virtual void pack3(OutputFile *, Filter &); // append loader
|
||||
virtual off_t pack3(OutputFile *, Filter &); // append loader
|
||||
virtual void pack4(OutputFile *, Filter &); // append PackHeader
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user