xref: /llvm-project/lldb/test/API/macosx/unregistered-macho/main.c (revision ac49e9021919d2a356dd10b39888f168736a43b0)
1*ac49e902SJason Molenda #include <mach-o/loader.h>
2*ac49e902SJason Molenda #include <mach/machine.h>
3*ac49e902SJason Molenda #include <stdlib.h>
4*ac49e902SJason Molenda #include <string.h>
5*ac49e902SJason Molenda #include <uuid/uuid.h>
6*ac49e902SJason Molenda 
main()7*ac49e902SJason Molenda int main() {
8*ac49e902SJason Molenda   int size_of_load_cmds =
9*ac49e902SJason Molenda       sizeof(struct segment_command_64) + sizeof(struct uuid_command);
10*ac49e902SJason Molenda   uint8_t *macho_buf =
11*ac49e902SJason Molenda       (uint8_t *)malloc(sizeof(struct mach_header_64) + size_of_load_cmds);
12*ac49e902SJason Molenda   uint8_t *p = macho_buf;
13*ac49e902SJason Molenda   struct mach_header_64 mh;
14*ac49e902SJason Molenda   mh.magic = MH_MAGIC_64;
15*ac49e902SJason Molenda   mh.cputype = CPU_TYPE_ARM64;
16*ac49e902SJason Molenda   mh.cpusubtype = 0;
17*ac49e902SJason Molenda   mh.filetype = MH_EXECUTE;
18*ac49e902SJason Molenda   mh.ncmds = 2;
19*ac49e902SJason Molenda   mh.sizeofcmds = size_of_load_cmds;
20*ac49e902SJason Molenda   mh.flags = MH_NOUNDEFS | MH_DYLDLINK | MH_TWOLEVEL | MH_PIE;
21*ac49e902SJason Molenda 
22*ac49e902SJason Molenda   memcpy(p, &mh, sizeof(mh));
23*ac49e902SJason Molenda   p += sizeof(mh);
24*ac49e902SJason Molenda 
25*ac49e902SJason Molenda   struct segment_command_64 seg;
26*ac49e902SJason Molenda   seg.cmd = LC_SEGMENT_64;
27*ac49e902SJason Molenda   seg.cmdsize = sizeof(seg);
28*ac49e902SJason Molenda   strcpy(seg.segname, "__TEXT");
29*ac49e902SJason Molenda   seg.vmaddr = 0x5000;
30*ac49e902SJason Molenda   seg.vmsize = 0x1000;
31*ac49e902SJason Molenda   seg.fileoff = 0;
32*ac49e902SJason Molenda   seg.filesize = 0;
33*ac49e902SJason Molenda   seg.maxprot = 0;
34*ac49e902SJason Molenda   seg.initprot = 0;
35*ac49e902SJason Molenda   seg.nsects = 0;
36*ac49e902SJason Molenda   seg.flags = 0;
37*ac49e902SJason Molenda 
38*ac49e902SJason Molenda   memcpy(p, &seg, sizeof(seg));
39*ac49e902SJason Molenda   p += sizeof(seg);
40*ac49e902SJason Molenda 
41*ac49e902SJason Molenda   struct uuid_command uuid;
42*ac49e902SJason Molenda   uuid.cmd = LC_UUID;
43*ac49e902SJason Molenda   uuid.cmdsize = sizeof(uuid);
44*ac49e902SJason Molenda   uuid_clear(uuid.uuid);
45*ac49e902SJason Molenda   uuid_parse("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb", uuid.uuid);
46*ac49e902SJason Molenda 
47*ac49e902SJason Molenda   memcpy(p, &uuid, sizeof(uuid));
48*ac49e902SJason Molenda   p += sizeof(uuid);
49*ac49e902SJason Molenda 
50*ac49e902SJason Molenda   // If this needs to be debugged, the memory buffer can be written
51*ac49e902SJason Molenda   // to a file with
52*ac49e902SJason Molenda   // (lldb) mem rea -b -o /tmp/t -c `p - macho_buf` macho_buf
53*ac49e902SJason Molenda   // (lldb) platform shell otool -hlv /tmp/t
54*ac49e902SJason Molenda   // to verify that it is well formed.
55*ac49e902SJason Molenda 
56*ac49e902SJason Molenda   // And inside lldb, it should be inspectable via
57*ac49e902SJason Molenda   // (lldb) script print(lldb.frame.locals["macho_buf"][0].GetValueAsUnsigned())
58*ac49e902SJason Molenda   // 105553162403968
59*ac49e902SJason Molenda   // (lldb) process plugin packet send
60*ac49e902SJason Molenda   // 'jGetLoadedDynamicLibrariesInfos:{"solib_addresses":[105553162403968]}]'
61*ac49e902SJason Molenda 
62*ac49e902SJason Molenda   return 0; // break here
63*ac49e902SJason Molenda }
64