Akankah biner linux saya berfungsi di semua distro?

24

Saya menemukan IDE pengganti yang bagus untuk Delphi bernama Lazarus. Tapi saya tidak punya pertanyaan untuk programmer.

Akankah biner Linux yang terhubung secara statis bekerja di semua distribusi Linux? Yaitu tidak masalah pada apa distro Linux yang saya bangun dan itu akan bekerja pada Debian / ArchLinux / Ubuntu / OpenSUSE / ... terserah?

Sebagai hasil dari temuan saya, apakah benar-benar hanya penting 32bit vs 64bit? Saya ingin memastikan sebelum saya menerbitkan.

LinuxSecurityFreak
sumber
Samar-samar terkait: Sistem Linux panggilan di C pada OS X .
G-Man Mengatakan 'Reinstate Monica'
Bisakah Anda lebih spesifik tentang perpustakaan seperti apa yang Anda rencanakan untuk menautkan program Anda? Beberapa perpustakaan memiliki dependensi tersembunyi (file data, subsistem dinamis) atau asumsi tersirat tentang sistem yang mereka jalankan.
Thomas Erker

Jawaban:

29

Jawaban ini pertama kali ditulis untuk pertanyaan yang lebih umum "akankah biner saya berjalan di semua distro", tetapi ini membahas binari yang terhubung secara statis di babak kedua.


Untuk apa pun yang lebih kompleks daripada hello world yang terhubung secara statis, jawabannya mungkin tidak .
Tanpa pengujian pada distribusi X, menganggap jawabannya adalah tidak ada untuk X.

Jika Anda ingin mengirimkan perangkat lunak Anda dalam bentuk biner, batasi diri Anda

  • beberapa distribusi populer untuk bidang penggunaan perangkat lunak Anda (desktop, server, embedded, ...)

  • masing-masing satu atau dua versi terbaru

Kalau tidak, Anda akan berakhir dengan anjing yang terdistribusi dari semua ukuran, versi dan usia (distribusi berusia sepuluh tahun masih digunakan dan didukung).

Tes untuk itu. Hanya beberapa petunjuk tentang apa yang bisa (dan akan) salah kalau tidak:

  • Paket alat / perpustakaan yang Anda butuhkan diberi nama berbeda di seluruh distribusi dan bahkan versi dari distribusi yang sama

  • Perpustakaan yang Anda butuhkan terlalu baru atau terlalu lama (versi salah). Jangan berasumsi hanya karena program Anda dapat menautkannya, tautannya dengan perpustakaan yang tepat.

  • Pustaka yang sama (file pada disk) secara berbeda dinamai pada distribusi yang berbeda, membuat menghubungkan tidak mungkin

  • 32bit pada 64bit: lingkungan 32bit mungkin tidak diinstal atau perpustakaan 32bit yang tidak penting dipindahkan ke paket tambahan selain dari lingkungan 32on64, sehingga Anda memiliki ketergantungan ekstra hanya untuk kasus ini.

  • Shell: jangan menganggap versi Bash Anda. Jangan berasumsi bahkan Bash.

  • Alat: jangan menganggap beberapa alat baris perintah non POSIX ada di mana saja.

  • Alat: jangan menganggap alat mengenali opsi hanya karena versi GNU dari distro Anda.

  • Antarmuka kernel: Jangan menganggap keberadaan atau struktur file /prochanya karena mereka ada / memiliki struktur pada mesin Anda

  • Java: apakah Anda benar-benar yakin program Anda berjalan pada JRE IBM seperti yang dikirimkan dengan SLES tanpa mengujinya?

Bonus:

  • Set instruksi: biner yang dikompilasi pada mesin Anda tidak berjalan pada perangkat keras yang lebih lama.

