GNU/Linux >> Belajar Linux >  >> Linux

Menautkan ke libc versi lama untuk menyediakan cakupan aplikasi yang lebih luas

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:

  1. Menggunakan .symver untuk mendapatkan referensi ke [email protected]_2.2.5 .

  2. Tulis __wrap_memcpy saya sendiri fungsi yang hanya memanggil [email protected]_2.2.5 langsung.

  3. 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


Linux
  1. Bagaimana saya bisa mencopot atau memutakhirkan versi node.js lama saya?

  2. Apa arti dari Peringatan:Menautkan pustaka bersama dengan pustaka statis tidak portabel?

  3. Judul aplikasi Qt

  1. relokasi R_X86_64_32S terhadap kesalahan penautan

  2. Cara menghapus Java versi lama dan menginstal versi baru

  3. dapatkan sidik jari kunci SSH dalam format hex (lama) pada versi baru openssh

  1. Ubuntu – Versi Harfbuzz Pango-error Terlalu Lama?

  2. Fedora – Paksa Dnf Untuk Menginstal Paket Versi Lama?

  3. Cara menghapus versi lama dari buncis yang terpasang