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" 92 93 94class TestDynamicLoaderDarwin(GDBRemoteTestBase): 95 NO_DEBUG_INFO_TESTCASE = True 96 97 class MyResponder(MockGDBServerResponder): 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 vm_addr = 4369842176 123 file_offset = addr - vm_addr 124 if file_offset < 0: 125 return None 126 # arm64_binary is just a hex-encoded (hence the 2*) Mach-O 127 # header, pad out the rest with NUL characters, it doesn't 128 # matter for this test. 129 memory = arm64_binary + "00" * (length - len(arm64_binary) << 1) 130 return memory[2 * file_offset :] 131 132 def setBreakpoint(self, packet): 133 return "" 134 135 @skipIfRemote 136 def test(self): 137 """Test that when attaching to an arm64 binary on an arm64e 138 host, the target's arch is set to arm64, even though 139 debugserver reports the process as being arm64e. 140 """ 141 subtype_arm64e = 2 142 self.server.responder = self.MyResponder(subtype_arm64e) 143 if self.TraceOn(): 144 self.runCmd("log enable gdb-remote packets") 145 self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets")) 146 147 target = self.dbg.CreateTargetWithFileAndArch(None, None) 148 process = self.connect(target) 149 150 self.assertEqual(target.GetTriple(), "arm64-apple-macosx-") 151