|
3 | 3 | """ |
4 | 4 |
|
5 | 5 | import os |
| 6 | +import shutil |
6 | 7 |
|
7 | 8 | import lldb |
8 | 9 | from lldbsuite.test.decorators import * |
@@ -230,3 +231,55 @@ def test_unified_section_list_overwrite_mixed_merge(self): |
230 | 231 |
|
231 | 232 | self.assertTrue(error.Success()) |
232 | 233 | self.assertEqual(comment_content_after_merge, bytes.fromhex("BAADF00DF00DBAAD")) |
| 234 | + |
| 235 | + def test_unified_section_list_overwrite_equal_size(self): |
| 236 | + """ |
| 237 | + Test the merging of an ELF file with an ELF file with sections of the same size with different values |
| 238 | + .text |
| 239 | + """ |
| 240 | + exe = self.getBuildArtifact("a.out") |
| 241 | + self.yaml2obj("main.yaml", exe) |
| 242 | + |
| 243 | + target = self.dbg.CreateTarget(exe) |
| 244 | + self.assertTrue(target, VALID_TARGET) |
| 245 | + main_exe_module = target.GetModuleAtIndex(0) |
| 246 | + |
| 247 | + # First we verify out .text section is the expected BEC0FFEE |
| 248 | + text_before_merge = main_exe_module.FindSection(".text") |
| 249 | + self.assertTrue(text_before_merge.IsValid()) |
| 250 | + error = lldb.SBError() |
| 251 | + section_content = text_before_merge.data.ReadRawData( |
| 252 | + error, 0, text_before_merge.data.size |
| 253 | + ) |
| 254 | + self.assertTrue(error.Success()) |
| 255 | + self.assertEqual(section_content, bytes.fromhex("BEC0FFEE")) |
| 256 | + |
| 257 | + # .comment in main.yaml should be SHT_NOBITS, and size 0 |
| 258 | + comment_before_merge = main_exe_module.FindSection(".comment") |
| 259 | + self.assertTrue(comment_before_merge.IsValid()) |
| 260 | + self.assertEqual(comment_before_merge.data.size, 0) |
| 261 | + |
| 262 | + # yamlize the main with the .text reversed from BEC0FFEE |
| 263 | + # to EEFF0CEB. We should still keep our .text with BEC0FFEE |
| 264 | + debug_info = self.getBuildArtifact("a.out.debug") |
| 265 | + self.yaml2obj("main.reversedtext.yaml", debug_info) |
| 266 | + |
| 267 | + ci = self.dbg.GetCommandInterpreter() |
| 268 | + res = lldb.SBCommandReturnObject() |
| 269 | + ci.HandleCommand(f"target symbols add {debug_info}", res) |
| 270 | + self.assertTrue(res.Succeeded()) |
| 271 | + |
| 272 | + # verify .text did not change |
| 273 | + main_exe_module_after_merge = target.GetModuleAtIndex(0) |
| 274 | + text_after_merge = main_exe_module_after_merge.FindSection(".text") |
| 275 | + self.assertTrue(text_after_merge.IsValid()) |
| 276 | + section_content_after_merge = text_after_merge.data.ReadRawData( |
| 277 | + error, 0, text_after_merge.data.size |
| 278 | + ) |
| 279 | + self.assertTrue(error.Success()) |
| 280 | + self.assertEqual(section_content_after_merge, bytes.fromhex("BEC0FFEE")) |
| 281 | + |
| 282 | + # verify comment did not change |
| 283 | + comment_afer_merge = main_exe_module_after_merge.FindSection(".comment") |
| 284 | + self.assertTrue(comment_afer_merge.IsValid()) |
| 285 | + self.assertEqual(comment_afer_merge.data.size, 0) |
0 commit comments