Чтобы сделать это в более автоматизированным способом, вы можете использовать следующий скрипт, чтобы создать список всех символов, которые являются более новыми, в ваш GLIBC, чем в данной версии (устанавливается в строке 2). Он создает файл glibc.h
(имя файла, заданное аргументом скрипта), которое содержит все необходимые объявления .symver
. Затем вы можете добавить -include glibc.h
в свои CFLAGS, чтобы убедиться, что он попал во всю вашу компиляцию.
Этого достаточно, если вы не используете какие-либо статические библиотеки, которые были скомпилированы без указанных выше. Если вы это сделаете, и вы не хотите перекомпилировать, вы можете использовать objcopy
, чтобы создать копию библиотеки с символами, переименованными в старые версии. Вторая в нижней строке скрипта создает версию вашей системы libstdc++.a
, которая будет ссылаться на старые символы glibc. Добавление -L.
(или -Lpath/to/libstdc++.a/
) сделает вашу программу статически ссылкой libstdC++ без ссылки на кучу новых символов. Если вам это не нужно, удалите последние две строки и строку 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
Я бы также добавил, что часто есть только один или два символа, вызывающих зависимость от новой версии glibc, поэтому, если вы, как я, вы беспокоитесь, вам придется перечислить сотни символов, чтобы удалить зависимость, вы не будете. – Malvineous
dietlibc также стоит посмотреть. –
Или если вы можете связать статически (т. Е. Ваш код не является плагином и не будет использовать плагины), вы также можете посмотреть на musl-libc. Я часто обнаружил, что статически связанные программы с musl-libc меньше, чем их динамически связанные glibc-аналоги. – 0xC0000022L