Matur Nuwun Sampun Mampir Mugi-Mugi Saget Dados Ilmu Ingkang Manfaat Fiddunya Wal Akherat

Minggu, 27 Juli 2008

Membangun shared library sendiri

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., dan kemudian terdapat beberapa symbolic link ke file tersebut dengan awalan nama yang sama, namun dengan ekstensi yang lebih sederhana. Sebagai contoh:

$ 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!

0 komentar:


Silakan Bekomentar.!!!


Semakin banyak berkomentar, semakin banyak backlink, semakin cinta Search Engine terhadap blog anda
:a:
:b:
:c:
:1: :2: :3: :4: :5: :6:
:7: :8: :9: :10: :11: :12:

Posting Komentar

Tinggalkan Pesan

Get cash from your website. Sign up as affiliate.Join 4Shared Now! affiliate program

EARN CASH FROM YOUR SITE

Turn your valuable site visitors into income. Work online and join our free money making partner program. We offer the most commission rate to help maximize your income stream.

Join our money making program absolutely no charge and 100% risk free.

Sign Up...

Mountain a constant stream of money

Our money making system helps you to establish a constant stream of cash, 24 hours a day, 7 days a week, 365 days a year. Allowing you more time to focus on the things you love. You'll even receive money while you sleep!

Start receiving steady affiliate revenue

This money earn program really can make you profit on the same day. Start collecting serious partner income with almost no effort at all. This is a serious revenue opportunity, the first step for you to build a steady, reliable, long-time profitable business.

A constant money generator

Imagine running of a something that never failed to provide you with income-flow. A earning money program so amazingly profitable that you never had to work for a boss ever again!

Lotta Rewards Lotta Rewards