Cari tahu simbol mana dalam executable Anda yang membuat ketergantungan pada versi glibc yang tidak diinginkan.
$ objdump -p myprog
...
Version References:
required from libc.so.6:
0x09691972 0x00 05 GLIBC_2.3
0x09691a75 0x00 03 GLIBC_2.2.5
$ objdump -T myprog | fgrep GLIBC_2.3
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3 realpath
Lihat di dalam pustaka dependen untuk melihat apakah ada simbol di versi lama yang dapat Anda tautkan:
$ objdump -T /lib/libc.so.6 | grep -w realpath
0000000000105d90 g DF .text 0000000000000021 (GLIBC_2.2.5) realpath
000000000003e7b0 g DF .text 00000000000004bf GLIBC_2.3 realpath
Kami beruntung!
Minta versi dari GLIBC_2.2.5
dalam kode Anda:
#include <limits.h>
#include <stdlib.h>
__asm__(".symver realpath,[email protected]_2.2.5");
int main () {
realpath ("foo", "bar");
}
Perhatikan bahwa GLIBC_2.3 tidak lagi diperlukan:
$ objdump -p myprog
...
Version References:
required from libc.so.6:
0x09691a75 0x00 02 GLIBC_2.2.5
$ objdump -T myprog | grep realpath
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 realpath
Untuk informasi lebih lanjut, lihat http://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103.
Sayangnya, solusi @ Sam tidak berfungsi dengan baik dalam situasi saya. Namun menurut caranya, saya menemukan cara saya sendiri untuk menyelesaikannya.
Ini adalah situasi saya:
Saya sedang menulis program C++ menggunakan kerangka Thrift (ini adalah middleware RPC). Saya lebih suka tautan statis daripada tautan dinamis, jadi program saya ditautkan ke libthrift.a secara statis, bukan libthrift.so . Namun, libthrift.a secara dinamis ditautkan ke glibc, dan sejak libthrift.a saya dibangun di sistem saya dengan glibc 2.15, libthrift.a saya menggunakan memcpy versi 2.14([email protected]_2.14 ) disediakan oleh glibc 2.15.
Namun masalahnya adalah mesin server kami hanya memiliki glibc versi 2.5 yang hanya memiliki [email protected]_2.2.5 . Jauh lebih rendah daripada [email protected]_2.14 . Jadi, tentu saja, program server saya tidak dapat berjalan di mesin tersebut.
Dan saya menemukan solusi ini:
-
Menggunakan .symver untuk mendapatkan referensi ke [email protected]_2.2.5 .
-
Tulis __wrap_memcpy saya sendiri fungsi yang hanya memanggil [email protected]_2.2.5 langsung.
-
Saat menautkan program saya, tambahkan -Wl,--wrap=memcpy opsi untuk gcc/g++.
Kode yang terlibat dalam langkah 1 dan 2 ada di sini:https://Gist.github.com/nicky-zs/7541169