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>
/* 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
enable_separate_code
enable_leading_mingw64_underscores
enable_annobin_verification
+with_annobin_cxx11_abi_exceptions
with_separate_debug_dir
with_pkgversion
with_bugurl
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]]
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.
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],
#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 *
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;
}
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;
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,
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"));
BFD_ASSERT (sec != NULL);
if (!sec)
- return;
+ return NULL;
/* Update stack size in .note.gnu.property with -z stack-size=N
if N > 0. */
--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 \
--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 \
--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 \
--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 \