Supported Tizen version parsing and verification 47/223247/2 accepted/tizen/base/20200302.014322 submit/tizen_base/20200227.082839
authorAndrey Kazmin <a.kazmin@partner.samsung.com>
Thu, 23 Jan 2020 15:54:15 +0000 (18:54 +0300)
committerDongkyun Son <dongkyun.s@samsung.com>
Thu, 27 Feb 2020 08:09:28 +0000 (08:09 +0000)
Change-Id: I9fefe81e0ffbf16eed3c806a18df03e67ff668c8
Signed-off-by: Andrey Kazmin <a.kazmin@partner.samsung.com>
bfd/elf-properties.c
binutils/readelf.c
include/elf/common.h

index b510b21..e3951f9 100644 (file)
@@ -219,10 +219,10 @@ inline static bfd_boolean
 elf_gnu_property_validate_flag (bfd_vma anum,
                                bfd_vma bnum,
                                bfd_vma validation_bit_flag,
-                               bfd_vma validation_bit)
+                               bfd_vma validation_bit_mask)
 {
   if ((anum & validation_bit_flag) && (bnum & validation_bit_flag)
-      && ((anum & validation_bit) != (bnum & validation_bit)))
+      && ((anum & validation_bit_mask) != (bnum & validation_bit_mask)))
     {
       return FALSE;
     }
