Files
clang-p2996/lldb/test/API/functionalities/json/object-file/TestObjectFileJSON.py
Greg Clayton 27901cec0e Add subsection and permissions support to ObjectFileJSON. (#129801)
This patch adds the ability to create subsections in a section and
allows permissions to be specified.
2025-03-04 16:19:20 -08:00

179 lines
6.6 KiB
Python

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())
TEXT_file_addr = 0x100000000
DATA_file_addr = 0x100001000
foo_file_addr = TEXT_file_addr + 0x100
bar_file_addr = DATA_file_addr + 0x10
TEXT_size = 0x222
DATA_size = 0x333
foo_size = 0x11
bar_size = 0x22
slide = 0x100000000
data = {
"triple": target.GetTriple(),
"uuid": str(uuid.uuid4()),
"type": "sharedlibrary",
"sections": [
{
"name": "__TEXT",
"type": "container",
"address": TEXT_file_addr,
"size": TEXT_size,
"read": True,
"write": False,
"execute": True,
"subsections": [
{
"name": "__text",
"type": "code",
"address": TEXT_file_addr,
"size": TEXT_size,
"read": True,
"write": False,
"execute": True,
}
],
},
{
"name": "__DATA",
"type": "data",
"address": DATA_file_addr,
"size": DATA_size,
"read": True,
"write": True,
"execute": False,
},
],
"symbols": [
{
"name": "foo",
"type": "code",
"address": foo_file_addr,
"size": foo_size,
},
{
"name": "bar",
"type": "data",
"address": bar_file_addr,
"size": bar_size,
},
],
}
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())
TEXT_section = module.GetSectionAtIndex(0)
self.assertTrue(TEXT_section.IsValid())
self.assertEqual(TEXT_section.GetName(), "__TEXT")
self.assertEqual(TEXT_section.file_addr, TEXT_file_addr)
self.assertEqual(TEXT_section.size, TEXT_size)
self.assertEqual(TEXT_section.GetSectionType(), lldb.eSectionTypeContainer)
self.assertEqual(TEXT_section.GetNumSubSections(), 1)
text_permissions = TEXT_section.GetPermissions()
self.assertTrue((text_permissions & lldb.ePermissionsReadable) != 0)
self.assertFalse((text_permissions & lldb.ePermissionsWritable) != 0)
self.assertTrue((text_permissions & lldb.ePermissionsExecutable) != 0)
text_section = TEXT_section.GetSubSectionAtIndex(0)
self.assertTrue(text_section.IsValid())
self.assertEqual(text_section.GetName(), "__text")
self.assertEqual(text_section.file_addr, TEXT_file_addr)
self.assertEqual(text_section.size, TEXT_size)
self.assertEqual(text_section.GetSectionType(), lldb.eSectionTypeCode)
self.assertEqual(text_section.GetNumSubSections(), 0)
text_permissions = text_section.GetPermissions()
self.assertTrue((text_permissions & lldb.ePermissionsReadable) != 0)
self.assertFalse((text_permissions & lldb.ePermissionsWritable) != 0)
self.assertTrue((text_permissions & lldb.ePermissionsExecutable) != 0)
DATA_section = module.GetSectionAtIndex(1)
self.assertTrue(DATA_section.IsValid())
self.assertEqual(DATA_section.GetName(), "__DATA")
self.assertEqual(DATA_section.file_addr, DATA_file_addr)
self.assertEqual(DATA_section.size, DATA_size)
self.assertEqual(DATA_section.GetSectionType(), lldb.eSectionTypeData)
data_permissions = DATA_section.GetPermissions()
self.assertTrue((data_permissions & lldb.ePermissionsReadable) != 0)
self.assertTrue((data_permissions & lldb.ePermissionsWritable) != 0)
self.assertFalse((data_permissions & lldb.ePermissionsExecutable) != 0)
foo_symbol = module.FindSymbol("foo")
self.assertTrue(foo_symbol.IsValid())
self.assertEqual(foo_symbol.addr.GetFileAddress(), foo_file_addr)
self.assertEqual(foo_symbol.GetSize(), foo_size)
bar_symbol = module.FindSymbol("bar")
self.assertTrue(bar_symbol.IsValid())
self.assertEqual(bar_symbol.addr.GetFileAddress(), bar_file_addr)
self.assertEqual(bar_symbol.GetSize(), bar_size)
error = target.SetSectionLoadAddress(TEXT_section, TEXT_file_addr + slide)
self.assertSuccess(error)
error = target.SetSectionLoadAddress(DATA_section, DATA_file_addr + slide)
self.assertSuccess(error)
self.assertEqual(foo_symbol.addr.GetLoadAddress(target), foo_file_addr + slide)
self.assertEqual(bar_symbol.addr.GetLoadAddress(target), bar_file_addr + slide)