xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestDynamicLoaderDarwin.py (revision ced4e0006fab22f37a165635896a6776f79bc4a9)
1import lldb
2from lldbsuite.test.lldbtest import *
3from lldbsuite.test.decorators import *
4from lldbsuite.test.gdbclientutils import *
5from lldbsuite.test.lldbgdbclient import *
6
7images = """
8{"images":[
9    {"load_address":4370792448,
10     "mod_date":0,
11     "pathname":"/usr/lib/dyld",
12     "uuid":"75627683-A780-32AD-AE34-CF86DD23A26B",
13     "min_version_os_name":"macosx",
14     "min_version_os_sdk":"12.5",
15     "mach_header":{
16         "magic":4277009103,
17         "cputype":16777228,
18         "cpusubtype":2,
19         "filetype":7,
20         "flags":133},
21    "segments":[
22        {"name":"__TEXT",
23         "vmaddr":0,
24         "vmsize":393216,
25         "fileoff":0,
26         "filesize":393216,
27         "maxprot":5},
28        {"name":"__DATA_CONST",
29         "vmaddr":393216,
30         "vmsize":98304,
31         "fileoff":393216,
32         "filesize":98304,
33         "maxprot":3},
34        {"name":"__DATA",
35         "vmaddr":491520,
36         "vmsize":16384,
37         "fileoff":491520,
38         "filesize":16384,
39         "maxprot":3},
40        {"name":"__LINKEDIT",
41         "vmaddr":507904,
42         "vmsize":229376,
43         "fileoff":507904,
44         "filesize":227520,
45         "maxprot":1}
46    ]
47    },
48    {"load_address":4369842176,
49     "mod_date":0,
50     "pathname":"/tmp/a.out",
51     "uuid":"536A0A09-792A-377C-BEBA-FFB00A787C38",
52     "min_version_os_name":"macosx",
53     "min_version_os_sdk":"12.0",
54     "mach_header":{
55         "magic":4277009103,
56         "cputype":16777228,
57         "cpusubtype":%s,
58         "filetype":2,
59         "flags":2097285
60     },
61     "segments":[
62         {"name":"__PAGEZERO",
63          "vmaddr":0,
64          "vmsize":4294967296,
65          "fileoff":0,
66          "filesize":0,
67          "maxprot":0},
68         {"name":"__TEXT",
69          "vmaddr":4294967296,
70          "vmsize":16384,
71          "fileoff":0,
72          "filesize":16384,
73          "maxprot":5},
74         {"name":"__DATA_CONST",
75          "vmaddr":4294983680,
76          "vmsize":16384,
77          "fileoff":16384,
78          "filesize":16384,
79          "maxprot":3},
80         {"name":"__LINKEDIT",
81          "vmaddr":4295000064,
82          "vmsize":32768,
83          "fileoff":32768,
84          "filesize":19488,
85          "maxprot":1}]
86    }
87]
88}
89"""
90
91arm64_binary = "cffaedfe0c000001000000000200000010000000e8020000850020000000000019000000480000005f5f504147455a45524f00000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000019000000e80000005f5f54455854000000000000000000000000000001000000004000000000000000000000000000000040000000000000050000000500000002000000000000005f5f74657874000000000000000000005f5f5445585400000000000000000000b03f0000010000000800000000000000b03f0000020000000000000000000000000400800000000000000000000000005f5f756e77696e645f696e666f0000005f5f5445585400000000000000000000b83f0000010000004800000000000000b83f00000200000000000000000000000000000000000000000000000000000019000000480000005f5f4c494e4b45444954000000000000004000000100000000400000000000000040000000000000b8010000000000000100000001000000000000000000000034000080100000000040000038000000330000801000000038400000300000000200000018000000704000000100000080400000180000000b000000500000000000000000000000000000000100000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000200000000c0000002f7573722f6c69622f64796c64000000000000001b00000018000000a9981092eb3632f4afd9957e769160d932000000200000000100000000000c0000050c000100000003000000000633032a0000001000000000000000000000002800008018000000b03f00000000000000000000000000000c00000038000000180000000200000001781f05000001002f7573722f6c69622f6c696253797374656d2e422e64796c696200000000000026000000100000006840000008000000290000001000000070400000000000001d00000010000000a04000001801" + '0'*16384
92
93class TestDynamicLoaderDarwin(GDBRemoteTestBase):
94
95    NO_DEBUG_INFO_TESTCASE = True
96    class MyResponder(MockGDBServerResponder):
97
98        def __init__(self, cpusubtype):
99            self.cpusubtype = cpusubtype
100            MockGDBServerResponder.__init__(self)
101
102        def respond(self, packet):
103            if packet == "qProcessInfo":
104                return self.qProcessInfo()
105            return MockGDBServerResponder.respond(self, packet)
106
107        def qHostInfo(self):
108            return "cputype:16777223;cpusubtype:2;ostype:macosx;vendor:apple;os_version:10.15.4;maccatalyst_version:13.4;endian:little;ptrsize:8;"
109
110        def qProcessInfo(self):
111            return "pid:a860;parent-pid:d2a0;real-uid:1f5;real-gid:14;effective-uid:1f5;effective-gid:14;cputype:100000c;cpusubtype:2;ptrsize:8;ostype:macosx;vendor:apple;endian:little;"
112
113        def jGetLoadedDynamicLibrariesInfos(self, packet):
114            if 'fetch_all_solibs' in packet:
115                return escape_binary(images%self.cpusubtype)
116            return "OK"
117
118        def vCont(self):
119            return "vCont;"
120
121        def readMemory(self, addr, length):
122            return arm64_binary[addr-4369842176:length]
123
124        def setBreakpoint(self, packet):
125            return ""
126
127    @skipIfRemote
128    def test(self):
129        """Test that when attaching to an arm64 binary on an arm64e
130        host, the target's arch is set to arm64, even though
131        debugserver reports the process as being arm64e.
132        """
133        subtype_arm64e = 2
134        self.server.responder = self.MyResponder(subtype_arm64e)
135        if self.TraceOn():
136            self.runCmd("log enable gdb-remote packets")
137            self.addTearDownHook(
138                lambda: self.runCmd("log disable gdb-remote packets"))
139
140        target = self.dbg.CreateTargetWithFileAndArch(None, None)
141        process = self.connect(target)
142
143        self.assertEqual(target.GetTriple(), "arm64-apple-macosx-")
144