Author: jmolenda
Date: Wed May 25 23:22:47 2016
New Revision: 270818

URL: http://llvm.org/viewvc/llvm-project?rev=270818&view=rev
Log:
Small further refinement to the check in ObjectFileMachO::ParseSymtab
which looks for binaries missing an LC_FUNCTION_STARTS section because
it was stripped/not emitted.  If we see a normal user process binary
(executable, dylib, framework, bundle) without LC_FUNCTION_STARTS, that
is unusual and we should disallow instruction emulation because that
binary has likely been stripped a lot.

If this is a non-user process binary -- a kernel, a standalone bare-board
binary, a kernel extension (kext) -- and there is no LC_FUNCTION_STARTS,
we should not assume anything about the binary and allow instruction
emulation as we would normally do.

<rdar://problem/26453952> 

Modified:
    lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp

Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=270818&r1=270817&r2=270818&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Wed May 25 
23:22:47 2016
@@ -2607,14 +2607,16 @@ ObjectFileMachO::ParseSymtab ()
 
         const size_t function_starts_count = function_starts.GetSize();
 
-        // kext bundles don't have LC_FUNCTION_STARTS / eh_frame sections, but 
we can assume that we have
-        // accurate symbol boundaries for them, they're a special case.
-
-        if (function_starts_count == 0 && m_header.filetype != 
llvm::MachO::MH_KEXT_BUNDLE)
+        // For user process binaries (executables, dylibs, frameworks, 
bundles), if we don't have
+        // LC_FUNCTION_STARTS/eh_frame section in this binary, we're going to 
assume the binary
+        // has been stripped.  Don't allow assembly language instruction 
emulation because we don't
+        // know proper function start boundaries.
+        //
+        // For all other types of binaries (kernels, stand-alone bare board 
binaries, kexts), they
+        // may not have LC_FUNCTION_STARTS / eh_frame sections - we should not 
make any assumptions
+        // about them based on that.
+        if (function_starts_count == 0 && CalculateStrata() == eStrataUser)
         {
-            // No LC_FUNCTION_STARTS/eh_frame section in this binary, we're 
going to assume the binary 
-            // has been stripped.  Don't allow assembly language instruction 
emulation because we don't
-            // know proper function start boundaries.
             m_allow_assembly_emulation_unwind_plans = false;
             Log *unwind_or_symbol_log (lldb_private::GetLogIfAnyCategoriesSet 
(LIBLLDB_LOG_SYMBOLS | LIBLLDB_LOG_UNWIND));
 


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to