242 lines · python
1import lldb2from lldbsuite.test.decorators import *3from lldbsuite.test.lldbtest import *4from lldbsuite.test import lldbutil5 6import json7import uuid8import os9import shutil10import time11 12 13class TestObjectFileJSON(TestBase):14 TRIPLE = "arm64-apple-macosx13.0.0"15 16 def setUp(self):17 TestBase.setUp(self)18 self.source = "main.c"19 20 def emitJSON(self, data, path):21 json_object = json.dumps(data, indent=4)22 with open(path, "w") as outfile:23 outfile.write(json_object)24 25 def toModuleSpec(self, path):26 module_spec = lldb.SBModuleSpec()27 module_spec.SetFileSpec(lldb.SBFileSpec(path))28 return module_spec29 30 @no_debug_info_test31 def test_target(self):32 triple = "arm64-apple-macosx13.0.0"33 data = {34 "triple": triple,35 "uuid": str(uuid.uuid4()),36 "type": "executable",37 }38 39 json_object_file = self.getBuildArtifact("a.json")40 self.emitJSON(data, json_object_file)41 42 target = self.dbg.CreateTarget(json_object_file)43 self.assertTrue(target.IsValid())44 self.assertEqual(target.GetTriple(), triple)45 46 @no_debug_info_test47 def test_module(self):48 self.build()49 exe = self.getBuildArtifact("a.out")50 target = self.dbg.CreateTarget(exe)51 52 data = {53 "triple": target.GetTriple(),54 "uuid": str(uuid.uuid4()),55 }56 57 json_object_file_b = self.getBuildArtifact("b.json")58 self.emitJSON(data, json_object_file_b)59 60 module = target.AddModule(self.toModuleSpec(json_object_file_b))61 self.assertFalse(module.IsValid())62 TEXT_file_addr = 0x10000000063 DATA_file_addr = 0x10000100064 foo_file_addr = TEXT_file_addr + 0x10065 bar_file_addr = DATA_file_addr + 0x1066 TEXT_size = 0x22267 text_size = 0x2068 DATA_size = 0x33369 foo_size = 0x1170 bar_size = 0x2271 slide = 0x10000000072 data = {73 "triple": target.GetTriple(),74 "uuid": str(uuid.uuid4()),75 "type": "sharedlibrary",76 "sections": [77 {78 "user_id": 0x100,79 "name": "__PAGEZERO",80 "type": "container",81 "address": 0,82 "size": 0x100000000,83 "flags": 0x10184 },85 {86 "user_id": 0x200,87 "name": "__TEXT",88 "type": "container",89 "address": TEXT_file_addr,90 "size": TEXT_size,91 "flags": 0x202,92 "file_offset": 0,93 "file_size": TEXT_size,94 "read": True,95 "write": False,96 "execute": True,97 "subsections": [98 {99 "name": "__text",100 "type": "code",101 "address": TEXT_file_addr,102 "size": text_size,103 "alignment": 2,104 "read": True,105 "write": False,106 "execute": True,107 },108 {109 "name": "__fake",110 "address": TEXT_file_addr + 1 * text_size,111 "size": text_size,112 "fake": True113 },114 {115 "name": "__encrypted",116 "address": TEXT_file_addr + 2 * text_size,117 "size": text_size,118 "encrypted": True119 },120 {121 "name": "__tls",122 "address": TEXT_file_addr + 2 * text_size,123 "size": text_size,124 "thread_specific": True125 }126 ],127 },128 {129 "name": "__DATA",130 "type": "data",131 "address": DATA_file_addr,132 "size": DATA_size,133 "read": True,134 "write": True,135 "execute": False,136 "flags": 0x303,137 "file_offset": DATA_file_addr - TEXT_file_addr,138 "file_size": DATA_size,139 },140 ],141 "symbols": [142 {143 "name": "foo",144 "type": "code",145 "address": foo_file_addr,146 "size": foo_size,147 },148 {149 "name": "bar",150 "type": "data",151 "address": bar_file_addr,152 "size": bar_size,153 },154 ],155 }156 157 json_object_file_c = self.getBuildArtifact("c.json")158 self.emitJSON(data, json_object_file_c)159 160 module = target.AddModule(self.toModuleSpec(json_object_file_c))161 self.assertTrue(module.IsValid())162 163 TEXT_section = module.GetSectionAtIndex(0)164 self.assertTrue(TEXT_section.IsValid())165 self.assertEqual(TEXT_section.GetName(), "__PAGEZERO")166 self.assertEqual(TEXT_section.file_addr, 0)167 self.assertEqual(TEXT_section.size, 0x100000000)168 self.assertEqual(TEXT_section.GetSectionType(), lldb.eSectionTypeContainer)169 self.assertEqual(TEXT_section.GetNumSubSections(), 0)170 text_permissions = TEXT_section.GetPermissions()171 self.assertFalse((text_permissions & lldb.ePermissionsReadable) != 0)172 self.assertFalse((text_permissions & lldb.ePermissionsWritable) != 0)173 self.assertFalse((text_permissions & lldb.ePermissionsExecutable) != 0)174 175 TEXT_section = module.GetSectionAtIndex(1)176 self.assertTrue(TEXT_section.IsValid())177 self.assertEqual(TEXT_section.GetName(), "__TEXT")178 self.assertEqual(TEXT_section.file_addr, TEXT_file_addr)179 self.assertEqual(TEXT_section.size, TEXT_size)180 self.assertEqual(TEXT_section.file_offset, 0)181 self.assertEqual(TEXT_section.file_size, TEXT_size)182 self.assertEqual(TEXT_section.GetSectionType(), lldb.eSectionTypeContainer)183 self.assertEqual(TEXT_section.GetNumSubSections(), 4)184 text_permissions = TEXT_section.GetPermissions()185 self.assertTrue((text_permissions & lldb.ePermissionsReadable) != 0)186 self.assertFalse((text_permissions & lldb.ePermissionsWritable) != 0)187 self.assertTrue((text_permissions & lldb.ePermissionsExecutable) != 0)188 189 text_section = TEXT_section.GetSubSectionAtIndex(0)190 self.assertEqual(text_section.GetName(), "__text")191 self.assertEqual(text_section.size, text_size)192 self.assertEqual(text_section.GetAlignment(), 4)193 self.assertEqual(text_section.GetSectionType(), lldb.eSectionTypeCode)194 self.assertEqual(text_section.GetNumSubSections(), 0)195 text_permissions = text_section.GetPermissions()196 self.assertTrue((text_permissions & lldb.ePermissionsReadable) != 0)197 self.assertFalse((text_permissions & lldb.ePermissionsWritable) != 0)198 self.assertTrue((text_permissions & lldb.ePermissionsExecutable) != 0)199 200 DATA_section = module.GetSectionAtIndex(2)201 self.assertTrue(DATA_section.IsValid())202 self.assertEqual(DATA_section.GetName(), "__DATA")203 self.assertEqual(DATA_section.file_addr, DATA_file_addr)204 self.assertEqual(DATA_section.size, DATA_size)205 self.assertEqual(DATA_section.file_offset, DATA_file_addr - TEXT_file_addr)206 self.assertEqual(DATA_section.file_size, DATA_size)207 self.assertEqual(DATA_section.GetSectionType(), lldb.eSectionTypeData)208 data_permissions = DATA_section.GetPermissions()209 self.assertTrue((data_permissions & lldb.ePermissionsReadable) != 0)210 self.assertTrue((data_permissions & lldb.ePermissionsWritable) != 0)211 self.assertFalse((data_permissions & lldb.ePermissionsExecutable) != 0)212 213 foo_symbol = module.FindSymbol("foo")214 self.assertTrue(foo_symbol.IsValid())215 self.assertEqual(foo_symbol.addr.GetFileAddress(), foo_file_addr)216 self.assertEqual(foo_symbol.GetSize(), foo_size)217 218 bar_symbol = module.FindSymbol("bar")219 self.assertTrue(bar_symbol.IsValid())220 self.assertEqual(bar_symbol.addr.GetFileAddress(), bar_file_addr)221 self.assertEqual(bar_symbol.GetSize(), bar_size)222 223 # Verify the user_ids and flags are set correctly since there is no API224 # for this on lldb.SBSection225 self.expect("target modules dump sections c.json",226 substrs = [227 "0x0000000000000100 container [0x0000000000000000-0x0000000100000000) --- 0x00000000 0x00000000 0x00000101 c.json.__PAGEZERO",228 "0x0000000000000200 container [0x0000000100000000-0x0000000100000222) r-x 0x00000000 0x00000222 0x00000202 c.json.__TEXT",229 "0x0000000000000001 code [0x0000000100000000-0x0000000100000020) r-x 0x00000000 0x00000000 0x00000000 c.json.__TEXT.__text",230 "0x0000000000000002 code [0x0000000100000020-0x0000000100000040) --- 0x00000000 0x00000000 0x00000000 c.json.__TEXT.__fake",231 "0x0000000000000003 code [0x0000000100000040-0x0000000100000060) --- 0x00000000 0x00000000 0x00000000 c.json.__TEXT.__encrypted",232 "0x0000000000000004 code [0x0000000100000040-0x0000000100000060) --- 0x00000000 0x00000000 0x00000000 c.json.__TEXT.__tls",233 "0x0000000000000005 data [0x0000000100001000-0x0000000100001333) rw- 0x00001000 0x00000333 0x00000303 c.json.__DATA"234 ])235 236 error = target.SetSectionLoadAddress(TEXT_section, TEXT_file_addr + slide)237 self.assertSuccess(error)238 error = target.SetSectionLoadAddress(DATA_section, DATA_file_addr + slide)239 self.assertSuccess(error)240 self.assertEqual(foo_symbol.addr.GetLoadAddress(target), foo_file_addr + slide)241 self.assertEqual(bar_symbol.addr.GetLoadAddress(target), bar_file_addr + slide)242