mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
ARM Try a hole so that kernel does not extend brk(0)
This commit is contained in:
parent
36c0928483
commit
66269eabe9
|
@ -2567,8 +2567,6 @@ int PackLinuxElf32::ARM_is_QNX(void)
|
||||||
|
|
||||||
void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/)
|
void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/)
|
||||||
{
|
{
|
||||||
unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info);
|
|
||||||
|
|
||||||
lsize = /*getLoaderSize()*/ 4 * 1024; // upper bound; avoid circularity
|
lsize = /*getLoaderSize()*/ 4 * 1024; // upper bound; avoid circularity
|
||||||
unsigned lo_va_user = ~0u; // infinity
|
unsigned lo_va_user = ~0u; // infinity
|
||||||
for (int j= e_phnum; --j>=0; ) {
|
for (int j= e_phnum; --j>=0; ) {
|
||||||
|
@ -2582,9 +2580,8 @@ void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/)
|
||||||
unsigned lo_va_stub = get_te32(&elfout.phdr[0].p_vaddr);
|
unsigned lo_va_stub = get_te32(&elfout.phdr[0].p_vaddr);
|
||||||
unsigned adrc;
|
unsigned adrc;
|
||||||
unsigned adrm;
|
unsigned adrm;
|
||||||
unsigned adrx;
|
|
||||||
|
|
||||||
bool const is_big = true;
|
bool const is_big = true; // kernel disallows mapping below 0x8000.
|
||||||
if (is_big) {
|
if (is_big) {
|
||||||
set_te32( &elfout.ehdr.e_entry, linker->getSymbolOffset("_start") +
|
set_te32( &elfout.ehdr.e_entry, linker->getSymbolOffset("_start") +
|
||||||
get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
get_te32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
||||||
|
@ -2593,16 +2590,15 @@ void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/)
|
||||||
lo_va_stub = lo_va_user;
|
lo_va_stub = lo_va_user;
|
||||||
adrc = lo_va_stub;
|
adrc = lo_va_stub;
|
||||||
adrm = getbrk(phdri, e_phnum);
|
adrm = getbrk(phdri, e_phnum);
|
||||||
adrx = hlen + (page_mask & (~page_mask + adrm)); // round up to page boundary
|
|
||||||
}
|
}
|
||||||
adrm = page_mask & (~page_mask + adrm); // round up to page boundary
|
|
||||||
adrc = page_mask & (~page_mask + adrc); // round up to page boundary
|
adrc = page_mask & (~page_mask + adrc); // round up to page boundary
|
||||||
|
adrm = page_mask & (~page_mask + adrm); // round up to page boundary
|
||||||
|
adrm += page_size; // Try: hole so that kernel does not extend the brk(0)
|
||||||
|
linker->defineSymbol("ADRM", adrm); // addr for map
|
||||||
|
|
||||||
linker->defineSymbol("CPR0", 4+ linker->getSymbolOffset("cpr0"));
|
linker->defineSymbol("CPR0", 4+ linker->getSymbolOffset("cpr0"));
|
||||||
linker->defineSymbol("LENF", 4+ linker->getSymbolOffset("end_decompress"));
|
linker->defineSymbol("LENF", 4+ linker->getSymbolOffset("end_decompress"));
|
||||||
|
|
||||||
linker->defineSymbol("ADRM", adrm); // addr for map
|
|
||||||
|
|
||||||
#define MAP_PRIVATE 2 /* UNIX standard */
|
#define MAP_PRIVATE 2 /* UNIX standard */
|
||||||
#define MAP_FIXED 0x10 /* UNIX standard */
|
#define MAP_FIXED 0x10 /* UNIX standard */
|
||||||
#define MAP_ANONYMOUS 0x20 /* UNIX standard */
|
#define MAP_ANONYMOUS 0x20 /* UNIX standard */
|
||||||
|
@ -2611,8 +2607,6 @@ void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/)
|
||||||
if (ARM_is_QNX())
|
if (ARM_is_QNX())
|
||||||
mflg = MAP_PRIVANON;
|
mflg = MAP_PRIVANON;
|
||||||
linker->defineSymbol("MFLG", mflg);
|
linker->defineSymbol("MFLG", mflg);
|
||||||
|
|
||||||
ACC_UNUSED(adrx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PackLinuxElf32armLe::defineSymbols(Filter const *ft)
|
void PackLinuxElf32armLe::defineSymbols(Filter const *ft)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user