Apakah menautkan secara statis (atau: menggabungkan semua perpustakaan yang Anda butuhkan dengan perangkat lunak Anda) sebagai solusi? Bahkan jika itu bekerja secara teknis, biaya yang terkait mungkin terlalu tinggi. Jadi sayangnya, jawabannya mungkin juga tidak.

  • Keamanan: Anda mengalihkan tanggung jawab untuk memperbarui perpustakaan dari pengguna perangkat lunak Anda kepada diri Anda sendiri.

  • Ukuran dan kompleksitas: hanya untuk bersenang-senang cobalah untuk membangun program GUI yang terhubung secara statis.

  • Interoperabilitas: jika perangkat lunak Anda adalah "plugin" dalam bentuk apa pun, Anda bergantung pada perangkat lunak yang memanggil Anda.

  • Desain perpustakaan: jika Anda menautkan program Anda secara statis ke GNU libc dan menggunakan layanan nama ( getpwnam()dll.), Anda pada akhirnya akan terhubung secara dinamis dengan NSS libc (saklar layanan nama).

  • Desain perpustakaan: perpustakaan yang Anda tautkan program Anda secara statis dengan menggunakan file data atau sumber daya lainnya (seperti zona waktu atau lokal).


Untuk semua alasan yang disebutkan di atas, pengujian sangat penting.

  • Kenali KVM atau teknik virtualisasi lainnya dan miliki VM dari setiap Distribusi yang Anda rencanakan untuk didukung. Uji perangkat lunak Anda di setiap VM.

  • Gunakan instalasi minimal dari distribusi tersebut.

  • Buat VM dengan set instruksi terbatas (mis. Tidak ada SSE 4).

  • Hanya terhubung lddsecara statis atau dibundel: periksa binari Anda dengan untuk melihat apakah mereka benar-benar terhubung secara statis / gunakan hanya perpustakaan yang dibundel Anda.

  • Hanya terhubung atau dibundel secara statis: buat direktori kosong dan salin perangkat lunak Anda ke dalamnya. chrootke dalam direktori itu dan jalankan perangkat lunak Anda.

Thomas Erker
sumber
Itu jawaban yang cukup komprehensif +1
sirlark
2
Shell: Secara khusus, Debian tidak menggunakan bash , dan karena itu sangat mengurangi kerentanan Shellshock pada sistem Debian, saya tidak bisa membayangkan itu berubah dalam waktu dekat.
Kevin
1
Juga, jika Anda ingin mengirim binari, tautkan secara statis .
user253751
Mengapa "set instruksi" disebut "bonus"? Jika Anda mendistribusikan dalam bentuk biner, Anda benar-benar perlu mempertimbangkan ISA mana yang akan Anda kompilasi. Anda mungkin tidak peduli untuk pengguna m68k, tetapi sulit untuk mengabaikan ARM, IA32, dan X86_64 setidaknya.
Toby Speight
@TobySpeight Pikirkan SSE4 dan semacamnya. Mungkin hanya akan menggigit Anda jika Anda menggunakan assembler.
Thomas Erker
9

Jawabannya tergantung. , tetapi dalam banyak kasus, ya, selama pustaka yang diperlukan diinstal pada OS.

Secara umum, sebagian besar distro besar seperti yang Anda sebutkan memiliki alat manajemen paket mereka yang menginstal versi aplikasi yang dikelola komunitas. Ini menangani semua paket prasyarat yang dibutuhkan oleh aplikasi. Jika Anda menginstalnya tanpa manajer paket, terserah Anda untuk memastikan semua paket dan pustaka yang diperlukan diinstal ke OS. Merupakan ide bagus untuk memasukkan daftar aplikasi prasyarat ini dalam dokumentasi.

AlexJerez
sumber
2

Jawaban jelek lebih dulu: Tergantung

Jika Anda melepaskan binari, menganggap jawaban "tidak" kecuali Anda mendistribusikan semua libs yang pernah melibatkan dengan itu (dari bawah ke atas, yang menjengkelkan kecuali jika Anda menyediakan sistem yang benar-benar besar yang berdiri di atas pula sendiri ) atau secara statis menghubungkan yang setara.

... tapi penyihir dan uang, dan penyihir uang ...

