Add annobin cxx11 ABI verification exception list 08/226908/3 accepted/tizen/base/tool/20200809.005349 submit/tizen_base/20200722.120650 submit/tizen_base/20200728.025124
authorAndrey Kazmin <a.kazmin@partner.samsung.com>
Wed, 4 Mar 2020 11:41:56 +0000 (14:41 +0300)
committerDongkyun Son <dongkyun.s@samsung.com>
Wed, 22 Jul 2020 11:54:50 +0000 (11:54 +0000)
It could be configured via --with-annobin-cxx11-abi-exceptions option.
Also add dual C++ ABI stuff to the exception list.

Change-Id: I6b4482661c2704a6081242fc1c0a8c4932eba527
Signed-off-by: Andrey Kazmin <a.kazmin@partner.samsung.com>
bfd/config.in
bfd/configure
bfd/configure.ac
bfd/elf-properties.c
packaging/binutils-aarch64.spec
packaging/binutils-armv7hl.spec
packaging/binutils-armv7l.spec
packaging/binutils.spec

index 01c38b7..e2450b2 100644 (file)
@@ -20,6 +20,9 @@
 /* Define to enable annobin runtime strict checks (error mode) */
 #undef ENABLE_ANNOBIN_VERIFICATION_STRICT
 
+/* Define libraries which always pass cxx11 ABI linker verification */
+#undef ANNOBIN_CXX_ABI_EXCEPTION_LIST
+
 /* Define to 1 if translation of program messages to the user's native
    language is requested. */
 #undef ENABLE_NLS
index 50e4bd3..d694b6e 100755 (executable)
@@ -833,6 +833,7 @@ enable_secureplt
 enable_separate_code
 enable_leading_mingw64_underscores
 enable_annobin_verification
+with_annobin_cxx11_abi_exceptions
 with_separate_debug_dir
 with_pkgversion
 with_bugurl
@@ -1509,6 +1510,9 @@ Optional Packages:
                           both]
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-mmap             try using mmap for BFD input files if available
+  --with-annobin-cxx11-abi-exceptions=lib1,lib2[,...]
+                          Libraries which always pass annobin cxx11 ABI linker
+                          verification
   --with-separate-debug-dir=DIR
                           Look for global separate debug info in DIR
                           [[default=LIBDIR/debug]]
@@ -12536,6 +12540,22 @@ $as_echo "#define ENABLE_ANNOBIN_VERIFICATION_STRICT 1" >>confdefs.h
    fi
 fi
 
+
+# Check whether --with-annobin_cxx11_abi_exceptions was given.
+if test "${with_annobin_cxx11_abi_exceptions+set}" = set; then :
+  withval=$with_annobin_cxx11_abi_exceptions; annobin_cxx11_abi_exceptions="${withval}"
+else
+  annobin_cxx11_abi_exceptions=unspecified
+fi
+
+if test "$annobin_cxx11_abi_exceptions" != "unspecified"; then
+
+cat >>confdefs.h <<_ACEOF
+#define ANNOBIN_CXX_ABI_EXCEPTION_LIST `echo "${annobin_cxx11_abi_exceptions}" | sed -e 's/,/\",\"/g' -e 's/^/"/g' -e 's/$/"/g'`
+_ACEOF
+
+fi
+
 DEBUGDIR=${libdir}/debug
 
 # Check whether --with-separate-debug-dir was given.
index a492b26..900ea8c 100644 (file)
@@ -147,6 +147,17 @@ if test "$annobin_verification" = "yes" ||
    fi
 fi
 
