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