Per fare questo in modo più automatizzato, è possibile utilizzare il seguente script per creare un elenco di tutti i simboli che sono più recenti in il tuo GLIBC rispetto a una determinata versione (impostata sulla riga 2). Crea un file glibc.h
(nome file impostato dall'argomento script) che contiene tutte le necessarie dichiarazioni .symver
. Puoi quindi aggiungere -include glibc.h
ai tuoi CFLAGS per assicurarti che vengano raccolti ovunque nella tua compilation.
Ciò è sufficiente se non si utilizzano librerie statiche compilate senza l'inclusione precedente. Se lo fai, e non vuoi ricompilare, puoi usare objcopy
per creare una copia della libreria con i simboli rinominati nelle vecchie versioni. La seconda riga inferiore dello script crea una versione del sistema libstdc++.a
che si collegherà ai vecchi simboli glibc. L'aggiunta di -L.
(o -Lpath/to/libstdc++.a/
) renderà il programma in grado di collegare staticamente libstdC++ senza collegarsi a un gruppo di nuovi simboli. Se non ti serve, elimina le ultime due righe e la riga 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
Vorrei anche aggiungere che spesso ci sono solo uno o due simboli che causano una dipendenza da una nuova versione di glibc, quindi se come me sei preoccupato di dover elencare centinaia di simboli per rimuovere una dipendenza, non lo farai. – Malvineous
Anche dietlibc vale la pena guardare. –
Oppure, se è possibile collegare in modo statico (ovvero il tuo codice non è un plug-in e non utilizzerà plug-in), puoi anche consultare musl-libc. Ho trovato spesso che i programmi linkati staticamente con musl-libc sono più piccoli delle loro controparti glibc collegate dinamicamente. – 0xC0000022L