diff options
-rw-r--r-- | include/shlib-compat.h | 26 | ||||
-rw-r--r-- | scripts/abi-versions.awk | 19 |
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; } |