You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.5 KiB
70 lines
2.5 KiB
From a1bff4255fb9cad501a8a5d4bffb8f95df0f615f Mon Sep 17 00:00:00 2001 |
|
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82@fedoraproject.org> |
|
Date: Thu, 13 Aug 2020 18:51:50 +0200 |
|
Subject: [PATCH] crypt-port: Add the bits for compiling with link-time |
|
optimization. |
|
|
|
GCC 10.2 and LLVM/Clang 10 offer initial support for building |
|
libraries, that are using symbol versioning features, with LTO. |
|
|
|
To make use of this with GCC 10.2, the exported versioned symbols |
|
need to be declared explicitly with __attribute__((symver (...))). |
|
|
|
LLVM/Clang 10 supports symbol versioning with LTO out of the box |
|
without any changes needed. |
|
|
|
Fixes #24. |
|
--- |
|
lib/crypt-port.h | 25 ++++++++++++++++++++++++- |
|
1 file changed, 24 insertions(+), 1 deletion(-) |
|
|
|
diff --git a/lib/crypt-port.h b/lib/crypt-port.h |
|
index bec36ac..ca86261 100644 |
|
--- a/lib/crypt-port.h |
|
+++ b/lib/crypt-port.h |
|
@@ -179,11 +179,29 @@ _crypt_strcpy_or_abort (void *, const size_t, const void *); |
|
# define _strong_alias(name, aliasname) \ |
|
extern __typeof (name) aliasname __THROW __attribute__ ((alias (#name))) |
|
|
|
+/* Starting with GCC 10.2, we can use the symver attribute, which also works |
|
+ with link-time optimization enabled. */ |
|
+# if __GNUC__ > 10 || (__GNUC__ == 10 && __GNUC_MINOR__ >= 2) |
|
+ |
|
+/* Referencing specific _compatibility_ symbols still needs inline asm. */ |
|
+# define _symver_ref(extstr, intname, version) \ |
|
+ __asm__ (".symver " #intname "," extstr "@" #version) |
|
+ |
|
+/* Set the symbol version for EXTNAME, which uses INTNAME as its |
|
+ implementation. */ |
|
+# define symver_set(extstr, intname, version, mode) \ |
|
+ extern __typeof (intname) intname __THROW \ |
|
+ __attribute__((symver (extstr mode #version))) |
|
+ |
|
+# else |
|
+ |
|
/* Set the symbol version for EXTNAME, which uses INTNAME as its |
|
implementation. */ |
|
# define symver_set(extstr, intname, version, mode) \ |
|
__asm__ (".symver " #intname "," extstr mode #version) |
|
|
|
+# endif |
|
+ |
|
#else |
|
# error "Don't know how to do symbol versioning with this compiler" |
|
#endif |
|
@@ -239,9 +257,14 @@ _crypt_strcpy_or_abort (void *, const size_t, const void *); |
|
|
|
/* Tests may need to _refer_ to compatibility symbols, but should never need |
|
to _define_ them. */ |
|
- |
|
#define symver_ref(extstr, intname, version) \ |
|
+ _symver_ref(extstr, intname, version) |
|
+ |
|
+/* Generic way for referencing specific _compatibility_ symbols. */ |
|
+#ifndef _symver_ref |
|
+#define _symver_ref(extstr, intname, version) \ |
|
symver_set(extstr, intname, version, "@") |
|
+#endif |
|
|
|
/* Define configuration macros used during compile-time by the |
|
GOST R 34.11-2012 "Streebog" hash function. */
|
|
|