[Lldb-commits] [lldb] r331173 - ObjectFileELF: Add support for arbitrarily named code sections

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Mon Apr 30 06:23:48 PDT 2018


Author: labath
Date: Mon Apr 30 06:23:47 2018
New Revision: 331173

URL: http://llvm.org/viewvc/llvm-project?rev=331173&view=rev
Log:
ObjectFileELF: Add support for arbitrarily named code sections

ObjectFileELF assumes that code section has ".text" name. There is an
exception for kalimba toolchain that can use arbitrary names, but other
toolchains also could use arbitrary names for code sections. For
example, corert uses separate section for compiled managed code. As lldb
doesn't recognize such section it leads to problem with breakpoints on
arm, because debugger cannot determine instruction set (arm/thumb) and
uses incorrect breakpoint opcode that breaks program execution.

This change allows debugger to correctly handle such code sections. We
assume that section is a code section if it has SHF_EXECINSTR flag set
and has SHT_PROGBITS type.

Patch by Konstantin Baladurin <k.baladurin at partner.samsung.com>.
Differential Revision: https://reviews.llvm.org/D44998

Added:
    lldb/trunk/lit/Modules/elf-section-types.yaml
      - copied, changed from r331172, lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml
    lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/
    lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile
    lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py
    lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c
Removed:
    lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml
Modified:
    lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp

Removed: lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml?rev=331172&view=auto
==============================================================================
--- lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml (original)
+++ lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml (removed)
@@ -1,25 +0,0 @@
-# RUN: yaml2obj %s > %t
-# RUN: lldb-test module-sections %t | FileCheck %s
-
-# CHECK: Name: .gnu_debugaltlink
-# CHECK-NEXT: Type: dwarf-gnu-debugaltlink
-# CHECK-NEXT: VM size: 0
-# CHECK-NEXT: File size: 8
-
---- !ELF
-FileHeader:      
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_DYN
-  Machine:         EM_X86_64
-  Entry:           0x00000000000007A0
-Sections:        
-  - Name:            .debug_info
-    Type:            SHT_PROGBITS
-    AddressAlign:    0x0000000000000001
-    Content:         DEADBEEFBAADF00D
-  - Name:            .gnu_debugaltlink
-    Type:            SHT_PROGBITS
-    AddressAlign:    0x0000000000000001
-    Content:         DEADBEEFBAADF00D
-...

Copied: lldb/trunk/lit/Modules/elf-section-types.yaml (from r331172, lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml)
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Modules/elf-section-types.yaml?p2=lldb/trunk/lit/Modules/elf-section-types.yaml&p1=lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml&r1=331172&r2=331173&rev=331173&view=diff
==============================================================================
--- lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml (original)
+++ lldb/trunk/lit/Modules/elf-section-types.yaml Mon Apr 30 06:23:47 2018
@@ -1,11 +1,17 @@
 # RUN: yaml2obj %s > %t
 # RUN: lldb-test module-sections %t | FileCheck %s
 
+# CHECK: Name: .text
+# CHECK-NEXT: Type: code
+
 # CHECK: Name: .gnu_debugaltlink
 # CHECK-NEXT: Type: dwarf-gnu-debugaltlink
 # CHECK-NEXT: VM size: 0
 # CHECK-NEXT: File size: 8
 
+# CHECK: Name: __codesection
+# CHECK-NEXT: Type: code
+
 --- !ELF
 FileHeader:      
   Class:           ELFCLASS64
@@ -14,6 +20,10 @@ FileHeader:
   Machine:         EM_X86_64
   Entry:           0x00000000000007A0
 Sections:        
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Content:         DEADBEEFBAADF00D
   - Name:            .debug_info
     Type:            SHT_PROGBITS
     AddressAlign:    0x0000000000000001
@@ -22,4 +32,8 @@ Sections:
     Type:            SHT_PROGBITS
     AddressAlign:    0x0000000000000001
     Content:         DEADBEEFBAADF00D
+  - Name:            __codesection
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Content:         DEADBEEFBAADF00D
 ...

Added: lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile?rev=331173&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile Mon Apr 30 06:23:47 2018
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS = -mthumb
+
+include $(LEVEL)/Makefile.rules
\ No newline at end of file

Added: lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py?rev=331173&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py Mon Apr 30 06:23:47 2018
@@ -0,0 +1,35 @@
+"""
+Test that breakpoints correctly work in an thumb function in an arbitrary
+named codesection.
+"""
+from __future__ import print_function
+
+
+import lldb
+import os
+import time
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestBreakpointThumbCodesection(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @skipIf(archs=no_match(["arm"]))
+    def test_breakpoint(self):
+        self.build()
+        exe = self.getBuildArtifact("a.out")
+        line = line_number('main.c', '// Set break point at this line.')
+
+        self.runCmd("target create %s" % exe)
+        bpid = lldbutil.run_break_set_by_file_and_line(self, "main.c", line)
+
+        self.runCmd("run")
+
+        self.assertIsNotNone(lldbutil.get_one_thread_stopped_at_breakpoint_id(
+            self.process(), bpid), "Process is not stopped at breakpoint")
+
+        self.process().Continue()
+        self.assertEqual(self.process().GetState(), lldb.eStateExited, PROCESS_EXITED)

Added: lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c?rev=331173&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c Mon Apr 30 06:23:47 2018
@@ -0,0 +1,8 @@
+__attribute__((section("__codesection")))
+int f(int a) {
+  return a + 1; // Set break point at this line.
+}
+
+int main() {
+  return f(10);
+}

Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=331173&r1=331172&r2=331173&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Mon Apr 30 06:23:47 2018
@@ -1950,6 +1950,16 @@ void ObjectFileELF::CreateSections(Secti
         sect_type = kalimbaSectionType(m_header, header);
       }
 
+      // In common case ELF code section can have arbitrary name (for example,
+      // we can specify it using section attribute for particular function) so
+      // assume that section is a code section if it has SHF_EXECINSTR flag set
+      // and has SHT_PROGBITS type.
+      if (eSectionTypeOther == sect_type &&
+          llvm::ELF::SHT_PROGBITS == header.sh_type &&
+          (header.sh_flags & SHF_EXECINSTR)) {
+        sect_type = eSectionTypeCode;
+      }
+
       const uint32_t target_bytes_size =
           (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type)
               ? m_arch_spec.GetDataByteSize()




More information about the lldb-commits mailing list