GNU/Linux >> Belajar Linux >  >> Linux

Pengantar Pustaka Bersama Linux (Cara Membuat Pustaka Bersama)

Pustaka adalah file yang berisi kode yang dikompilasi dari berbagai file objek yang dimasukkan ke dalam satu file. Ini mungkin berisi sekelompok fungsi yang digunakan dalam konteks tertentu. Misalnya, library 'pthread' digunakan ketika fungsi terkait thread akan digunakan dalam program.

Secara umum, library (atau Program Library) dapat terdiri dari dua jenis :

  1. Pustaka Bersama
  2. Perpustakaan Statis

Pada artikel ini kita akan membahas secara khusus tentang Shared Library.

Pustaka Bersama

Pustaka Bersama adalah pustaka yang dapat ditautkan ke program apa pun saat run-time. Mereka menyediakan sarana untuk menggunakan kode yang dapat dimuat di mana saja di memori. Setelah dimuat, kode perpustakaan bersama dapat digunakan oleh sejumlah program. Jadi, dengan cara ini ukuran program (menggunakan perpustakaan bersama) dan jejak memori dapat dijaga tetap rendah karena banyak kode yang disimpan bersama dalam bentuk perpustakaan bersama.

Pustaka bersama memberikan modularitas ke lingkungan pengembangan karena kode pustaka dapat diubah, dimodifikasi, dan dikompilasi ulang tanpa harus mengompilasi ulang aplikasi yang menggunakan pustaka ini. Misalnya, untuk setiap perubahan dalam kode pustaka pthread, tidak ada perubahan yang diperlukan dalam program yang menggunakan pustaka bersama pthread. Pustaka bersama dapat diakses melalui berbagai nama :

  • Nama yang digunakan oleh linker ('lib' diikuti dengan nama perpustakaan, diikuti dengan '.so' . Misalnya libpthread.so)
  • Nama atau soname yang sepenuhnya memenuhi syarat ( 'lib' diikuti dengan nama perpustakaan, diikuti oleh '.so', diikuti oleh '.' dan nomor versi. Misalnya:libpthread.so.1)
  • Nama asli ('lib' diikuti dengan nama perpustakaan, diikuti oleh '.so', diikuti oleh '.' dan nomor versi, diikuti oleh '.' dan nomor minor, diikuti oleh '.' dan nomor rilis. Nomor rilis bersifat opsional. Misalnya, libpthread.so.1.1)

Nomor versi diubah untuk pustaka bersama saat perubahan yang dilakukan dalam kode membuat pustaka bersama tidak kompatibel dengan versi sebelumnya. Misalnya, jika suatu fungsi benar-benar dihapus, maka diperlukan versi perpustakaan yang baru.

Sejumlah kecil diubah jika ada modifikasi dalam kode yang tidak membuat pustaka bersama tidak kompatibel dengan versi sebelumnya yang digunakan. Misalnya, perbaikan bug kecil tidak akan merusak kompatibilitas pustaka bersama yang ada sehingga hanya sejumlah kecil yang diubah sementara versi tetap sama.

Sekarang, orang mungkin bertanya-tanya mengapa begitu banyak nama untuk perpustakaan bersama?

Nah, konvensi penamaan ini membantu beberapa versi perpustakaan bersama yang sama untuk hidup berdampingan dalam suatu sistem. Program yang terhubung dengan pustaka bersama tidak perlu memperhatikan versi terbaru dari pustaka bersama yang diinstal di sistem. Setelah versi terbaru dari pustaka bersama berhasil diinstal, semua program secara otomatis mulai menautkan ke versi terbaru.

Nama yang digunakan oleh penaut biasanya merupakan tautan simbolis ke nama yang sepenuhnya memenuhi syarat yang selanjutnya merupakan tautan simbolis ke nama asli.

Penempatan di Sistem File

Terutama ada tiga lokasi standar dalam sistem file tempat perpustakaan dapat ditempatkan.

  • /lib
  • /usr/lib
  • /usr/local/lib

Kami akan menggunakan standar Filesystem Hierarchy (FHS) di sini. Menurut standar FHS, Semua perpustakaan yang dimuat saat start up dan berjalan di sistem file root disimpan di /lib. Sedangkan library yang digunakan oleh sistem secara internal disimpan di /usr/lib. Pustaka ini tidak dimaksudkan untuk digunakan langsung oleh pengguna atau skrip shell. Ada lokasi ketiga /usr/local/lib( meskipun tidak didefinisikan dalam versi terbaru FHS ). Jika ada, itu berisi semua perpustakaan yang bukan bagian dari distribusi standar. Pustaka non-standar ini adalah pustaka yang Anda unduh dan mungkin bermasalah.

Menggunakan ldconfig

Setelah pustaka bersama dibuat, salin pustaka bersama ke direktori tempat Anda ingin pustaka berada (misalnya /usr/local/lib atau /usr/lib). Sekarang, jalankan perintah ldconfig di direktori ini.

Apa yang dilakukan ldconfig?

Anda ingat bahwa kita telah membahas sebelumnya bahwa nama tautan untuk pustaka bersama adalah tautan simbolis ke soname yang sepenuhnya memenuhi syarat yang pada gilirannya merupakan tautan simbolis ke nama asli. Nah, perintah ini melakukan hal yang sama.

