Skip to content

Commit a635e3e

Browse files
committed
Linux fake: __libc_start_main implementation for PPC
See glibc: 'sysdeps/unix/sysv/linux/powerpc/libc-start.c' for details
1 parent acebba6 commit a635e3e

File tree

2 files changed

+40
-9
lines changed

2 files changed

+40
-9
lines changed

miasm2/os_dep/linux_stdlib.py

+39-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#-*- coding:utf-8 -*-
22

3+
import struct
34
from sys import stdout
45
from string import printable
56

@@ -31,21 +32,51 @@ def xxx___libc_start_main(jitter):
3132
Note:
3233
- init, fini, rtld_fini are ignored
3334
- 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)
3440
3541
"""
3642
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
3974

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
4475

4576
# Call int main(int argc, char** argv, char** envp)
46-
jitter.func_ret_systemv(args.main)
77+
jitter.func_ret_systemv(main)
4778
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)
4980
return True
5081

5182

test/test_all.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ class ExampleJitterNoPython(ExampleJitter):
686686
Example.get_sample("md5_aarch64l"), "--mimic-env"],
687687
[]),
688688
(["sandbox_elf_ppc32.py",
689-
Example.get_sample("md5_ppc32b"), "-a", "0x1000087C"],
689+
Example.get_sample("md5_ppc32b"), "--mimic-env"],
690690
[]),
691691
(["msp430.py", Example.get_sample("msp430_sc.bin"), "0"],
692692
[test_msp430]),

0 commit comments

Comments
 (0)