Skip to content

Commit

Permalink
crypt-port: Add the bits for compiling with link-time optimization.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
besser82 committed Aug 13, 2020
1 parent eca7aff commit c4494c8
Showing 1 changed file with 28 additions and 8 deletions.
36 changes: 28 additions & 8 deletions lib/crypt-port.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,18 +170,39 @@ _crypt_strcpy_or_abort (void *, const size_t, const void *);
__asm__(".set _" #aliasname ", _" #name); \
extern __typeof(name) aliasname __THROW

# define symver_set(extstr, intname, version, mode) \
__asm__(".globl _" extstr); \
#define _symver_ref(extstr, intname, version) \
symver_set(extstr, intname, foobar, version, "@")

# define symver_set(extstr, intname, extname, version, mode) \
__asm__(".globl _" extstr); \
__asm__(".set _" extstr ", _" #intname)

#elif defined __GNUC__ && (__GNUC__ > 10 || \
(__GNUC__ == 10 && __GNUC_MINOR__ >= 2))

# define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __THROW __attribute__ ((alias (#name)))

# 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, extname, version, mode) \
extern __typeof (intname) extname __THROW \
__attribute__((symver (extstr mode #version)))

#elif defined __GNUC__ && __GNUC__ >= 3

# define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __THROW __attribute__ ((alias (#name)))

#define _symver_ref(extstr, intname, version) \
symver_set(extstr, intname, foobar, version, "@")

/* Set the symbol version for EXTNAME, which uses INTNAME as its
implementation. */
# define symver_set(extstr, intname, version, mode) \
# define symver_set(extstr, intname, extname, version, mode) \
__asm__ (".symver " #intname "," extstr mode #version)

#else
Expand Down Expand Up @@ -219,13 +240,13 @@ _crypt_strcpy_or_abort (void *, const size_t, const void *);

#define symver_compat(n, extstr, extname, intname, version) \
strong_alias (intname, extname ## __ ## n); \
symver_set (extstr, extname ## __ ## n, version, "@")
symver_set (extstr, intname, extname ## __ ## n, version, "@")

#define symver_compat0(extstr, intname, version) \
symver_set (extstr, intname, version, "@")
symver_set (extstr, intname, intname, version, "@")

#define symver_default(extstr, intname, version) \
symver_set (extstr, intname, version, "@@")
symver_set (extstr, intname, intname, version, "@@")

#else

Expand All @@ -239,9 +260,8 @@ _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_set(extstr, intname, version, "@")
_symver_ref(extstr, intname, version)

/* Define configuration macros used during compile-time by the
GOST R 34.11-2012 "Streebog" hash function. */
Expand Down

0 comments on commit c4494c8

Please sign in to comment.