Pertanyaan yang Anda tautkan merujuk pada fungsi "Link Binary With Libraries", yang agak berbeda dari biner yang disematkan.
"Link Binary With Libraries" berarti apa yang Anda harapkan sehubungan dengan linkage: Terlepas dari apakah biner tersebut adalah library statis, library dinamis, atau framework, biner tersebut akan ditautkan ke kode objek Anda pada waktu link setelah kompilasi.
Ketika Anda memikirkan keterkaitan dengan pustaka statis, yang terjadi cukup jelas: penaut menyalin kode dari pustaka (misalnya libFoo.a
) ke dalam biner keluaran Anda. File keluaran Anda bertambah besar tetapi tidak perlu menyelesaikan dependensi eksternal apa pun pada waktu proses. Semua yang dibutuhkan program Anda untuk dijalankan (sehubungan dengan pustaka statis) ada setelah program dibuat.
Dengan pustaka dinamis (.dylib, atau kerangka kerja yang dipasok sistem), diharapkan pustaka yang Anda tautkan akan ada di suatu tempat di jalur pemuat pustaka dinamis sistem saat Anda menjalankan program. Dengan cara ini Anda tidak memiliki overhead untuk menyalin semua pustaka eksternal pihak ketiga ke biner Anda, dan semua program berbeda di komputer yang juga ditautkan ke pustaka itu akan dapat menemukannya, yang menghemat ruang disk minimal, tetapi juga kemungkinan ruang memori, tergantung pada bagaimana dan di mana perpustakaan cache sistem.
Framework mirip dengan library dinamis, tetapi dapat berisi resource dalam struktur direktorinya (gambar, audio, framework lain, dll.). Dalam hal ini statis-perpustakaan atau .dylib file sederhana tidak akan dipotong sehingga Anda mungkin harus link ke sebuah kerangka kerja hanya begitu itu dapat menemukan apa yang dibutuhkan untuk berjalan dengan baik.
Saat Anda menautkan ke kerangka pihak ketiga (katakanlah sesuatu yang Anda unduh dari github dan buat sendiri), kerangka itu mungkin tidak ada di sistem yang ingin Anda jalankan. Dalam kasus ini, Anda tidak hanya akan menautkan ke kerangka kerja, tetapi juga menyematkannya di dalam bundel aplikasi Anda menggunakan fase "Salin Kerangka Kerja". Saat program Anda berjalan, runtime-linker (alias resolver) akan melihat ke dalam bundel Anda selain ke jalur pemuat sistem, menemukan kerangka kerja yang disematkan, dan menautkannya sehingga aplikasi Anda akan memiliki kode yang diperlukan untuk menjalankannya.
Terakhir, apa yang disebut sebagai "biner tertanam" adalah file yang dapat dieksekusi yang Anda berdua sematkan dalam bundel aplikasi Anda melalui Fase File Salin, dan yang Anda jalankan sendiri, mungkin dengan panggilan ke popen()
atau serupa. Biner yang disematkan dapat dipanggil oleh program Anda, tetapi tidak terkait dengannya. Ini adalah entitas yang sepenuhnya eksternal (seperti program di /bin
direktori).
Dalam praktiknya, untuk pustaka dan kerangka kerja yang disediakan sistem Anda akan menautkannya dan hanya itu yang perlu Anda lakukan.
Jika Anda perlu menautkan pustaka yang Anda buat yang tidak memerlukan sumber daya yang disematkan (yaitu, tidak memerlukan kerangka kerja), Anda dapat menautkan ke pustaka statis. Jika Anda menemukan Anda memiliki beberapa modul dalam program Anda yang ingin menggunakan kode perpustakaan yang sama, maka mengubahnya menjadi kerangka kerja atau perpustakaan dinamis dan menautkannya dapat menghemat ruang dan mungkin nyaman (terutama jika penggunaan memori menjadi perhatian).
Terakhir, kerangka kerja tidak hanya dapat menyertakan sumber daya, tetapi file header dan / atau lisensi. Menggunakan kerangka kerja untuk menyampaikan file-file ini sebenarnya adalah mekanisme distribusi yang mudah sehingga sering kali Anda mungkin ingin memasukkan kerangka kerja agar hal-hal ini dapat mengikuti biner Anda (yaitu persyaratan lisensi mungkin membuat ini wajib).
--- EDIT ---
Adam Johns memposting pertanyaan berikut sebagai komentar:
Ini jawaban yang bagus. Namun, ada sesuatu yang masih membuat saya bingung. Apa artinya mengeksekusi biner sendiri? Apakah yang Anda maksud hanya menggunakan kode kerangka tertanam? Saya tahu Anda menyebutkan popen (), tetapi maksud Anda aplikasi saya memanggil popen ()? Saya tidak begitu tahu apa artinya.
Saya mengatakan biner yang disematkan hanyalah file sumber daya lain dalam bundel Anda, seperti file audio atau gambar, meskipun file tersebut adalah alat baris perintah yang dapat dieksekusi. The popen()
function ( man popen
dari terminal Anda untuk membaca lebih lanjut tentang hal itu) memungkinkan Anda menjalankan program yang sewenang-wenang dari program lain berjalan. The system()
Fungsi adalah cara lain. Ada yang lain, dan saya akan memberikan contoh historis di sini yang mungkin membuat pemahaman tentang penggunaan biner tersemat menjadi sedikit lebih jelas:
Seperti yang mungkin Anda sadari, saat Anda meluncurkan aplikasi di Mac OS X, aplikasi diluncurkan dengan id pengguna dari pengguna saat ini. Di bawah penginstalan yang paling umum, itulah pengguna default di pengguna Desktop admin
, yang diberi id pengguna 501
.
Pada sistem operasi berbasis Unix hanya root
pengguna (id pengguna 0
) yang memiliki akses penuh ke seluruh sistem file. Terkadang program penginstal yang diluncurkan oleh pengguna Desktop perlu menginstal file di direktori yang memiliki hak istimewa (misalnya driver). Dalam hal ini, program aplikasi perlu meningkatkan hak istimewanya kepada root
pengguna sehingga dapat menulis di direktori yang dibatasi ini.
Untuk memfasilitasi hal ini dalam sistem operasi melalui OS X 10.7, Apple menyediakan fungsi AuthorizationExecuteWithPrivileges () dalam API Layanan Otorisasi (ini sekarang sudah usang, tetapi masih menjadi contoh yang berguna).
AuthorizationExecuteWithPrivileges()
mengambil argumen jalur ke alat baris perintah untuk dieksekusi sebagai root
. Alat baris perintah adalah skrip shell yang dapat dieksekusi atau biner terkompilasi yang Anda tulis untuk menjalankan logika penginstalan. Alat ini dipasang di dalam bundel aplikasi Anda seperti file sumber daya lainnya.
Saat dipanggil, OS memasang dialog otorisasi yang meminta kata sandi pengguna (Anda pernah melihat ini sebelumnya!) Dan ketika dimasukkan akan menjalankan program seperti root
atas nama aplikasi Anda. Proses ini mirip dengan hanya menjalankan program dengan popen()
diri Anda sendiri, meskipun popen()
tidak memberi Anda keuntungan dari peningkatan hak istimewa.