1#include <stdio.h>
2#include <err.h>
3#include <crt_externs.h>
4#include <string.h>
5#include <mach/mach.h>
6#include <mach-o/ldsyms.h>
7#include <mach-o/dyld_images.h>
8#include <stdlib.h>
9#include <sys/sysctl.h>
10
11__attribute__((constructor))
12void init(int argc, const char *argv[], const char *envp[], const char *appl[], void *vars __attribute__((unused))) {
13	int i;
14
15	printf("argv = %p\n", argv);
16	for (i=0; argv[i]; i++) {
17		printf("argv[%2d] = %p %.100s%s\n", i, argv[i], argv[i], strlen(argv[i]) > 100 ? "..." : "");
18	}
19	printf("envp = %p\n", envp);
20	for (i=0; envp[i]; i++) {
21		printf("envp[%2d] = %p %.100s%s\n", i, envp[i], envp[i], strlen(envp[i]) > 100 ? "..." : "");
22	}
23	printf("appl = %p\n", appl);
24	for (i=0; appl[i]; i++) {
25		printf("appl[%2d] = %p %.100s%s\n", i, appl[i], appl[i], strlen(appl[i]) > 100 ? "..." : "");
26	}
27}
28
29void printexecinfo(void)
30{
31	int ret;
32	uint64_t stackaddr;
33	size_t len = sizeof(stackaddr);
34
35	printf("executable load address = 0x%016llx\n", (uint64_t)(uintptr_t)&_mh_execute_header);
36
37	ret = sysctlbyname("kern.usrstack64", &stackaddr, &len, NULL, 0);
38	if (ret == -1)
39		err(1, "sysctlbyname");
40
41	printf("          stack address = 0x%016llx\n", stackaddr);
42}
43
44void printdyldinfo(void)
45{
46	task_dyld_info_data_t info;
47	mach_msg_type_number_t size = TASK_DYLD_INFO_COUNT;
48	kern_return_t kret;
49	struct dyld_all_image_infos *all_image_infos;
50
51	kret = task_info(mach_task_self(), TASK_DYLD_INFO,
52					 (void *)&info, &size);
53	if (kret != KERN_SUCCESS)
54		errx(1, "task_info: %s", mach_error_string(kret));
55
56	all_image_infos = (struct dyld_all_image_infos *)(uintptr_t)info.all_image_info_addr;
57
58	printf("      dyld load address = 0x%016llx\n", (uint64_t)(uintptr_t)all_image_infos->dyldImageLoadAddress);
59	printf("     shared cache slide = 0x%016llx\n", (uint64_t)(uintptr_t)all_image_infos->sharedCacheSlide);
60
61}
62
63int main(int argc, char *argv[]) {
64
65	printexecinfo();
66	printdyldinfo();
67
68	return 0;
69}
70