151 lines · python
1import lldb2from 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":209728560 },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 = True96 97 class MyResponder(MockGDBServerResponder):98 def __init__(self, cpusubtype):99 self.cpusubtype = cpusubtype100 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 = 4369842176123 file_offset = addr - vm_addr124 if file_offset < 0:125 return None126 # arm64_binary is just a hex-encoded (hence the 2*) Mach-O127 # header, pad out the rest with NUL characters, it doesn't128 # 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 @skipIfRemote136 def test(self):137 """Test that when attaching to an arm64 binary on an arm64e138 host, the target's arch is set to arm64, even though139 debugserver reports the process as being arm64e.140 """141 subtype_arm64e = 2142 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