Para hacer esto de una manera más automatizada, se puede utilizar la siguiente secuencia de comandos para crear una lista de todos los símbolos que son más recientes en su GLIBC que en una versión dada (configurada en la línea 2). Crea un archivo glibc.h
(nombre de archivo establecido por el argumento script) que contiene todas las declaraciones .symver
necesarias. A continuación, puede agregar -include glibc.h
a su CFLAGS para asegurarse de que se recoja en todas partes en su compilación.
Esto es suficiente si no usa ninguna biblioteca estática que se haya compilado sin incluir lo anterior. Si lo hace, y no desea volver a compilar, puede usar objcopy
para crear una copia de la biblioteca con los símbolos renombrados a las versiones anteriores. La segunda línea de la secuencia de comandos crea una versión de su sistema libstdc++.a
que se vinculará con los símbolos glibc antiguos. Agregar -L.
(o -Lpath/to/libstdc++.a/
) hará que su programa enlace estáticamente libstdC++ sin vincular un montón de nuevos símbolos. Si no necesita esto, elimine las dos últimas líneas y la línea printf ... redeff
.
#!/bin/bash
maxver=2.9
headerf=${1:-glibc.h}
set -e
for lib in libc.so.6 libm.so.6 libpthread.so.0 libdl.so.2 libresolv.so.2 librt.so.1; do
objdump -T /usr/lib/$lib
done | awk -v maxver=${maxver} -vheaderf=${headerf} -vredeff=${headerf}.redef -f <(cat <<'EOF'
BEGIN {
split(maxver, ver, /\./)
limit_ver = ver[1] * 10000 + ver[2]*100 + ver[3]
}
/GLIBC_/ {
gsub(/\(|\)/, "",$(NF-1))
split($(NF-1), ver, /GLIBC_|\./)
vers = ver[2] * 10000 + ver[3]*100 + ver[4]
if (vers > 0) {
if (symvertext[$(NF)] != $(NF-1))
count[$(NF)]++
if (vers <= limit_ver && vers > symvers[$(NF)]) {
symvers[$(NF)] = vers
symvertext[$(NF)] = $(NF-1)
}
}
}
END {
for (s in symvers) {
if (count[s] > 1) {
printf("__asm__(\".symver %s,%[email protected]%s\");\n", s, s, symvertext[s]) > headerf
printf("%s %[email protected]%s\n", s, s, symvertext[s]) > redeff
}
}
}
EOF
)
sort ${headerf} -o ${headerf}
objcopy --redefine-syms=${headerf}.redef /usr/lib/libstdc++.a libstdc++.a
rm ${headerf}.redef
También agregaría que a menudo solo hay uno o dos símbolos que causan una dependencia en una nueva versión de glibc, por lo que si me preocupa que tenga que enumerar cientos de símbolos para eliminar una dependencia, no lo hará. – Malvineous
dietlibc también vale la pena mirar. –
O si puede vincular estáticamente (es decir, su código no es un complemento y no usará complementos), también puede consultar musl-libc. He encontrado a menudo que los programas enlazados estáticamente con musl-libc son más pequeños que sus contrapartes glibc dinámicamente vinculados. – 0xC0000022L