Saat Anda menjalankan ELF yang dapat dieksekusi, secara default loader dijalankan terlebih dahulu. Loader itu sendiri adalah file objek bersama /lib/ld-linux.so.X di mana 'X' adalah nomor versi. Pemuat ini pada gilirannya menemukan dan memuat semua pustaka bersama yang menjadi sandaran program kita.

Semua direktori yang dicari oleh loader untuk menemukan perpustakaan disimpan di /etc/ld.so.conf. Mencari semua direktori yang ditentukan dalam file /etc/ld.so.conf dapat memakan waktu sehingga setiap kali perintah ldconfig dijalankan, ia menyiapkan tautan simbolis yang diperlukan dan kemudian membuat cache di file /etc/ld.so.cache di mana semua informasi yang diperlukan untuk dieksekusi ditulis. Membaca informasi dari cache sangat memakan waktu lebih sedikit. Tangkapannya di sini adalah bahwa perintah ldconfig perlu dijalankan setiap kali perpustakaan bersama ditambahkan atau dihapus. Jadi saat start-up program menggunakan /etc/ld.so.cache untuk memuat library yang diperlukan.

Menggunakan Lokasi Perpustakaan Non Standar

Saat menggunakan lokasi perpustakaan non standar. Salah satu dari tiga langkah berikut dapat dilakukan :

Tambahkan path ke file /etc/ld.so.conf. File ini berisi jalur ke semua direktori tempat perpustakaan dicari oleh loader. File ini terkadang dapat berisi satu baris seperti :

include /etc/ld.so.conf.d/*.conf

Dalam hal ini, buat saja file conf di direktori yang sama. Anda dapat langsung menambahkan direktori ke cache dengan menggunakan perintah berikut:

ldconfig -n [non standard directory path containing shared library]

Perhatikan bahwa ini adalah perubahan sementara dan akan hilang setelah sistem di-boot ulang. Perbarui variabel lingkungan LD_LIBRARY_PATH untuk menunjuk ke direktori Anda yang berisi pustaka bersama. Loader akan menggunakan jalur yang disebutkan dalam variabel lingkungan ini untuk menyelesaikan dependensi.

Perhatikan bahwa pada beberapa sistem Unix, nama variabel lingkungan dapat berbeda.

Catatan:Pada topik terkait, seperti yang telah kami jelaskan sebelumnya, ada empat tahap utama yang dilalui kode sumber untuk akhirnya menjadi yang dapat dieksekusi.

Contoh (Cara Membuat Pustaka Bersama)

Mari kita ambil contoh praktis sederhana untuk melihat bagaimana kita dapat membuat dan menggunakan perpustakaan bersama. Berikut potongan kode (shared.c) yang ingin kita masukkan ke dalam shared library :

#include "shared.h"
unsigned int add(unsigned int a, unsigned int b)
{
    printf("\n Inside add()\n");
    return (a+b);
}

shared.h terlihat seperti :

#include<stdio.h>
extern unsigned int add(unsigned int a, unsigned int b);

Mari kita jadikan shared.c sebagai perpustakaan bersama.

1. Jalankan dua perintah berikut untuk membuat perpustakaan bersama :

gcc -c -Wall -Werror -fPIC shared.c
gcc -shared -o libshared.so shared.o

Perintah pertama mengkompilasi kode shared.c menjadi kode independen posisi yang diperlukan untuk shared library.
Perintah kedua sebenarnya membuat shared library dengan nama 'libshared.so'.

2. Berikut adalah kode program yang menggunakan fungsi shared library ‘add()’

#include<stdio.h>
#include"shared.h"
int main(void)
{
    unsigned int a = 1;
    unsigned int b = 2;
    unsigned int result = 0;

    result = add(a,b);

    printf("\n The result is [%u]\n",result);
    return 0;
}

3. Selanjutnya jalankan perintah berikut :

gcc -L/home/himanshu/practice/ -Wall main.c -o main -lshared

Perintah ini mengkompilasi kode main.c dan memberi tahu gcc untuk menautkan kode dengan pustaka bersama libshared.so (dengan menggunakan flag -l) dan juga memberi tahu lokasi file bersama (dengan menggunakan flag -L).

4. Sekarang, ekspor path tempat shared library yang baru dibuat disimpan dengan menggunakan perintah berikut :

export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH

Perintah di atas mengekspor jalur ke variabel lingkungan 'LD_LIBRARY_PATH'.

5. Sekarang jalankan 'main' yang dapat dieksekusi :

# ./main

Inside add()

The result is [3]

Jadi kita melihat bahwa shared library telah dimuat dan fungsi add di dalamnya dijalankan.


Linux
  1. Cara Membuat Direktori Bersama untuk Semua Pengguna di Linux

  2. Cara menginisialisasi perpustakaan bersama di Linux

  3. Bagaimana cara membuat versi perpustakaan bersama di Linux?

  1. Cara Membuat Script Perintah Linux

  2. Cara membuat penundaan perpustakaan bersama dimuat di Linux

  3. Bagaimana cara memeriksa apakah perpustakaan bersama diinstal?

  1. Cara Memasang Pustaka Ncurses Di Linux

  2. Cara Membuat Swap di Linux

  3. Cara membuat layanan Systemd di Linux