@@ -234,6 +234,8 @@ elf_validate_compiler_flags_properties (elf_property *aprop,
                                        elf_property *bprop)
 {
   bfd_boolean is_flag_set;
+  unsigned int tizen_version_a;
+  unsigned int tizen_version_b;
 
   /* Sanity check to verify correct usage.  */
   BFD_ASSERT(aprop);
@@ -268,12 +270,25 @@ elf_validate_compiler_flags_properties (elf_property *aprop,
     {
       is_flag_set = bprop->u.number & GNU_PROPERTY_USECXX11_ABI;
       _bfd_error_handler
-       (_("ERROR: Validation failed, linking %s ABI object with %s ABI"),
+       (_("%s: ERROR: Validation failed, linking %s ABI object with %s ABI"),
         bprop->filename, is_flag_set ? "pre-cxx11" : "cxx11",
         !is_flag_set ? "pre-cxx11" : "cxx11");
       return FALSE;
     }
 
+  if (!elf_gnu_property_validate_flag(aprop->u.number,
+                                     bprop->u.number,
+                                     GNU_PROPERTY_TIZEN_VALIDATION,
+                                     GNU_PROPERTY_TIZEN_FLAGS_MASK))
+    {
+      tizen_version_a = (aprop->u.number >> GNU_PROPERTY_TIZEN_VERSION_OFFSET) & GNU_PROPERTY_TIZEN_VERSION_MASK;
+      tizen_version_b = (bprop->u.number >> GNU_PROPERTY_TIZEN_VERSION_OFFSET) & GNU_PROPERTY_TIZEN_VERSION_MASK;
+      _bfd_error_handler
+       (_("%s: ERROR: Validation failed, linking tizen version: %x object with tizen version: %x"),
+        bprop->filename, tizen_version_b, tizen_version_a);
+      return FALSE;
+    }
+
   return TRUE;
 }
 
@@ -285,6 +300,9 @@ elf_merge_gnu_properties_compiler_flags (elf_property *aprop,
                                         elf_property *bprop)
 {
   bfd_boolean is_updated = FALSE;
+  unsigned int flags_tizen_version_a;
+  unsigned int flags_tizen_version_b;
+
   /* Likely that objects have the same properties.  */
   if (aprop->u.number == bprop->u.number) {
     return FALSE;
@@ -315,6 +333,20 @@ elf_merge_gnu_properties_compiler_flags (elf_property *aprop,
       is_updated = TRUE;
     }
 
+  if ((aprop->u.number ^ bprop->u.number) & GNU_PROPERTY_TIZEN_VALIDATION)
+    {
+      aprop->u.number |= GNU_PROPERTY_TIZEN_VALIDATION;
+      is_updated = TRUE;
+    }
+
+  flags_tizen_version_a = aprop->u.number & GNU_PROPERTY_TIZEN_FLAGS_MASK;
+  flags_tizen_version_b = bprop->u.number & GNU_PROPERTY_TIZEN_FLAGS_MASK;
+  if (flags_tizen_version_a < flags_tizen_version_b)
+    {
+      aprop->u.number = flags_tizen_version_b | (aprop->u.number & ~GNU_PROPERTY_TIZEN_FLAGS_MASK);
+      is_updated = TRUE;
+    }
+
   return is_updated;
 }
 
index 7f22c58..3dfcb55 100644 (file)
@@ -17757,9 +17757,12 @@ decode_compiler_flags_notes (unsigned long bitmask)
   printf("%c%ccxx11, ", bitmask & GNU_PROPERTY_USECXX_VALIDATION ? '=' : '~',
         bitmask & GNU_PROPERTY_USECXX11_ABI ? '+' : '!');
 
-  printf("%c%casan", bitmask & GNU_PROPERTY_SANITIZE_VALIDATION ? '=' : '~',
+  printf("%c%casan", bitmask & GNU_PROPERTY_SANITIZE_VALIDATION ? '=' : '~',
         bitmask & GNU_PROPERTY_SANITIZE_ADDRESS ? '+' : '!');
 
+  printf("%ctizen-version:%x", bitmask & GNU_PROPERTY_TIZEN_VALIDATION ? '=' : '~',
+        (bitmask >> GNU_PROPERTY_TIZEN_VERSION_OFFSET) & GNU_PROPERTY_TIZEN_VERSION_MASK);
+
   printf("]");
 }
 
@@ -18948,6 +18951,16 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
       expected_types = bool_expected;
       ++ name;
       break;
+    case GNU_BUILD_ATTRIBUTE_NO_SANITIZE:
+      text = _("<no sanitize>");
+      expected_types = bool_expected;
+      ++ name;
+      break;
+    case GNU_BUILD_ATTRIBUTE_TIZEN:
+      text = _("<tizen version>");
+      expected_types = number_expected;
+      ++ name;
+      break;
     default:
       if (ISPRINT (* name))
        {
index 182818e..55b0ec2 100644 (file)
 #define GNU_BUILD_ATTRIBUTE_ABI                6
 #define GNU_BUILD_ATTRIBUTE_PIC                7
 #define GNU_BUILD_ATTRIBUTE_SHORT_ENUM 8
+#define GNU_BUILD_ATTRIBUTE_NO_SANITIZE        9
+#define GNU_BUILD_ATTRIBUTE_TIZEN      10
 
 #define NOTE_GNU_PROPERTY_SECTION_NAME ".note.gnu.property"
 #define GNU_BUILD_ATTRS_SECTION_NAME   ".gnu.build.attributes"
 #define GNU_PROPERTY_STACK_SIZE                        1
 #define GNU_PROPERTY_NO_COPY_ON_PROTECTED      2
 #define GNU_PROPERTY_COMPILER_FLAGS            32
-
 /* Bit masks for compiler flags:  */
 /* Pre/post cxx11 ABI.  */
 #define GNU_PROPERTY_USECXX_VALIDATION         (1U << 0)
 #define GNU_PROPERTY_SANITIZE_ADDRESS          (1U << 3)
 #define GNU_PROPERTY_SANITIZE_UNDEFINED                (1U << 4)
 #define GNU_PROPERTY_SANITIZE_THREAD           (1U << 5)
+/* Reserved flag */
+#define GNU_PROPERTY_RESERVED_FIELD            (1U << 6)
+/* Tizen version flag */
+#define GNU_PROPERTY_TIZEN_VALIDATION          (1U << 7)
+/* Tizen version offset and mask */
+#define GNU_PROPERTY_TIZEN_VERSION_OFFSET      (8)
+#define GNU_PROPERTY_TIZEN_VERSION_MASK                (0xfff)
+#define GNU_PROPERTY_TIZEN_FLAGS_MASK          (GNU_PROPERTY_TIZEN_VERSION_MASK << GNU_PROPERTY_TIZEN_VERSION_OFFSET)
 
 /* Processor-specific semantics, lo */
 #define GNU_PROPERTY_LOPROC  0xc0000000