Cara Membuat Shared Library - Unix Programming

May 21, 2016 9:02 AM

 ▄████▄   ██▓     ██▓ ▄▄▄▄  
▒██▀ ▀█  ▓██▒    ▓██▒▓█████▄
▒▓█    ▄ ▒██░    ▒██▒▒██▒ ▄██
▒▓▓▄ ▄██▒▒██░    ░██░▒██░█▀ 
▒ ▓███▀ ░░██████▒░██░░▓█  ▀█▓
░ ░▒ ▒  ░░ ▒░▓  ░░▓  ░▒▓███▀▒
  ░  ▒   ░ ░ ▒  ░ ▒ ░▒░▒   ░
░          ░ ░    ▒ ░ ░    ░
░ ░          ░  ░ ░   ░     
░                          ░ 

Dalam pemrograman bahasa C di environment Unix, Shared library adalah rangkaian objek yang diproduksi oleh kompiler. Cara yang digunakan untuk berkomunikasi antara file objek (library) dengan file utama sangat berbeda dengan static library. Semua alamat referensi variabel dan fungsi di memori berifat relatif yang mengijinkan shared module agar bisa di-load secara dinamis ketika program dijalankan. Untuk memberikan gambaran tentang pembahasan ini saya masih akan menggunakan program yang dibuat sebelumnya yaitu lib1.c, lib2.c dan my_messg.c.

Kemudian untuk cara kompilasinya sebagai berikut:

% cc -Wall -Werror -c -fpic lib1.c lib2.c
% ls *.o
lib1.o lib2.o

Opsi -c akan menyebabkan kompiler untuk membuat file objek .o dan opsi -fpic akan menyebabkan kompiler membangkitkan output objek module menggunakan relokasi pengalamatan. Di bawah ini menggunakan file objek .o untuk membentuk library messg.so:

% cc -Wall -Werror -shared lib1.o lib2.o -o messg.so
% ls *.so
messg.so

Opsi -o di atas digunakan untuk membentuk library messg.so yang akan di-link ke shared library. Ketika melakukan linking, sistem linker menggunakan fungsi main() dalam me-linkan file objek. Namun di file lib1.c dan lib2.c tidak ada fungsi main(), untuk mengatasi error yang disebabkan oleh hal tersebut, maka kompiler menggunakan opsi -shared untuk mengatasi pesan error. Dua perintah kompilasi di atas dapat digabungkan menjadi satu dan module dapat dikompilasi serta disimpan di library dengan perintah berikut:

% cc -Wall -Werror -fpic -shared lib1.o lib2.o -o libmesg.so
% *.so
messg.so my_new_messg.so

Langkah terakhir, menggabungkan dengan file utama my_messg.c:

% cc -Wall -Werror my_messg.c libmsg.so -o message

Untuk menjalankannya, library libmsg.so harus diload terlebih dahulu saat runtime.

0x07. Atribut
C memiliki atribut-atribut yang dapat ditambahkan ke deklarasi fungsi maupun deklarasi variabel. Penggunaan atribut-atribut ini dimaksudkan agar memungkinkan bagi kompiler untuk menjalankan optimasi. Atribut ditambahkan di deklarasi fungsi maupun variabel seperti contoh berikut:

char *err_status(int) __attribute__ ((always_inline));


char *err_status(int errnum) {
switch (errnum) {
case 0: return (“normal”);
case 1: return (“fatal”);
default: return (“unknown error”);
}
}

Pada contoh di atas, penggunaan atribut always_inline akan menyebabkan fungsi err_status() akan ditambahkan sebagai kode inline, bahkan ketika kompilasi tidak ada rincian optimasi yang disertakan.

Lebih dari satu atribut dapat ditambahkan, caranya dengan menambakan tanda koma sebagai pemisah antar atribut. Contohya, di bawah ini ada dua buah atribut yang mana atribut pertama pure yang menjamin bahwa kompiler tidak akan memodifikasi variabel global dan atribut kedua noinline yang tidak akan pernah menjadikan fungsi menjadi kode inline.

int get_limit() __attribute__ ((pure, noinline));

Atribut tidak hanya di berikan untuk fungsi. Variabel juga dapat menggunakan atribut. Bahkan variabel yang terkurung di dalam struct pun bisa.


u_char my_id_num;
int finger_print __attribute__ ((align(6)));

struct file {
char *name[];
int octal_permission;
int file_size;

};

0 comments:

Article list :