67 lines
2.8 KiB
C
67 lines
2.8 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/private/elfversion.h
|
|
// Purpose: Helper macro for assigning ELF version to a symbol.
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2025-04-14
|
|
// Copyright: (c) 2025 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_PRIVATE_ELFVERSION_H_
|
|
#define _WX_PRIVATE_ELFVERSION_H_
|
|
|
|
// This symbol is defined by configure if .symver directive is supported.
|
|
#ifdef wxHAVE_ELF_SYMVER
|
|
// Prefer to use the attribute if it is available, as it works with LTO,
|
|
// unlike the assembler directive.
|
|
#ifdef __has_attribute
|
|
#if __has_attribute(__symver__)
|
|
#define wxELF_SYMVER(sym, symver) __attribute__((__symver__(symver)))
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef wxELF_SYMVER
|
|
#define wxELF_SYMVER(sym, symver) __asm__(".symver " sym "," symver);
|
|
#endif
|
|
|
|
// Using multiple versions for the same symbols may be not supported, in
|
|
// which case we omit it: this results in generating 2 default versions for
|
|
// the same symbol, which looks wrong, but doesn't seem to cause any
|
|
// problems.
|
|
#ifdef wxHAVE_ELF_SYMVER_MULTIPLE
|
|
#define wxELF_SYMVER_NON_DEFAULT(sym, ver) wxELF_SYMVER(sym, ver)
|
|
#else
|
|
#define wxELF_SYMVER_NON_DEFAULT(sym, ver)
|
|
#endif
|
|
|
|
// Our version tag depends on whether we're using Unicode or not.
|
|
#if wxUSE_UNICODE
|
|
#define wxMAKE_ELF_VERSION_TAG(ver) "WXU_" ver
|
|
#else
|
|
#define wxMAKE_ELF_VERSION_TAG(ver) "WX_" ver
|
|
#endif
|
|
|
|
// This macro is used to repair ABI compatibility problems with the symbols
|
|
// versions if any symbols are added with the wrong "3.4" version tag
|
|
// because their definitions in the version script were erroneous.
|
|
//
|
|
// It allows to define both the old, compatible version ("3.4") and the new
|
|
// ("3.4.N") one for the given symbol to restore ABI compatibility with the
|
|
// previous releases without breaking it with the release containing the
|
|
// corrected version.
|
|
//
|
|
// The parameters are the mangled symbol name (the simplest way to get is
|
|
// probably to use nm or readelf on the object file or library) and the
|
|
// part of the version after "WX[U]_", i.e. the version number itself.
|
|
//
|
|
// Note that this macro takes strings, not symbols, and that it includes
|
|
// the trailing semicolon for consistency with the empty version below.
|
|
#define wxELF_VERSION_COMPAT(sym, ver) \
|
|
wxELF_SYMVER_NON_DEFAULT(sym, sym "@" wxMAKE_ELF_VERSION_TAG("3.4")) \
|
|
wxELF_SYMVER(sym, sym "@@" wxMAKE_ELF_VERSION_TAG(ver))
|
|
#else
|
|
#define wxELF_VERSION_COMPAT(sym, ver)
|
|
#endif
|
|
|
|
#endif // _WX_PRIVATE_ELFVERSION_H_
|