Apakah ada cara open-source untuk membuat statis dari executable dinamis tanpa ketersediaan kode sumber?

20

Biarkan saya menjelaskan masalah dengan sebuah contoh. Saya menggunakan beberapa program lama di hari ke hari kerja, seperti misalnya xfig dan pdfedit .

Sekarang, program-program ini sudah cukup tua dan tidak terlalu sering diperbarui; Ketakutan saya adalah bahwa suatu hari mereka tidak akan berfungsi lagi karena kurangnya perpustakaan atau pembaruan yang tidak kompatibel.

Jika program ini mudah dikompilasi sekarang , pada sistem yang sedang berjalan, solusinya sangat berguna: cobalah untuk meretas sedikit sumber dan mengompilasinya secara statis --- eksekusi yang dihasilkan akan besar dan tidak begitu efisien, tetapi akan bekerja untuk masa mendatang (1). Ini tampaknya menjadi kasus untuk xfigdan saya akan mencobanya sesegera mungkin.

Tetapi, misalnya, pdfedittergantung pada Qt3, dan menyiapkan sistem untuk mengkompilasinya cukup rumit saat ini. Untungnya itu bisa dijalankan sekarang, berkat fakta bahwa perpustakaan yang dibutuhkan tidak bertentangan dengan apa pun. Tapi ini bisa berubah di masa depan, jadi saya ingin menyelesaikan masalah ini:

Bagaimana saya bisa membuat biner statis (atau yang serupa) jika saya memiliki yang dinamis dan semua pustaka, tetapi tidak ada kode sumber, di Ubuntu?

Saya mencari-cari. Salah satu kemungkinan adalah statifier (2), tetapi memiliki banyak masalah dengan pengacakan alamat , jadi itu adalah tidak-tidak. Versi non-bebas, Ermine , tampaknya berfungsi, tetapi saya benar-benar lebih suka opsi sumber terbuka.

Kemungkinan lain adalah menggunakan buruh pelabuhan atau sistem pengemasan serupa. Tetapi semua tutorial yang saya temukan cukup berorientasi RedHat ; dan, jujur, cukup rumit untuk diikuti.


Catatan kaki :

(1) tidak terlalu gila. Saya menggunakan ffmpeg statis misalnya, berfungsi dengan baik dan tanpa masalah kompatibilitas ...

(2) untuk mengkompilasi statifier, lihat /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
sumber

Jawaban:

19

Anda dapat memecahkan masalah Anda dengan cara lain dan lebih sederhana:

Gunakan lddpada executable Anda untuk melihat perpustakaan yang ditautkan, misalnya:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Kemudian kumpulkan semua perpustakaan dalam folder dan setel variabel lingkungan LD_LIBRARY_PATH sebelum menjalankan program Anda untuk menunjuk pada folder ini:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Atau Anda dapat menambahkan entri untuk folder lib /etc/ld.so.conf.d/. Tapi itu akan menerapkan perubahan di seluruh sistem.

Klaus D.
sumber
Ini adalah ide yang bagus --- walaupun saya benar-benar ingin menemukan cara untuk mengemas semua ini menjadi executable; solusi ini dapat dipengaruhi oleh perubahan pada loader (meskipun saya harap tidak ada yang akan melakukan hal seperti itu dengan cara yang tidak kompatibel mundur). Akan memberikan hadiah jika tidak ada solusi yang lebih baik muncul --- terima kasih.
Rmano
Anda bisa menambahkan ini ke skrip instalasi kecil dan menautkannya ke jalur lokal. Saya suka solusi ini, bisa menggunakannya waktu lalu.
WalyKu
1
@ Klaus, linux-vdso.so.1 tidak ada tempat untuk dilihat, saya kira itu di kernel, benar?
Rmano
1
Iya nih. Dari man 7 vdso: "The" vDSO "(objek bersama dinamis virtual) adalah pustaka bersama kecil yang kernel secara otomatis memetakan ke ruang alamat semua aplikasi ruang pengguna."
Klaus D.
Meskipun ini bukan semata - mata jawaban untuk pertanyaan, itu adalah solusi yang masuk akal. Terima kasih.
Rmano
2

Satu saran tentang statifier :

Jika address space layout randomization (ASLR) menyebabkannya gagal, Anda tidak harus mematikannya untuk seluruh mesin. Anda dapat mematikannya hanya untuk proses itu:

$ setarch `uname -m` -R statified_pdfedit [args...]

Ini akan menjalankan perintah itu dengan tata letak acak dinonaktifkan (tidak perlu root).

perasan lemon
sumber
Wow, menarik. Sekarang jika saya bisa mengkompilasi statifier...
Rmano
Disusun dan diperiksa. xfig_statifiedmasih inti kesedihan ... sangat disayangkan. Bagaimanapun, terima kasih.
Rmano
Ya, sangat disayangkan. Saya ingin tahu apakah ini bukan masalah 64bit, coba jalankan statifier pada pengaturan 32bit mungkin?
lemonsqueeze
Diperiksa pada mesin 32-bit, masih core dump.
Rmano