mirror of
https://github.com/upx/upx
synced 2025-10-26 23:36:41 +08:00
arm64: stub uses new strategy
modified: p_lx_elf.cpp modified: stub/src/powerpc64le-linux.elf-entry.S modified: stub/src/amd64-linux.elf-main.c modified: stub/src/arm64-linux.elf-entry.S modified: stub/src/arm64-linux.elf-fold.S modified: stub/src/arm64-linux.elf-main.c also .h, .map, .bin.dump
This commit is contained in:
@@ -460,7 +460,10 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
|
||||
// between end_text and data, which we wish to prevent
|
||||
// because the expanded program will use that space.
|
||||
// So: pretend 4KiB pages.
|
||||
upx_uint64_t const pm = (Elf32_Ehdr::EM_X86_64==e_machine)
|
||||
upx_uint64_t const pm = (
|
||||
Elf64_Ehdr::EM_X86_64 ==e_machine
|
||||
|| Elf64_Ehdr::EM_AARCH64==e_machine
|
||||
)
|
||||
? ((~(upx_uint64_t)0)<<12)
|
||||
: page_mask;
|
||||
v_hole = pm & (~pm + v_hole + get_te64(&elfout.phdr[0].p_vaddr));
|
||||
@@ -3014,35 +3017,6 @@ void PackLinuxElf64arm::defineSymbols(Filter const *ft)
|
||||
{
|
||||
PackLinuxElf64::defineSymbols(ft);
|
||||
|
||||
lsize = /*getLoaderSize()*/ 4 * 1024; // upper bound; avoid circularity
|
||||
upx_uint64_t lo_va_user = ~0ul; // infinity
|
||||
for (int j= e_phnum; --j>=0; ) {
|
||||
if (PT_LOAD64 == get_te32(&phdri[j].p_type)) {
|
||||
upx_uint64_t const va = get_te64(&phdri[j].p_vaddr);
|
||||
if (va < lo_va_user) {
|
||||
lo_va_user = va;
|
||||
}
|
||||
}
|
||||
}
|
||||
upx_uint64_t lo_va_stub = get_te64(&elfout.phdr[0].p_vaddr);
|
||||
upx_uint64_t adrm = 0; // init: pacify c++-analyzer
|
||||
|
||||
is_big = true; // kernel disallows mapping below 0x8000.
|
||||
if (is_big) {
|
||||
set_te64( &elfout.ehdr.e_entry, linker->getSymbolOffset("_start") +
|
||||
get_te64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
|
||||
set_te64(&elfout.phdr[0].p_vaddr, lo_va_user);
|
||||
set_te64(&elfout.phdr[0].p_paddr, lo_va_user);
|
||||
lo_va_stub = lo_va_user;
|
||||
adrm = getbrk(phdri, e_phnum);
|
||||
}
|
||||
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("LENF", 4+ linker->getSymbolOffset("end_decompress"));
|
||||
|
||||
#define MAP_PRIVATE 2 /* UNIX standard */
|
||||
#define MAP_FIXED 0x10 /* UNIX standard */
|
||||
#define MAP_ANONYMOUS 0x20 /* UNIX standard */
|
||||
|
||||
Reference in New Issue
Block a user