brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.2 KiB · 5145a6c Raw
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