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;
}
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);
{
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;
}
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;
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;
}
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("]");
}
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))
{
#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