[Lldb-commits] [lldb] r276406 - Fixing layout of elf-core file related structures

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Fri Jul 22 05:18:47 PDT 2016


Author: labath
Date: Fri Jul 22 07:18:45 2016
New Revision: 276406

URL: http://llvm.org/viewvc/llvm-project?rev=276406&view=rev
Log:
Fixing layout of elf-core file related structures

Summary:
The binary layout of prstatus and prpsinfo was wrong.
Some of the member variables where not aligned properly
and others where with a wrong type (e.g. the time related
stuff in prstatus).

I used the structs defined in bfd in binutils to see what the layout
of the elf-core format in these section is.
(https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=bfd/hosts/x86-64linux.h;h=4e420a1f2081dd3b51f5d6b7a8e4093580f5cdb5;hb=master)
Note: those structures are only for x86 64 bit elf-core files

This shouldn't have any impact on the functionality, because
lldb actually uses only a few of the member variables of those structs
and they are with a correct type and alignment.

I found this while trying to add/fix the support for
i386 core files (https://llvm.org/bugs/show_bug.cgi?id=26947)

Reviewers: labath

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D22628
Author: Dimitar Vlahovski <dvlahovski at google.com>

Modified:
    lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp
    lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h

Modified: lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp?rev=276406&r1=276405&r2=276406&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp Fri Jul 22 07:18:45 2016
@@ -228,8 +228,8 @@ ELFLinuxPrStatus::Parse(DataExtractor &d
     {
         case ArchSpec::eCore_s390x_generic:
         case ArchSpec::eCore_x86_64_x86_64:
-            len = data.ExtractBytes(0, ELFLINUXPRSTATUS64_SIZE, byteorder, this);
-            return len == ELFLINUXPRSTATUS64_SIZE;
+            len = data.ExtractBytes(0, sizeof(ELFLinuxPrStatus), byteorder, this);
+            return len == sizeof(ELFLinuxPrStatus);
         default:
             return false;
     }
@@ -252,8 +252,8 @@ ELFLinuxPrPsInfo::Parse(DataExtractor &d
     {
         case ArchSpec::eCore_s390x_generic:
         case ArchSpec::eCore_x86_64_x86_64:
-            len = data.ExtractBytes(0, ELFLINUXPRPSINFO64_SIZE, byteorder, this);
-            return len == ELFLINUXPRPSINFO64_SIZE;
+            len = data.ExtractBytes(0, sizeof(ELFLinuxPrPsInfo), byteorder, this);
+            return len == sizeof(ELFLinuxPrPsInfo);
         default:
             return false;
     }

Modified: lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h?rev=276406&r1=276405&r2=276406&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.h Fri Jul 22 07:18:45 2016
@@ -21,17 +21,13 @@
 
 struct compat_timeval
 {
-    int64_t tv_sec;
-    int32_t tv_usec;
+    alignas(8) uint64_t tv_sec;
+    alignas(8) uint64_t tv_usec;
 };
 
 // PRSTATUS structure's size differs based on architecture.
 // Currently parsing done only for x86-64 architecture by
 // simply reading data from the buffer.
-// The following macros are used to specify the size.
-// Calculating size using sizeof() wont work because of padding.
-#define ELFLINUXPRSTATUS64_SIZE (112)
-#define ELFLINUXPRPSINFO64_SIZE (132)
 
 #undef si_signo
 #undef si_code
@@ -39,24 +35,24 @@ struct compat_timeval
 
 struct ELFLinuxPrStatus
 {
-    int32_t         si_signo;
-    int32_t         si_code;
-    int32_t         si_errno;
-
-    int16_t         pr_cursig;
-
-    uint64_t        pr_sigpend;
-    uint64_t        pr_sighold;
-
-    uint32_t        pr_pid;
-    uint32_t        pr_ppid;
-    uint32_t        pr_pgrp;
-    uint32_t        pr_sid;
-
-    compat_timeval  pr_utime;
-    compat_timeval  pr_stime;
-    compat_timeval  pr_cutime;
-    compat_timeval  pr_cstime;
+    int32_t si_signo;
+    int32_t si_code;
+    int32_t si_errno;
+
+    int16_t pr_cursig;
+
+    alignas(8) uint64_t pr_sigpend;
+    alignas(8) uint64_t pr_sighold;
+
+    uint32_t pr_pid;
+    uint32_t pr_ppid;
+    uint32_t pr_pgrp;
+    uint32_t pr_sid;
+
+    compat_timeval pr_utime;
+    compat_timeval pr_stime;
+    compat_timeval pr_cutime;
+    compat_timeval pr_cstime;
 
     ELFLinuxPrStatus();
 
@@ -70,28 +66,30 @@ struct ELFLinuxPrStatus
         {
             case lldb_private::ArchSpec::eCore_s390x_generic:
             case lldb_private::ArchSpec::eCore_x86_64_x86_64:
-                return ELFLINUXPRSTATUS64_SIZE;
+                return sizeof(ELFLinuxPrStatus);
             default:
                 return 0;
         }
     }
 };
 
+static_assert(sizeof(ELFLinuxPrStatus) == 112, "sizeof ELFLinuxPrStatus is not correct!");
+
 struct ELFLinuxPrPsInfo
 {
-    char        pr_state;
-    char        pr_sname;
-    char        pr_zomb;
-    char        pr_nice;
-    uint64_t    pr_flag;
-    uint32_t    pr_uid;
-    uint32_t    pr_gid;
-    int32_t     pr_pid;
-    int32_t     pr_ppid;
-    int32_t     pr_pgrp;
-    int32_t     pr_sid;
-    char        pr_fname[16];
-    char        pr_psargs[80];
+    char pr_state;
+    char pr_sname;
+    char pr_zomb;
+    char pr_nice;
+    alignas(8) uint64_t pr_flag;
+    uint32_t pr_uid;
+    uint32_t pr_gid;
+    int32_t pr_pid;
+    int32_t pr_ppid;
+    int32_t pr_pgrp;
+    int32_t pr_sid;
+    char pr_fname[16];
+    char pr_psargs[80];
 
     ELFLinuxPrPsInfo();
 
@@ -105,13 +103,15 @@ struct ELFLinuxPrPsInfo
         {
             case lldb_private::ArchSpec::eCore_s390x_generic:
             case lldb_private::ArchSpec::eCore_x86_64_x86_64:
-                return ELFLINUXPRPSINFO64_SIZE;
+                return sizeof(ELFLinuxPrPsInfo);
             default:
                 return 0;
         }
     }
 };
 
+static_assert(sizeof(ELFLinuxPrPsInfo) == 136, "sizeof ELFLinuxPrPsInfo is not correct!");
+
 struct ThreadData
 {
     lldb_private::DataExtractor gpregset;




More information about the lldb-commits mailing list