| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| import json |
| import uuid |
| import os |
| import shutil |
| import time |
| |
| |
| class TestObjectFileJSON(TestBase): |
| TRIPLE = "arm64-apple-macosx13.0.0" |
| |
| def setUp(self): |
| TestBase.setUp(self) |
| self.source = "main.c" |
| |
| def emitJSON(self, data, path): |
| json_object = json.dumps(data, indent=4) |
| with open(path, "w") as outfile: |
| outfile.write(json_object) |
| |
| def toModuleSpec(self, path): |
| module_spec = lldb.SBModuleSpec() |
| module_spec.SetFileSpec(lldb.SBFileSpec(path)) |
| return module_spec |
| |
| @no_debug_info_test |
| def test_target(self): |
| triple = "arm64-apple-macosx13.0.0" |
| data = { |
| "triple": triple, |
| "uuid": str(uuid.uuid4()), |
| "type": "executable", |
| } |
| |
| json_object_file = self.getBuildArtifact("a.json") |
| self.emitJSON(data, json_object_file) |
| |
| target = self.dbg.CreateTarget(json_object_file) |
| self.assertTrue(target.IsValid()) |
| self.assertEqual(target.GetTriple(), triple) |
| |
| @no_debug_info_test |
| def test_module(self): |
| self.build() |
| exe = self.getBuildArtifact("a.out") |
| target = self.dbg.CreateTarget(exe) |
| |
| data = { |
| "triple": target.GetTriple(), |
| "uuid": str(uuid.uuid4()), |
| } |
| |
| json_object_file_b = self.getBuildArtifact("b.json") |
| self.emitJSON(data, json_object_file_b) |
| |
| module = target.AddModule(self.toModuleSpec(json_object_file_b)) |
| self.assertFalse(module.IsValid()) |
| |
| data = { |
| "triple": target.GetTriple(), |
| "uuid": str(uuid.uuid4()), |
| "type": "sharedlibrary", |
| "sections": [ |
| { |
| "name": "__TEXT", |
| "type": "code", |
| "address": 0, |
| "size": 0x222, |
| } |
| ], |
| "symbols": [ |
| { |
| "name": "foo", |
| "address": 0x100, |
| "size": 0x11, |
| } |
| ], |
| } |
| |
| json_object_file_c = self.getBuildArtifact("c.json") |
| self.emitJSON(data, json_object_file_c) |
| |
| module = target.AddModule(self.toModuleSpec(json_object_file_c)) |
| self.assertTrue(module.IsValid()) |
| |
| section = module.GetSectionAtIndex(0) |
| self.assertTrue(section.IsValid()) |
| self.assertEqual(section.GetName(), "__TEXT") |
| self.assertEqual(section.file_addr, 0x0) |
| self.assertEqual(section.size, 0x222) |
| |
| symbol = module.FindSymbol("foo") |
| self.assertTrue(symbol.IsValid()) |
| self.assertEqual(symbol.addr.GetFileAddress(), 0x100) |
| self.assertEqual(symbol.GetSize(), 0x11) |
| |
| error = target.SetSectionLoadAddress(section, 0x1000) |
| self.assertSuccess(error) |
| self.assertEqual(symbol.addr.GetLoadAddress(target), 0x1100) |