mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
mipsel conditional stub/src/i386-linux.elf-main.c
This commit is contained in:
parent
1d7e5a8130
commit
f252f824a4
|
@ -512,6 +512,16 @@ ERR_LAB
|
||||||
// This function is optimized for size.
|
// This function is optimized for size.
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
#if defined(__mips__) /*{*/
|
||||||
|
void *upx_main( // returns entry address
|
||||||
|
struct b_info const *const bi, // 1st block header
|
||||||
|
size_t const sz_compressed, // total length
|
||||||
|
Elf32_Ehdr *const ehdr, // temp char[sz_ehdr] for decompressing
|
||||||
|
Elf32_auxv_t *const av,
|
||||||
|
f_expand *const f_decompress,
|
||||||
|
f_unfilter *const f_unf
|
||||||
|
)
|
||||||
|
#else /*}{ !__mips__ */
|
||||||
void *upx_main(
|
void *upx_main(
|
||||||
Elf32_auxv_t *const av,
|
Elf32_auxv_t *const av,
|
||||||
unsigned const sz_compressed,
|
unsigned const sz_compressed,
|
||||||
|
@ -531,12 +541,26 @@ void *upx_main(
|
||||||
Extent xi, // {sz_cpr, &b_info} for ELF headers
|
Extent xi, // {sz_cpr, &b_info} for ELF headers
|
||||||
unsigned const volatile dynbase // value+result: compiler must not change
|
unsigned const volatile dynbase // value+result: compiler must not change
|
||||||
)
|
)
|
||||||
|
#endif /*}*/
|
||||||
{
|
{
|
||||||
|
#if !defined(__mips__) /*{*/
|
||||||
Elf32_Ehdr *const ehdr = (Elf32_Ehdr *)(void *)xo.buf; // temp char[MAX_ELF_HDR+OVERHEAD]
|
Elf32_Ehdr *const ehdr = (Elf32_Ehdr *)(void *)xo.buf; // temp char[MAX_ELF_HDR+OVERHEAD]
|
||||||
|
#endif /*}*/
|
||||||
Elf32_Phdr const *phdr = (Elf32_Phdr const *)(1+ ehdr);
|
Elf32_Phdr const *phdr = (Elf32_Phdr const *)(1+ ehdr);
|
||||||
Elf32_Addr reloc;
|
Elf32_Addr reloc;
|
||||||
Elf32_Addr entry;
|
Elf32_Addr entry;
|
||||||
|
|
||||||
|
#if defined(__mips__) /*{*/
|
||||||
|
unsigned dynbase = 0;
|
||||||
|
Extent xo, xi, xj;
|
||||||
|
xo.buf = (char *)ehdr;
|
||||||
|
xo.size = bi->sz_unc;
|
||||||
|
xi.buf = CONST_CAST(char *, bi); xi.size = sz_compressed;
|
||||||
|
xj.buf = CONST_CAST(char *, bi); xj.size = sz_compressed;
|
||||||
|
|
||||||
|
// ehdr = Uncompress Ehdr and Phdrs
|
||||||
|
unpackExtent(&xj, &xo, f_decompress, 0); // never filtered?
|
||||||
|
#else /*}{ !__mips__ */
|
||||||
// sizeof(Ehdr+Phdrs), compressed; including b_info header
|
// sizeof(Ehdr+Phdrs), compressed; including b_info header
|
||||||
size_t const sz_pckhdrs = xi.size;
|
size_t const sz_pckhdrs = xi.size;
|
||||||
|
|
||||||
|
@ -553,6 +577,7 @@ void *upx_main(
|
||||||
// Prepare to decompress the Elf headers again, into the first PT_LOAD.
|
// Prepare to decompress the Elf headers again, into the first PT_LOAD.
|
||||||
xi.buf -= sz_pckhdrs;
|
xi.buf -= sz_pckhdrs;
|
||||||
xi.size = sz_compressed;
|
xi.size = sz_compressed;
|
||||||
|
#endif /*}*/
|
||||||
|
|
||||||
// Some kernels omit AT_PHNUM,AT_PHENT,AT_PHDR because this stub has no PT_INTERP.
|
// Some kernels omit AT_PHNUM,AT_PHENT,AT_PHDR because this stub has no PT_INTERP.
|
||||||
// That is "too much" optimization. Linux 2.6.x seems to give all AT_*.
|
// That is "too much" optimization. Linux 2.6.x seems to give all AT_*.
|
||||||
|
@ -585,7 +610,6 @@ ERR_LAB
|
||||||
return (void *)entry;
|
return (void *)entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
vi:ts=4:et:nowrap
|
vi:ts=4:et:nowrap
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user