mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Add libc ABI extension kludge for baseline-violating libdl symbols
Some targets have a GLIBC_2.0 baseline for libdl, while using GLIBC_2.2 for libc. This means that the generated libc.map file does not have any version nodes for GLIBC_2.0 or GLIBC_2.1. However, moving symbols from libdl into libc needs such version nodes. (Future symbol moves from librt will need this as well.) This kludge is only necessary for symbols predating GLIBC_2.2 because the affected targets use GLIBC_2.2 as the baseline for libc. Given the small number and fixed set of affected architectures, no generic mechanism is implemented, and instead the map file fragment is hard-coded in scripts/versions.mk. The compat_symbol macro already emits the appropriate version strings, so no adjustments are needed there. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
@ -93,6 +93,26 @@ function ord(c) {
|
|||||||
printf("%s %s %s\n", actlib, sortver, $0) | sort;
|
printf("%s %s %s\n", actlib, sortver, $0) | sort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Some targets do not set the ABI baseline for libdl. As a result,
|
||||||
|
# symbols originally in libdl need to be moved under historic symbol
|
||||||
|
# versions, without altering the baseline version for libc itself.
|
||||||
|
/^ *!libc_pre_versions/ {
|
||||||
|
libc_pre_versions_active = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function libc_pre_versions() {
|
||||||
|
# No local: * here, so that we do not have to update this script
|
||||||
|
# if symbols are moved into libc. The abilist files and the other
|
||||||
|
# targets (with a real GLIBC_2.0 baseline) provide testing
|
||||||
|
# coverage.
|
||||||
|
printf("\
|
||||||
|
GLIBC_2.0 {\n\
|
||||||
|
};\n\
|
||||||
|
GLIBC_2.1 {\n\
|
||||||
|
} GLIBC_2.0;\n\
|
||||||
|
") > outfile;
|
||||||
|
return "GLIBC_2.1";
|
||||||
|
}
|
||||||
|
|
||||||
function closeversion(name, oldname) {
|
function closeversion(name, oldname) {
|
||||||
printf(" local:\n *;\n") > outfile;
|
printf(" local:\n *;\n") > outfile;
|
||||||
@ -154,7 +174,11 @@ END {
|
|||||||
oldlib = $1;
|
oldlib = $1;
|
||||||
real_outfile = buildroot oldlib ".map";
|
real_outfile = buildroot oldlib ".map";
|
||||||
outfile = real_outfile "T";
|
outfile = real_outfile "T";
|
||||||
|
if ($1 == "libc" && libc_pre_versions_active) {
|
||||||
|
veryoldver = libc_pre_versions();
|
||||||
|
} else {
|
||||||
veryoldver = "";
|
veryoldver = "";
|
||||||
|
}
|
||||||
printf(" %s.map", oldlib);
|
printf(" %s.map", oldlib);
|
||||||
}
|
}
|
||||||
if ($2 != oldver) {
|
if ($2 != oldver) {
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
!libc_pre_versions
|
||||||
libc {
|
libc {
|
||||||
GLIBC_2.1 {
|
GLIBC_2.1 {
|
||||||
_sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
|
_sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
!libc_pre_versions
|
||||||
libc {
|
libc {
|
||||||
GLIBC_2.2 {
|
GLIBC_2.2 {
|
||||||
ioperm; iopl;
|
ioperm; iopl;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
!libc_pre_versions
|
||||||
libc {
|
libc {
|
||||||
GLIBC_2.2 {
|
GLIBC_2.2 {
|
||||||
# functions used in other libraries
|
# functions used in other libraries
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
!libc_pre_versions
|
||||||
libc {
|
libc {
|
||||||
GLIBC_2.0 {
|
GLIBC_2.0 {
|
||||||
# Exception handling support functions from libgcc
|
# Exception handling support functions from libgcc
|
||||||
|
Reference in New Issue
Block a user