|
1 | 1 | #-*- coding:utf-8 -*-
|
2 | 2 |
|
| 3 | +import struct |
3 | 4 | from sys import stdout
|
4 | 5 | from string import printable
|
5 | 6 |
|
@@ -31,21 +32,51 @@ def xxx___libc_start_main(jitter):
|
31 | 32 | Note:
|
32 | 33 | - init, fini, rtld_fini are ignored
|
33 | 34 | - return address is forced to ABORT_ADDR, to avoid calling abort/hlt/...
|
| 35 | + - in powerpc, signature is: |
| 36 | +
|
| 37 | + int __libc_start_main (int argc, char **argv, char **ev, ElfW (auxv_t) * |
| 38 | + auxvec, void (*rtld_fini) (void), struct startup_info |
| 39 | + *stinfo, char **stack_on_entry) |
34 | 40 |
|
35 | 41 | """
|
36 | 42 | global ABORT_ADDR
|
37 |
| - ret_ad, args = jitter.func_args_systemv(["main", "argc", "ubp_av", "init", |
38 |
| - "fini", "rtld_fini", "stack_end"]) |
| 43 | + if jitter.arch.name == "ppc32": |
| 44 | + ret_ad, args = jitter.func_args_systemv( |
| 45 | + ["argc", "argv", "ev", "aux_vec", "rtld_fini", "st_info", |
| 46 | + "stack_on_entry"] |
| 47 | + ) |
| 48 | + |
| 49 | + # Mimic glibc implementation |
| 50 | + if args.stack_on_entry != 0: |
| 51 | + argc = struct.unpack(">I", |
| 52 | + jitter.vm.get_mem(args.stack_on_entry, 4))[0] |
| 53 | + argv = args.stack_on_entry + 4 |
| 54 | + envp = argv + ((argc + 1) * 4) |
| 55 | + else: |
| 56 | + argc = args.argc |
| 57 | + argv = args.argv |
| 58 | + envp = args.ev |
| 59 | + # sda_base, main, init, fini |
| 60 | + _, main, _, _ = struct.unpack(">IIII", |
| 61 | + jitter.vm.get_mem(args.st_info, 4 * 4)) |
| 62 | + |
| 63 | + else: |
| 64 | + ret_ad, args = jitter.func_args_systemv( |
| 65 | + ["main", "argc", "ubp_av", "init", "fini", "rtld_fini", "stack_end"] |
| 66 | + ) |
| 67 | + |
| 68 | + main = args.main |
| 69 | + # done by __libc_init_first |
| 70 | + size = jitter.ir_arch.pc.size / 8 |
| 71 | + argc = args.argc |
| 72 | + argv = args.ubp_av |
| 73 | + envp = argv + (args.argc + 1) * size |
39 | 74 |
|
40 |
| - # done by __libc_init_first |
41 |
| - size = jitter.ir_arch.pc.size / 8 |
42 |
| - argv = args.ubp_av |
43 |
| - envp = argv + (args.argc + 1) * size |
44 | 75 |
|
45 | 76 | # Call int main(int argc, char** argv, char** envp)
|
46 |
| - jitter.func_ret_systemv(args.main) |
| 77 | + jitter.func_ret_systemv(main) |
47 | 78 | ret_ad = ABORT_ADDR
|
48 |
| - jitter.func_prepare_systemv(ret_ad, args.argc, argv, envp) |
| 79 | + jitter.func_prepare_systemv(ret_ad, argc, argv, envp) |
49 | 80 | return True
|
50 | 81 |
|
51 | 82 |
|
|
0 commit comments