Ratusan sampai ribuan shared library hadir di sistem dan menunjang berbagai aplikasi yang kita gunakan. Ada yang bertugas untuk menangani internal sistem, ada yang bertugas untuk bekerja dengan hardware tertentu, menangani terminal, bekerja dengan XML dan lain sebagainya. Kita pun, tentu bisa membangun shared library sendiri, seperti yang kita bahas di tulisan ini.
Shared library merupakan salah satu cara yang digunakan untuk menjadikan program lebih modular, lebih cepat ketika kompilasi dan lebih mudah ketika update dilakukan. Suatu program dan program lainnya bisa mempergunakan satu shared library yang sama, sehingga dapat pula menghemat ruang kosong harddisk. Keuntungan lainnya, developer program bisa berkonsentrasi penuh pada program yang dibangun, tanpa harus repot-repot memikirkan fungsionalitas yang telah disediakan oleh shared library tertentu. Bagi pengguna yang terbiasa bekerja dengan Windows, shared library di Linux mirip dengan file DLL di Windows.
Dengan mudah, kita bisa mengenali shared library yang terinstall di sistem kita. Kita bisa membuka direktori /lib, atau /usr/lib, dan akan menemukan banyak sekali file dengan nama yang relatif aneh, yang umumnya diawali dengan lib dan memiliki ekstensi nama file .so.
$ ls -al /usr/lib/libncurses.so*
lrwxrwxrwx 1 root root 20 2007-06-03 20:37 /usr/lib/libncurses.so -> /lib/libncurses.so.5
lrwxrwxrwx 1 root root 17 2007-06-03 20:29 /usr/lib/libncurses.so.5 -> libncurses.so.5.5
-rwxr-xr-x 1 root root 267584 2006-02-08 12:18 /usr/lib/libncurses.so.5.5
Dari contoh tersebut, yang menampilkan pustaka ncurses, dengan nama file libncurses.so.5.5, yang tersimpan di /usr/lib, bisa kita lihat bahwa:
-
libncurses.so.5 merupakan symbolic link ke libncurses.so.5.5
-
libncurses.so merupakan symbolic link ke libncurses.so.5
Sementara, berikut ini adalah tipe file libncurses.so.5.5 menurut program file:
$ file /usr/lib/libncurses.so.5.5
/usr/lib/libncurses.so.5.5: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped
Dari keluaran program file tersebut, file libncurses.so.5.5 adalah shared object (shared library) 32 bit dengan format ELF.
Penjelasan lebih lanjut tentang nama file dan kenapa sistem symbolic link akan kita bahas di bagian detil nama shared library.
Di tulisan ini, kita akan membahas bagaimana kita membangun shared library kita sendiri, termasuk segala sesuatu yang terkait dengan penggunaan shared library.
Untuk memaksimalkan pembahasan, kita tidak akan membahas terlalu detil tentang penggunaan shared library. Pembahasan tentang penggunaan shared library telah kita lakukan pada edisi
Semua contoh di tulisan ini dibangun di atas sistem Slackware Linux 11.0, dengan GCC versi 3.4.6, namun seharusnya dapat diterapkan tanpa masalah pada sistem lainnya.
Lebih lanjut dengan nama pustaka
Sebagian besar pustaka umumnya melengkapi dirinya dengan versi mayor, versi minor dan release number. Atau, setidaknya versi mayor dan minor. Mari kita lihat kembali pustaka ncurses yang dibahas sebelumnya, yang tersimpan pada nama file libncurses.so.5.5 (direktori /usr/lib):
-
Nama file diakhiri dengan ekstensi .so (shared object), diikuti oleh versi mayor, versi minor dan release number (apabila ada). Dalam contoh ini, pustaka ncurses tersebut tidak datang dengan release number.
-
Dengan menggunakan penomoran yang jelas, kita bisa mengetahui dengan baik pustaka yang terinstall, terutama kalau pustaka tersebut dirilis cukup sering, dengan perubahan versi yang kecil-kecil.
-
Nama file lengkap suatu pustaka, kita sebut sebagai real name.
-
Ketika kita membangun suatu pustaka, kita perlu menyebutkan secara detil versi pustaka.
Selain real name, kita mengenal pula istilah soname. Soname dari pustaka ncurses sebelumnya adalah libncurses.so.5, yang merupakan symbolic link ke realname libncurses.so.5.5. Berikut ini adalah aturan soname:
-
Pola nama umumnya diawali dengan lib, diakhiri dengan .so dan .
. -
Dalam contoh ncurses tersebut, .
adalah .5. -
Ketika suatu program menyatakan membutuhkan suatu pustaka, maka program tersebut umumnya cukup menyatakan membutuhkan soname, bukan realname. Jadi, program membutuhkan libncurses.so.5, bukannya libncurses.so.5.5.
Selain realname dan soname, kita mengenal pula linker name. Linker name dari pustaka ncurses sebelumnya adalah libncurses.so, yang merupakan symbolic link ke soname libncurses.so.5. Linker name sendiri adalah symbolic link ke soname atau realname terbaru. Di contoh ini, linker name adalah symbolic ke soname.
Mekanisme penggunaan symlink seperti ini akan memudahkan proses update sistem, termasuk memudahkan pula, apabila program tertentu membutuhkan pustaka versi berbeda.
Melihat kebutuhan pustaka
Di Linux, sangat mudah bagi kita untuk melihat pustaka-pustaka apa saja yang dibutuhkan oleh suatu program. Kita cukup mempergunakan program ldd. Sebagai contoh, kita akan melihat pustaka-pustaka apa saja yang dibutuhkan program program ls (1):
$ ldd /bin/ls
linux-gate.so.1 => (0xffffe000)
librt.so.1 => /lib/tls/librt.so.1 (0xb7ed3000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7da4000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7d92000)
/lib/ld-linux.so.2 (0xb7eec000)
Bisa kita lihat bahwa program ls membutuhkan:
-
linux-gate.so.1 (akan dibahas kemudian)
-
ld-linux.so.2 (akan dibahas kemudian)
-
libc.so.6, yang merupakan pustaka mendasar sistem, yaitu pustaka C (GNU C library).
-
libpthread.so.0.
-
librt.so.1.
Bisa kita lihat, program ls membutuhkan soname dan bukannya realname. Di sistem penulis, realname dari librt.so.1 adalah librt-2.3.6.so, seperti pada keluaran perintah ls berikut:
$ ls -al /lib/tls/librt*
-rwxr-xr-x 1 root root 34763 2006-09-14 14:54 /lib/tls/librt-2.3.6.so*
lrwxrwxrwx 1 root root 14 2007-06-03 20:35 /lib/tls/librt.so.1 -> librt-2.3.6.so*
Ketika suatu program membutuhkan pustaka tertentu namun pustaka yang dibutuhkan tidak bisa ditemukan, ldd akan menampilkan not found seperti pada contoh berikut:
$ ldd ./test_matematika
linux-gate.so.1 => (0xffffe000)
libmatematika.so.0 => not found
libc.so.6 => /lib/tls/libc.so.6 (0xb7dbe000)
/lib/ld-linux.so.2 (0xb7efe000)
Dan, program tersebut pun tidak dapat dijalankan:
$ ./test_matematika
./test_matematika: error while loading shared libraries: libmatematika.so.0: cannot open shared object file: No such file or directory
Menarik bukan? Bagi Anda yang ingin melihat detil cara kerja program ldd, bukalah /usr/bin/ldd dengan text editor Anda.
Ld-linux.so.2
Ketika kita menjalankan suatu program di Linux, secara otomatis, program loader juga akan dijalankan. Program loader ini berfungsi untuk menemukan dan menjalankan semua shared library yang dibutuhkan oleh program tersebut.
Program loader di Linux, seperti pada contoh program ls sebelumnya, tersimpan pada /lib/ld-linux.so.2.
Kemanakah loader akan mencari pustaka? Kita akan membahasnya setelah ini.
Lokasi pencarian pustaka
Lokasi pustaka sistem tidak harus selalu di /usr/lib atau di /lib, melainkan di mana saja, walaupun /lib, /usr/lib dan /usr/local/lib merupakan tempat-tempat yang dikhususkan untuk pustaka.
Kita bisa mendefinisikan lokasi pustaka di file /etc/ld.so.conf. Berikut ini adalah contoh /etc/ld.so.conf di sistem penulis:
$ cat /etc/ld.so.conf
/usr/local/lib
/usr/X11R6/lib
/usr/i486-slackware-linux/lib
/opt/kde/lib
/usr/lib/qt/lib
Tambahkanlah lokasi pustaka Anda di baris baru di file ini, kemudian jalankanlah ldconfig untuk membuat cache pustaka. Cache yang dihasilkan akan disimpan di /etc/ld.so.cache, yang selanjutkan akan diload oleh program loader.
Setiap kali pustaka sistem bertambah, berkurang atau mengalami perubahan, jalankanlah program ldconfig.
Linux-gate.so.1
Ketika kita mempergunakan program ldd untuk melihat kebutuhan pustaka suatu program, ldd akan menampilkan path ke pustaka yang dibutuhkan. Namun, tidak untuk linux-gate.so.1. Bahkan, ketika kita mencari ke file sistem, kita juga tidak akan menemukan file ini.
Lantas, kalau tidak terdapat di file sistem, dimana kita bisa menemukan file ini? Dan mengapa pula kalau file tidak tersedia, ldd tidak menampilkan pesan not found?
Linux-gate.so.1 sebenarnya pemetaan ke virtual shared library yang dibuat oleh kernel. Virtual shared library digunakan untuk memilih interface terbaik untuk menjalankan system call tergantung pada CPU.
Dengan demikian, kita tidak perlu mencari keberadaan linux-gate.so.1.
Variabel untuk pencarian pustaka
Seperti disebutkan sebelumnya, lokasi pustaka didefinisikan di /etc/ld.so.conf. Sayangnya, hanya root yang berhak menulis ke file tersebut.
Bagaimana kalau suatu program membutuhkan pustaka tertentu, dimana:
-
lokasinya tidak terdaftar di /etc/ld.so.conf
-
kita tidak mungkin mengopikan pustaka tersebut ke lokasi-lokasi yang terdaftar di /etc/ld.so.conf
-
kita tidak memiliki hak root
Solusinya adalah: gunakan environment variabel LD_LIBRARY_PATH. Aturan penggunaannya sama dengan variabel PATH, yaitu direktori-direktori dideretkan dipisahkan oleh titik dua (:).
Sebagai contoh penggunaan, kita menambahkan direktori aktif (.) dan /mylib ke dalam lokasi pencarian pustaka, dengan tetap mempertahankan isi variabel LD_LIBRARY_PATH sebelumnya:
$ export LD_LIBRARY_PATH=.:/mylib:$LD_LIBRARY_PATH
LD_DEBUG
Environment Variabel yang satu ini sangat berguna ketika kita ingin melihat detil informasi yang berhubungan dengan penggunaan library.
Nilai-nilai yang bisa diassign ke variabel ini:
-
files: menampilkan file yang diproses dan pustaka apa yang dibutuhkan
-
bindings: menampilkan informasi tentang symbol binding
-
libs: menampilkan search path pustaka
-
versions: menampilkan ketergantungan versi tertentu
-
reloc: menampilkan informasi pemrosesan relokasi
-
statistics:menampilkan statistik relokasi
-
unused: menampilkan dynamic shared object yang tidak digunakan
-
all
-
help
Contoh:
$ LD_DEBUG=files /bin/ls
3127:
3127: file=librt.so.1 [0]; needed by /bin/ls [0]
3127: file=librt.so.1 [0]; generating link map
3127: dynamic: 0xb7eeaeec base: 0xb7ee4000 size: 0×0000724c
3127: entry: 0xb7ee5d60 phdr: 0xb7ee4034 phnum: 9
3127:
3127:
3127: file=libc.so.6 [0]; needed by /bin/ls [0]
3127: file=libc.so.6 [0]; generating link map
3127: dynamic: 0xb7edfd5c base: 0xb7db5000 size: 0×0012ecdc
3127: entry: 0xb7dc9f10 phdr: 0xb7db5034 phnum: 10
3127:
3127:
3127: file=libpthread.so.0 [0]; needed by /lib/tls/librt.so.1 [0]
3127: file=libpthread.so.0 [0]; generating link map
3127: dynamic: 0xb7db1ed0 base: 0xb7da3000 size: 0×000111d8
3127: entry: 0xb7da7810 phdr: 0xb7da3034 phnum: 9
3127:
3127:
3127: calling init: /lib/tls/libpthread.so.0
3127:
3127:
3127: calling init: /lib/tls/libc.so.6
3127:
3127:
3127: calling init: /lib/tls/librt.so.1
3127:
3127:
3127: initialize program: /bin/ls
3127:
3127:
3127: transferring control: /bin/ls
3127:
bin boot dev etc home lib media mnt opt proc root sbin sys tmp usr var
3127:
3127: calling fini: /lib/tls/librt.so.1 [0]
3127:
3127:
3127: calling fini: /lib/tls/libpthread.so.0 [0]
3127:
3127:
3127: calling fini: /lib/tls/libc.so.6 [0]
3127:
Mempergunakan bantuan LD_DEBUG=files, kita bisa pula mendapatkan pustaka yang dibutuhkan oleh suatu program:
$ LD_DEBUG=files /bin/ls 2> /tmp/needed
bin boot dev etc home lib media mnt opt proc root sbin sys tmp usr var
$ cat /tmp/needed | grep -i needed
3162: file=librt.so.1 [0]; needed by /bin/ls [0]
3162: file=libc.so.6 [0]; needed by /bin/ls [0]
3162: file=libpthread.so.0 [0]; needed by /lib/tls/librt.so.1 [0]
Pustaka pertama: libmyhelloworld
Berikut ini, kita akan membangun pustaka pertama kita, yang akan kita berinama libmyhelloworld. Fungsi yang bisa kita pergunakan adalah:
void myhelloworld (void);
Fungsi tersebut akan mencetak tulisan My Hello World.
Membangun shared library
Untuk membangun pustaka libmyhelloworld, pertama-tama, kita akan menyiapkan dua buah file: myhelloworld.c dan myhelloworld.h.
Berikut ini adalah isi dari myhelloworld.h:
void myhelloworld (void);
Berikut ini adalah isi dari myhelloworld.c:
#include
void myhelloworld(void)
{
fprintf (stdout, “My Hello World\n”);
}
Setelah itu, kita akan melakukan kompilasi:
$ gcc -fPIC -c myhelloworld.c
Setelah perintah ini dilakukan, kita akan mendapatkan myhelloworld.o. Opsi -fPIC akan mengenable Position Independent Code, yang dibutuhkan oleh sebuah shared library.
$ gcc -shared -Wl,-soname,libmyhelloworld.so.0 -olibmyhelloworld.so.0.0 myhelloworld.o
Setelah perintah ini dilakukan, kita akan mendapatkan libmyhelloworld.so.0.0, yang merupakan pustaka yang ingin kita bangun. Dalam proses kompilasi, kita menyebutkan soname libmyhelloworld.so.0.
Selanjutnya, seperti telah dibahas di awal tulisan, kita membuat soname berupa symlink ke realname libmyhelloworld.so.0.0:
$ ln -sf libmyhelloworld.so.0.0 libmyhelloworld.so.0
Dan, tidak lupa pula kita membuat linker name, berupa symlink ke soname libmyhelloworld.so.0:
$ ln -sf libmyhelloworld.so.0 libmyhelloworld.so
Selesai sudah. Pustaka tersebut bisa digunakan seperti halnya shared library lainnya di sistem. Anda bisa mengopikannya ke lokasi yang terdaftar di /etc/ld.so.conf atau mempergunakan variabel LD_LIBRARY_PATH.
Membangun program pengguna
Berikut ini, kita akan membangun program test_myhelloworld, yang akan mempergunakan shared library libmyhelloworld.so.0, yang kita bangun sebelumnya.
Berikut ini adalah source code test_myhelloworld.c:
#include “myhelloworld.h”
int main(void)
{
myhelloworld();
return 0;
}
Di dalam source code, kita cukup memanggil fungsi myhelloworld() yang disediakan oleh pustaka libmyhelloworld.so.0.
Selanjutnya, lakukanlah kompilasi dan link dengan perintah berikut:
$ gcc -o test_myhelloworld test_myhelloworld.c -L. -lmyhelloworld
Setelah itu, akan terbentuk sebuah program dengan nama test_myhelloworld.
Contoh output:
$ LD_LIBRARY_PATH=. ./test_myhelloworld
My Hello World
Melihat kebutuhan pustaka
$ LD_LIBRARY_PATH=. ldd test_myhelloworld
linux-gate.so.1 => (0xffffe000)
libmyhelloworld.so.0 => ./libmyhelloworld.so.0 (0xb7f34000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7df6000)
/lib/ld-linux.so.2 (0xb7f38000)
Pustaka kedua: libmatematika
Pustaka yang kedua ini lebih sedikit kompleks dan melibatkan penggunaan beberapa file source code. Berikut ini adalah fungsi yang disediakan:
double kuadrat (double x);
double lebihbesar (double x, double y);
double lebihkecil (double x, double y);
Fungsi-fungsi tersebut akan bekerja sesuai namanya: menghitung kuadrat, mencari bilangan yang lebih besar dari dua bilangan dan mencari bilangan yang lebih kecil dari dua bilangan.
Membangun shared library
Untuk membangun pustaka, kita akan menyiapkan file:
-
matematika.h, header yang akan menginclude header-header fungsi yang disediakan. Pengguna yang ingin mempergunakan libmatematika cukup menginclude file ini.
-
kuadrat.h dan kuadrat.c
-
lebihbesar.h dan lebihbesar.c
-
lebihkecil.h dan lebihkecil.c
Berikut ini adalah isi dari kuadrat.h:
double kuadrat (double x);
Berikut ini adalah isi dari kuadrat.c:
double kuadrat (double x)
{
return x * x;
};
Berikut ini adalah isi dari lebihbesar.h:
double lebihbesar (double x, double y);
Berikut ini adalah isi dari lebihbesar.c:
double lebihbesar (double x, double y)
{
if (x > y)
return x;
else if (x <>
return y;
else
return 0;
};
Berikut ini adalah isi dari lebihkecil.h:
double lebihkecil (double x, double y);
Berikut ini adalah isi dari lebihkecil.c:
double lebihkecil (double x, double y)
{
if (x <>
return x;
else if (x > y)
return y;
else
return 0;
};
Berikut ini adalah isi dari matematika.h:
#include “kuadrat.h”
#include “lebihbesar.h”
#include “lebihkecil.h”
Lakukanlah kompilasi dengan perintah-perintah berikut:
$ gcc -fPIC -c kuadrat.c
$ gcc -fPIC -c lebihbesar.c
$ gcc -fPIC -c lebihkecil.c
Setelah kompilasi, akan terbentuk object kuadrat.o, lebihbesar.o dan lebihkecil.o.
$ gcc -shared -Wl,-soname,libmatematika.so.0 -olibmatematika.so.0.0 kuadrat.o lebihbesar.o lebihkecil.o
Setelah ini, kita akan mendapatkan libmatematika.so.0.0.
Selanjutnya, kita akan membuat symlink untuk soname dan linker name:
$ ln -sf libmatematika.so.0.0 libmatematika.so.0
$ ln -sf libmatematika.so.0 libmatematika.so
Pustaka libmatematika.so.0.0 pun selesai kita buat dan bisa segera dipergunakan.
Membangun program pengguna
Berikut ini, kita akan membangun program test_matematika, yang akan mempergunakan shared library libmatematika.so.0, yang kita bangun sebelumnya.
Berikut ini adalah source code test_matematika.c:
#include
#include “matematika.h”
int main(void)
{
fprintf (stdout, “25 kuadrat = %f\n”, kuadrat(25));
fprintf (stdout, “Bilangan terbesar antara 10 dan 20 adalah %f\n”, lebihbesar(10,20));
fprintf (stdout, “Bilangan terkecil antara 10 dan 20 adalah %f\n”, lebihkecil(10,20));
return 0;
}
Selanjutnya, lakukanlah kompilasi dan link dengan perintah berikut:
$ gcc -o test_matematika test_matematika.c -L. -lmatematika
Setelah itu, akan terbentuk sebuah program dengan nama test_matematika.
Contoh output:
$ LD_LIBRARY_PATH=. ./test_matematika
25 kuadrat = 625.000000
Bilangan terbesar antara 10 dan 20 adalah 20.000000
Bilangan terkecil antara 10 dan 20 adalah 10.000000
Melihat kebutuhan pustaka
$ LD_LIBRARY_PATH=. ldd test_matematika
linux-gate.so.1 => (0xffffe000)
libmatematika.so.0 => ./libmatematika.so.0 (0xb7f2f000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7df1000)
/lib/ld-linux.so.2 (0xb7f33000)
rpath yang (mungkin) berguna
Selama ini, dalam konteks penggunaan pustaka, kita selalu memandang dari sisi pencarian pustaka oleh program loader. Dengan demikian, kita akan berbicara tentang lokasi pustaka yang ditentukan oleh /etc/ld.so.conf atau variabel LD_LIBRARY_PATH.
Sebenarnya, kita bisa pula mengatur agar lokasi pustaka dihardcode ke dalam program atau pustaka pada saat linking. Sebagai contoh, kita bisa mengatur agar lokasi pencarian di-hardcode ke direktori aktif.
Program contoh yang akan dipergunakan adalah test_matematika. Masih di direktori yang sama, kita akan melakukan kompilasi ulang agar program test_matematika selalu mencari juga ke direktori aktif:
$ gcc -Wl,-rpath,. -o test_matematika test_matematika.c -L. -lmatematika
Sebagai catatan, perbedaan dengan perintah sebelumnya adalah kita menambahkan -Wl,-rpath,. (jangan lupakan titik terakhir).
Setelah perintah ini dilakukan, program test_matematika akan dihasilkan. Berbeda dengan sebelumnya, program ini akan selalu mencari ke direktori aktif sehingga penambahan lokasi pustaka di /etc/ld.so.conf dan variabel LD_LIBRARY_PATH tidak diperlukan.
Bagi pengguna yang ingin mengetahui informasi RPATH yang dikompilasi ke dalam executable, gunakanlah program objdump dengan argumen -p. Contoh:
$ objdump -p test_matematika
test_matematika: file format elf32-i386
…
…
…
Dynamic Section:
NEEDED libmatematika.so.0
NEEDED libc.so.6
RPATH .
…
…
…
Dynamic load shared library
Semua pembahasan sebelumnya memfokuskan pada pembuatan dan penggunaan shared library secara langsung. Dengan demikian, program yang dihasilkan akan ‘membutuhkan’ shared library tertentu pada saat eksekusi. Apabila shared library tersebut tidak ditemukan, maka program tidak dapat berjalan.
Bagaimana kalau Anda membutuhkan kondisi dimana suatu pustaka adalah opsional. Apabila ada, maka akan di-load. Apabila tidak ada, program tetap dapat berjalan. Hal seperti ini mirip dengan konsep plugin, dimana suatu pustaka diload hanya kalau dibutuhkan saja.
Untuk memungkinkan hal ini terjadi, kita akan membaca shared library secara dynamic load. Caranya sedikit lebih repot dari contoh penggunaan sebelumnya.
Pustaka contoh yang dipergunakan adalah libmatematika.so.0. Program contoh yang akan membuka pustaka secara dynamic akan disimpan pada dl_test_matematika.c:
#include
#include
int main(void)
{
void *handle_matematika;
double (*kuadrat) (double);
double (*lebihbesar) (double,double);
double (*lebihkecil) (double,double);
handle_matematika = dlopen(”./libmatematika.so”, RTLD_LAZY);
kuadrat = dlsym(handle_matematika, “kuadrat”);
lebihbesar = dlsym(handle_matematika, “lebihbesar”);
lebihkecil = dlsym(handle_matematika, “lebihkecil”);
fprintf (stdout, “25 kuadrat = %f\n”, (*kuadrat)(25));
fprintf (stdout, “Bilangan terbesar antara 10 dan 20 adalah %f\n”, (*lebihbesar) (10,20));
fprintf (stdout, “Bilangan terkecil antara 10 dan 20 adalah %f\n”, (*lebihkecil) (10,20));
dlclose (handle_matematika);
return 0;
}
Penjelasan:
-
Kita tidak mempergunakan matematika.h karena akan melakukan loading secara dynamic. Untuk itu, kita membutuhkan header dlfcn.h.
-
Kita menyiapkan beberapa struktur data untuk handle pustaka dan fungsi yang ingin dipergunakan:
void *handle_matematika;
double (*kuadrat) (double);
double (*lebihbesar) (double,double);
double (*lebihkecil) (double,double);
-
Dengan dlopen(), kita bisa membuka pustaka secara dynamic:
handle_matematika = dlopen(”./libmatematika.so”, RTLD_LAZY);
-
Selanjutnya, setelah pustaka dibuka, kita bisa merujuk ke fungsi yang dibutuhkan dengan dlsym():
kuadrat = dlsym(handle_matematika, “kuadrat”);
lebihbesar = dlsym(handle_matematika, “lebihbesar”);
lebihkecil = dlsym(handle_matematika, “lebihkecil”);
-
Dan, mempergunakan struktur data yang telah disiapkan sebelumnya, kita bisa mempergunakan fungsi yang telah dirujuk:
fprintf (stdout, “25 kuadrat = %f\n”, (*kuadrat)(25));
-
Setelah menggunakan, kita menutup dengan dlclose()
dlclose (handle_matematika);
Lakukanlah kompilasi dengan perintah berikut ini:
$ gcc -o dl_test_matematika dl_test_matematika.c -ldl
Program ldd tidak menampilkan bahwa kita membutuhkan libmatematika.so.0:
$ ldd dl_test_matematika
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/tls/libdl.so.2 (0xb7f71000)
libc.so.6 => /lib/tls/libc.so.6 (0xb7e42000)
/lib/ld-linux.so.2 (0xb7f86000)
Namun, program tetap dapat mempergunakan fungsionalitas libmatematika.so.0:
$ ./dl_test_matematika
25 kuadrat = 625.000000
Bilangan terbesar antara 10 dan 20 adalah 20.000000
Bilangan terkecil antara 10 dan 20 adalah 10.000000
Seru bukan?
Sampai di sini dulu pembahasan kita. Sampai ketemu di kesempatan lainnya. Selamat mengembangkan!
Judul Artikel: Membangun shared library sendiri
- Penulis : Noprianto
- Tanggal Terbit : 04 February, 2008