aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/shlib-compat.h26
-rw-r--r--scripts/abi-versions.awk19
2 files changed, 29 insertions, 16 deletions
diff --git a/include/shlib-compat.h b/include/shlib-compat.h
index a125d907c1..c91e6ce489 100644
--- a/include/shlib-compat.h
+++ b/include/shlib-compat.h
@@ -25,14 +25,22 @@
# include <abi-versions.h> /* header generated by abi-versions.awk */
/* The file abi-versions.h (generated by scripts/abi-versions.awk) defines
- symbols like `ABI_libm_GLIBC_2_0' to either 1 or 0 indicating whether or
- not we want to build binary compatibility for e.g. the GLIBC_2.0 version
- set into the libm shared object. If this evaluates to zero, then there
- is no need to compile in extra code to support this version set where it
- has been superseded by a newer version. The compatibility code should
- be conditionalized with `#if SHLIB_COMPAT (libm, GLIBC_2_0)'. */
-
-# define SHLIB_COMPAT(lib, version) ABI_##lib##_##version
+ symbols like `ABI_libm_GLIBC_2_0' for each version set in the source
+ code for each library. For a version set that is subsumed by a later
+ version set, the definition gives the subsuming set, i.e. if GLIBC_2_0
+ is subsumed by GLIBC_2_1, then ABI_libm_GLIBC_2_0 == ABI_libm_GLIBC_2_1.
+ Each version set that is to be distinctly defined in the output has an
+ unique positive integer value, increasing with newer versions. Thus,
+ evaluating two ABI_* symbols reduces to integer values that differ only
+ when the two version sets named are in fact two different ABIs we are
+ supporting. If these do not differ, then there is no need to compile in
+ extra code to support this version set where it has been superseded by a
+ newer version. The compatibility code should be conditionalized with
+ e.g. `#if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_2)' for code introduced
+ in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */
+
+# define SHLIB_COMPAT(lib, introduced, obsoleted) \
+ (ABI_##lib##_##introduced < ABI_##lib##_##obsoleted)
/* That header also defines symbols like `VERSION_libm_GLIBC_2_1' to
the version set name to use for e.g. symbols first introduced into
@@ -51,7 +59,7 @@
#else
/* Not compiling ELF shared libraries at all, so never any old versions. */
-# define SHLIB_COMPAT(lib, version) 0
+# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
/* No versions to worry about, just make this the global definition. */
# define versioned_symbol(lib, local, symbol, version) \
diff --git a/scripts/abi-versions.awk b/scripts/abi-versions.awk
index 0cceaad66a..b8994c7e75 100644
--- a/scripts/abi-versions.awk
+++ b/scripts/abi-versions.awk
@@ -11,6 +11,7 @@ NF == 2 && $2 == "{" {
thislib = $1;
gsub(/[^A-Za-z0-9_ ]/, "_"); libid = $1;
printf "\n/* start %s */\n", thislib;
+ n = 0;
next;
}
$1 == "}" {
@@ -19,18 +20,22 @@ $1 == "}" {
}
$2 == "=" {
- new = $3;
- gsub(/[^A-Za-z0-9_ ]/, "_"); id = $1;
- printf "#define ABI_%s_%s\t0\t/* earliest supported %s */\n", libid, id, new;
- printf "#define VERSION_%s_%s\t%s\n", libid, id, new;
+ old = $1; new = $3;
+ gsub(/[^A-Za-z0-9_ ]/, "_");
+ oldid = $1; newid = $3;
+
+ printf "#define ABI_%s_%s\tABI_%s_%s\n", libid, oldid, libid, newid;
+ printf "#define VERSION_%s_%s\t%s\n", libid, oldid, new;
next;
}
{
vers = $1;
- gsub(/[^A-Za-z0-9_ ]/, "_"); id = $1;
- printf "#define ABI_%s_%s\t1\t/* support %s */\n", libid, id, vers;
- printf "#define VERSION_%s_%s\t%s\n", libid, id, vers;
+ gsub(/[^A-Za-z0-9_ ]/, "_");
+ versid = $1;
+
+ printf "#define ABI_%s_%s\t%d\t/* support %s */\n", libid, versid, ++n, vers;
+ printf "#define VERSION_%s_%s\t%s\n", libid, versid, vers;
next;
}