[Lldb-commits] [lldb] r274725 - debugserver will now report the minimum version load command

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Wed Jul 6 20:12:02 PDT 2016


Author: jmolenda
Date: Wed Jul  6 22:12:01 2016
New Revision: 274725

URL: http://llvm.org/viewvc/llvm-project?rev=274725&view=rev
Log:
debugserver will now report the minimum version load command
os name and version # from the mach-o binary as it scans the
header/load commands from memory and sends the details back
in the jGetLoadedDynamicLibrariesInfos response.  lldb isn't
using these fields yet but I have a suspicion I'm going to 
need them soon.

<rdar://problem/25251243> 

Modified:
    lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h
    lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm

Modified: lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h?rev=274725&r1=274724&r2=274725&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h (original)
+++ lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.h Wed Jul  6 22:12:01 2016
@@ -69,6 +69,8 @@ public:
         struct mach_header_64 mach_header;
         std::vector<struct mach_o_segment> segments;
         uuid_t uuid;
+        std::string min_version_os_name;
+        std::string min_version_os_version;
     };
 
     struct binary_image_information

Modified: lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm?rev=274725&r1=274724&r2=274725&view=diff
==============================================================================
--- lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm (original)
+++ lldb/trunk/tools/debugserver/source/MacOSX/MachProcess.mm Wed Jul  6 22:12:01 2016
@@ -631,6 +631,44 @@ MachProcess::GetMachOInformationFromMemo
             if (ReadMemory (load_cmds_p, sizeof (struct uuid_command), &uuidcmd) == sizeof (struct uuid_command))
                 uuid_copy (inf.uuid, uuidcmd.uuid);
         }
+        if (lc.cmd == LC_VERSION_MIN_IPHONEOS || lc.cmd == LC_VERSION_MIN_MACOSX 
+            || lc.cmd == LC_VERSION_MIN_WATCHOS || lc.cmd == LC_VERSION_MIN_TVOS)
+        {
+            struct version_min_command vers_cmd;
+            if (ReadMemory (load_cmds_p, sizeof (struct version_min_command), &vers_cmd) != sizeof (struct version_min_command))
+            {
+                return false;
+            }
+            switch (lc.cmd)
+            {
+                case LC_VERSION_MIN_IPHONEOS:
+                    inf.min_version_os_name = "iphoneos";
+                    break;
+                case LC_VERSION_MIN_MACOSX:
+                    inf.min_version_os_name = "macosx";
+                    break;
+                case LC_VERSION_MIN_TVOS:
+                    inf.min_version_os_name = "tvos";
+                    break;
+                case LC_VERSION_MIN_WATCHOS:
+                    inf.min_version_os_name = "watchos";
+                    break;
+                default:
+                    return false;
+            }
+            uint32_t xxxx = vers_cmd.sdk >> 16;
+            uint32_t yy = (vers_cmd.sdk >> 8) & 0xffu;
+            uint32_t zz = vers_cmd.sdk & 0xffu;
+            inf.min_version_os_version = "";
+            inf.min_version_os_version += std::to_string(xxxx);
+            inf.min_version_os_version += ".";
+            inf.min_version_os_version += std::to_string(yy);
+            if (zz != 0)
+            {
+                inf.min_version_os_version += ".";
+                inf.min_version_os_version += std::to_string(zz);
+            }
+        }
         load_cmds_p += lc.cmdsize;
     }
     return true;
@@ -657,6 +695,13 @@ MachProcess::FormatDynamicLibrariesIntoJ
         uuid_unparse_upper (image_infos[i].macho_info.uuid, uuidstr);
         image_info_dict_sp->AddStringItem ("uuid", uuidstr);
 
+        if (image_infos[i].macho_info.min_version_os_name.empty() == false
+            && image_infos[i].macho_info.min_version_os_version.empty() == false)
+        {
+            image_info_dict_sp->AddStringItem ("min_version_os_name", image_infos[i].macho_info.min_version_os_name);
+            image_info_dict_sp->AddStringItem ("min_version_os_sdk", image_infos[i].macho_info.min_version_os_version);
+        }
+
         JSONGenerator::DictionarySP mach_header_dict_sp (new JSONGenerator::Dictionary());
         mach_header_dict_sp->AddIntegerItem ("magic", image_infos[i].macho_info.mach_header.magic);
         mach_header_dict_sp->AddIntegerItem ("cputype", (uint32_t) image_infos[i].macho_info.mach_header.cputype);




More information about the lldb-commits mailing list