IBM memiliki beberapa installer "Unixish umum" yang telah mengejutkan saya dengan bekerja di mana-mana saya telah mencobanya: beberapa Linuces dari beberapa generasi kernel, OpenSolaris (atau apa pun namanya sekarang), Solaris, dan BSD. Tapi mereka sangat besar. Dan hal-hal yang mereka sediakan sama besarnya. Tidak ada program mobil balap kecil yang dipublikasikan dengan cara ini, hanya hal-hal jenis perusahaan yang besar yang Anda harapkan dari IBM.

Sejauh hanya tinggal di Linux, tetapi bekerja dengan baik di sebagian besar Linuxdom, ini tampaknya mungkin dalam bentuk biner, sebagaimana dibuktikan oleh beragam jenis "untuk Linux (umum)" installer biner yang akan Anda lihat dari beberapa vendor. Beberapa obrolan, peramban, permainan, penginstal-meta, dll. Diterbitkan dengan cara ini, tetapi selalu oleh vendor besar yang dapat menghabiskan waktu untuk melakukan hal ini dengan benar. Sungguh menakjubkan mereka dapat mengatakan "untuk Linux" dan secara umum yakin bahwa itu akan berhasil, tetapi ini tampaknya menjadi masalahnya.

Tapi...

Saya mendistribusikan perangkat lunak saya sebagai sumber dengan utilitas bangun. Saya melakukan ini dalam C, Erlang, Python, Tipu muslihat , dll. Ini memberi saya lebih banyak fleksibilitas tentang apakah itu akan berjalan atau tidak, dan jauh lebih mudah untuk menulis buildscript yang memastikan hal-hal yang benar ada pada waktu membangun daripada untuk pastikan semuanya ada pada saat runtime. Setelah itu ada, sepele untuk menulis pembaruan otomatis untuk program Anda jika Anda mendistribusikan sumber: sumber biasanya jauh lebih kecil daripada biner yang mencakup semua deps dan kegilaan lainnya. Dengan menggunakan metode ini, saya tidak memiliki banyak masalah yang dapat diandalkan untuk digunakan di seluruh Unices (dan kadang-kadang Windows, tapi itu lebih merupakan tugas).

Permainan anak cukup, bekali dirimu sendiri!

Ketika Anda mulai serius, seperti srsly srs, tentang menyesuaikan dengan lancar di dunia Linux, Anda mendistribusikan sumber C atau beralih ke lingkungan yang dikelola sepenuhnya untuk bahasa yang sangat menyenangkan yang telah dibangun sebelumnya. Jika Anda menulis kode Python, misalnya, Anda dapat memeriksa versi dan mengetahui versi CPython mana yang bekerja dengan Anda, dan umumnya mengharapkan beberapa versi yang kompatibel ada di Linux yang diberikan (dan ini jauh lebih mudah untuk diperiksa daripada sapuan luas C libs / versi yang mungkin Anda gunakan). Erlang, Guile, Python, Perl, CL, dll semuanya sangat target mudah untuk penyebaran semacam ini, dan banyak dari mereka memiliki repositori pusat seperti CPAN atau pip (atau apa pun) di mana pengguna dapat menjalankan perintah untuk menarik sendiri sumber yang ditandatangani ketika mereka menginginkannya, dan tahu bahwa segala sesuatu pada umumnya akan berfungsi seperti yang Anda inginkan .

[Tambahan: 1. Bahkan Haskell umumnya dapat melakukan ini melalui Cabal - meskipun saya akan berhati-hati dalam melakukan itu di lingkungan produksi. 2. Ada strategi penyebaran "rilis" yang sama sekali berbeda dengan Erlang yang menjamin kode Anda membawa lingkungan yang lengkap dengannya. 3. Python melangkah lebih jauh dengan lingkungan virtual; tidak semua runtime banyak membantu Anda.]

Bagian terakhir tentang lingkungan terkelola di Linux ini sangat luar biasa . Dan, sebagai bonus, ini memungkinkan Anda untuk menentukan dependensi yang jauh lebih umum, membuatnya diselesaikan secara otomatis tanpa usaha ekstra dari Anda, tidak perlu menulis paket per distro, dan Anda dapat berhenti peduli apakah suatu sistem adalah 32 atau 64 bit (umumnya, bagaimanapun).

zxq9
sumber