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)