+AC_ARG_WITH(annobin_cxx11_abi_exceptions,
+  [AS_HELP_STRING([--with-annobin-cxx11-abi-exceptions=lib1[,lib2[,...]]],
+                  [Libraries which always pass annobin cxx11 ABI linker verification])],
+  [annobin_cxx11_abi_exceptions="${withval}"],
+  [annobin_cxx11_abi_exceptions=unspecified])
+if test "$annobin_cxx11_abi_exceptions" != "unspecified"; then
+AC_DEFINE_UNQUOTED([ANNOBIN_CXX_ABI_EXCEPTION_LIST],
+                   [`echo "${annobin_cxx11_abi_exceptions}" | sed -e 's/,/\",\"/g' -e 's/^/"/g' -e 's/$/"/g'`],
+                   [Define libraries which always pass cxx11 ABI linker verification])
+fi
+
 DEBUGDIR=${libdir}/debug
 AC_ARG_WITH(separate-debug-dir,
   AS_HELP_STRING([--with-separate-debug-dir=DIR],
index e3951f9..d942012 100644 (file)
 #include "libbfd.h"
 #include "elf-bfd.h"
 
+#ifdef ANNOBIN_CXX_ABI_EXCEPTION_LIST
+#define MAX_CXX_EXCEPTIONS 64
+static const char* cxx11_abi_exc[MAX_CXX_EXCEPTIONS] =
+  { ANNOBIN_CXX_ABI_EXCEPTION_LIST };
+
+static int
+check_cxx11_abi_exception(bfd *bbfd)
+{
+  int i;
+  int ni;
+  const char *bfn;
+  if (bbfd->my_archive != NULL)
+    bfn = bbfd->my_archive->filename;
+  else
+    bfn = bbfd->filename;
+
+  for (ni = strlen(bfn) - 1; ni >= 0; ni--)
+    if (bfn[ni] == '/')
+      break;
+  ni = ni < 0 ? 0 : ni + 1;
+
+  for (i = 0; i < MAX_CXX_EXCEPTIONS && cxx11_abi_exc[i] != NULL; i++) {
+    if (!strcmp(&bfn[ni], cxx11_abi_exc[i]))
+      return 1;
+  }
+  return 0;
+}
+#endif
+
 /* Get a property, allocate a new one if needed.  */
 
 elf_property *
@@ -183,7 +212,7 @@ bad_size:
              if (!((datasz == 4) || (datasz == 8)))
                {
                  _bfd_error_handler
-                   (_("warning: %B: corrupt compiler flags: 0x%x\n"),
+                   (_("warning: %pB: corrupt compiler flags: 0x%x\n"),
                     abfd, datasz);
                  /* Clear all properties.  */
                  elf_properties (abfd) = NULL;
@@ -230,7 +259,9 @@ elf_gnu_property_validate_flag (bfd_vma anum,
 }
 
 static bfd_boolean
-elf_validate_compiler_flags_properties (elf_property *aprop,
+elf_validate_compiler_flags_properties (bfd *abfd,
+                                       bfd *bbfd,
+                                       elf_property *aprop,
                                        elf_property *bprop)
 {
   bfd_boolean is_flag_set;
@@ -268,13 +299,19 @@ elf_validate_compiler_flags_properties (elf_property *aprop,
                                      GNU_PROPERTY_USECXX_VALIDATION,
                                      GNU_PROPERTY_USECXX11_ABI))
     {
-      is_flag_set = bprop->u.number & GNU_PROPERTY_USECXX11_ABI;
-      _bfd_error_handler
-       (_("%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;
-    }
+#ifdef ANNOBIN_CXX_ABI_EXCEPTION_LIST
+      if (!check_cxx11_abi_exception(bbfd))
+#endif
+       {
+         is_flag_set = bprop->u.number & GNU_PROPERTY_USECXX11_ABI;
+         _bfd_error_handler
+           (_("%s: ERROR: Validation failed, linking %s ABI object with %s ABI: %s"),
+            bbfd->my_archive ? bbfd->my_archive->filename : bbfd->filename,
+            is_flag_set ? "cxx11" : "pre-cxx11",
+            !is_flag_set ? "cxx11" : "pre-cxx11", abfd->filename);
+         return FALSE;
+       }
+  }
 
   if (!elf_gnu_property_validate_flag(aprop->u.number,
                                      bprop->u.number,
@@ -392,7 +429,7 @@ elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, bfd *bbfd,
        if (aprop != NULL && bprop != NULL)
          {
 #ifdef ENABLE_ANNOBIN_VERIFICATION
-           if (!elf_validate_compiler_flags_properties (aprop, bprop))
+           if (!elf_validate_compiler_flags_properties (abfd, bbfd, aprop, bprop))
              {
                _bfd_error_handler(_("ERROR: Linking failed due to incompatible "
                                     "compilation flags used to generate objects\n"));
@@ -797,7 +834,7 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
       BFD_ASSERT (sec != NULL);
 
       if (!sec)
-       return;
+       return NULL;
 
       /* Update stack size in .note.gnu.property with -z stack-size=N
         if N > 0.  */
index cd05bcc..3ae4645 100644 (file)
@@ -154,6 +154,9 @@ cd build-dir
        --host=%{host_arch} \
        %{?annobin_verification: --enable-annobin-verification=warn } \
        %{?annobin_verification_strict: --enable-annobin-verification=strict } \
+%if 0%{?annobin_verification:1}%{?annobin_verification_strict:1} != 0
+        --with-annobin-cxx11-abi-exceptions=libstdc++.a,libstdc++.so,libstdc++.so.6,libstdc++fs.a,compatibility.o,compatibility-c++0x.o,libc++98convenience.a,libc++11convenience.a,libc++17convenience.a,libc++20convenience.a \
+%endif
 %{?cross: \
        --enable-targets=%{target_arch} \
        --enable-64-bit-bfd \
index c452272..ca13fb2 100644 (file)
@@ -154,6 +154,9 @@ cd build-dir
        --host=%{host_arch} \
        %{?annobin_verification: --enable-annobin-verification=warn } \
        %{?annobin_verification_strict: --enable-annobin-verification=strict } \
+%if 0%{?annobin_verification:1}%{?annobin_verification_strict:1} != 0
+        --with-annobin-cxx11-abi-exceptions=libstdc++.a,libstdc++.so,libstdc++.so.6,libstdc++fs.a,compatibility.o,compatibility-c++0x.o,libc++98convenience.a,libc++11convenience.a,libc++17convenience.a,libc++20convenience.a \
+%endif
 %{?cross: \
        --enable-targets=%{target_arch} \
        --enable-64-bit-bfd \
index 225f7a3..2346a63 100644 (file)
@@ -154,6 +154,9 @@ cd build-dir
        --host=%{host_arch} \
        %{?annobin_verification: --enable-annobin-verification=warn } \
        %{?annobin_verification_strict: --enable-annobin-verification=strict } \
+%if 0%{?annobin_verification:1}%{?annobin_verification_strict:1} != 0
+        --with-annobin-cxx11-abi-exceptions=libstdc++.a,libstdc++.so,libstdc++.so.6,libstdc++fs.a,compatibility.o,compatibility-c++0x.o,libc++98convenience.a,libc++11convenience.a,libc++17convenience.a,libc++20convenience.a \
+%endif
 %{?cross: \
        --enable-targets=%{target_arch} \
        --enable-64-bit-bfd \
index 4deda5b..f8d15f8 100644 (file)
@@ -151,6 +151,9 @@ cd build-dir
        --host=%{host_arch} \
        %{?annobin_verification: --enable-annobin-verification=warn } \
        %{?annobin_verification_strict: --enable-annobin-verification=strict } \
+%if 0%{?annobin_verification:1}%{?annobin_verification_strict:1} != 0
+        --with-annobin-cxx11-abi-exceptions=libstdc++.a,libstdc++.so,libstdc++.so.6,libstdc++fs.a,compatibility.o,compatibility-c++0x.o,libc++98convenience.a,libc++11convenience.a,libc++17convenience.a,libc++20convenience.a \
+%endif
 %{?cross: \
        --enable-targets=%{target_arch} \
        --enable-64-bit-bfd \