diff options
author | Andrey Kazmin <a.kazmin@partner.samsung.com> | 2020-03-04 14:41:56 +0300 |
---|---|---|
committer | Dongkyun Son <dongkyun.s@samsung.com> | 2020-07-22 11:54:50 +0000 |
commit | e7eb721bd3b64ad4c2218df333cd51408b175e2a (patch) | |
tree | c9839ba3120450600d225533e250244da9ca2512 | |
parent | c9feee5c76863c128e42a97a7fda148b54fdb043 (diff) | |
download | binutils-e7eb721bd3b64ad4c2218df333cd51408b175e2a.tar.gz binutils-e7eb721bd3b64ad4c2218df333cd51408b175e2a.tar.bz2 binutils-e7eb721bd3b64ad4c2218df333cd51408b175e2a.zip |
Add annobin cxx11 ABI verification exception listsubmit/tizen_base/20200728.025124submit/tizen_base/20200722.120650accepted/tizen/base/tool/20200809.005349
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>
-rw-r--r-- | bfd/config.in | 3 | ||||
-rwxr-xr-x | bfd/configure | 20 | ||||
-rw-r--r-- | bfd/configure.ac | 11 | ||||
-rw-r--r-- | bfd/elf-properties.c | 59 | ||||
-rw-r--r-- | packaging/binutils-aarch64.spec | 3 | ||||
-rw-r--r-- | packaging/binutils-armv7hl.spec | 3 | ||||
-rw-r--r-- | packaging/binutils-armv7l.spec | 3 | ||||
-rw-r--r-- | packaging/binutils.spec | 3 |
8 files changed, 94 insertions, 11 deletions
diff --git a/bfd/config.in b/bfd/config.in index 01c38b7c4c1..e2450b261ba 100644 --- a/bfd/config.in +++ b/bfd/config.in @@ -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 diff --git a/bfd/configure b/bfd/configure index 50e4bd35196..d694b6e0773 100755 --- a/bfd/configure +++ b/bfd/configure @@ -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. diff --git a/bfd/configure.ac b/bfd/configure.ac index a492b262c63..900ea8c71f8 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -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], diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c index e3951f9d1d8..d942012046e 100644 --- a/bfd/elf-properties.c +++ b/bfd/elf-properties.c @@ -28,6 +28,35 @@ #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. */ diff --git a/packaging/binutils-aarch64.spec b/packaging/binutils-aarch64.spec index cd05bcc0a41..3ae464526a6 100644 --- a/packaging/binutils-aarch64.spec +++ b/packaging/binutils-aarch64.spec @@ -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 \ diff --git a/packaging/binutils-armv7hl.spec b/packaging/binutils-armv7hl.spec index c4522724f5a..ca13fb2d484 100644 --- a/packaging/binutils-armv7hl.spec +++ b/packaging/binutils-armv7hl.spec @@ -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 \ diff --git a/packaging/binutils-armv7l.spec b/packaging/binutils-armv7l.spec index 225f7a3e6ae..2346a635052 100644 --- a/packaging/binutils-armv7l.spec +++ b/packaging/binutils-armv7l.spec @@ -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 \ diff --git a/packaging/binutils.spec b/packaging/binutils.spec index 4deda5b0eba..f8d15f8d608 100644 --- a/packaging/binutils.spec +++ b/packaging/binutils.spec @@ -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 \ |