Sistem Dlopen Linux di C

Sistem Dlopen Linux Di C



Fungsi library dlopen() adalah fungsi yang sangat berguna dalam bahasa C. Fungsi memuat perpustakaan ke dalam memori setelah membuka yang baru. Kami biasanya menggunakannya untuk memuat simbol perpustakaan yang tidak diketahui pada waktu kompilasi. Dlopen() adalah fungsi yang digunakan dalam program kita. Pustaka DL mengimplementasikan dlopen(), yang didefinisikan dalam Dlfcn.h. Dua parameter diperlukan untuk fungsi dlopen: nama file library dan flag. Nama file adalah pustaka dinamis, dan ini menentukan apakah dependensi pustaka langsung dihitung atau tidak. Dlopen() mengembalikan 'pegangan' yang harus dianggap sebagai nilai buram dan operasi perpustakaan DL lainnya menggunakan ini. Jika upaya memuat tidak berhasil, dlopen() mengembalikan NULL. Tetapi dlopen() mengembalikan pegangan file yang sama jika memuat pustaka yang sama berkali-kali.

Saat menggunakan fungsi dlopen, kompiler tidak memeriksa potensi kesalahan karena tidak mengetahui jenis dan prototipe yang kita gunakan. Penyebaran fungsi dlopen untuk pemuatan standar tampaknya tidak dipromosikan olehnya, kecuali untuk beberapa situasi kecil. Omong-omong, ini adalah pendekatan untuk meningkatkan introspeksi. Ketika modul bersama sedang digunakan oleh program lain, pengoptimalan tata letak memori tidak terlalu tertarik pada pemuatan bersyarat. Jejak memori tidak bertambah saat pustaka yang digunakan sebelumnya dimuat. Menghindari pemantauan kompiler berbahaya dan menghasilkan penulisan bug yang baik. Selain itu, kami tidak memiliki kemungkinan pengoptimalan kompiler.

Contoh 1:

Sekarang, perhatikan contoh berikut untuk melihat fungsionalitas fungsi dlopen dalam bahasa C. Pada langkah pertama, kami memuat beberapa pustaka standar C. Di sini, kita memuat library baru “dlfcn.h” yang digunakan untuk mendefinisikan makro saat membangun argumen mode dlopen.







Kemudian, kami memperkenalkan perpustakaan lain di dalam program kami 'gnu/lib-name.h'. File perpustakaan bersama yang disertakan dengan GNU libc ditemukan oleh program pengguna sesuai dengan makro yang ditentukannya. Perpustakaan GNU C menawarkan perpustakaan dasar untuk sistem operasi GNU dan GNU/Linux serta berbagai sistem berbasis Linux lainnya. Setelah itu, kami memiliki implementasi metode utama. Di dalamnya, kita mendeklarasikan objek pointer 'handle' dengan kata kunci void. Kami mendeklarasikan fungsi pointer sinus yang memiliki tipe data ganda. Ada deklarasi lain dari objek penunjuk 'kesalahan' untuk penanganan kesalahan.



Setelah itu, kita memanggil fungsi dlopen di dalam objek 'handle'. Dlopen mengambil dua argumen: LIBM_SO dan “RTLD_LAZY”. Di sini, 'LIBM_SO' adalah nama file perpustakaan yang menyediakan fungsi matematika seperti fungsi trigonometri. Pustaka bersama ini diperlukan karena kami menggunakan fungsi sinus. 'RTLD_LAZY' adalah argumen lain yang memanggil fungsi dlopen. Ketika simbol yang diberikan direferensikan pertama kali, relokasi harus dilakukan pada waktu yang ditentukan oleh implementasi.



Karena proses mungkin tidak mereferensikan setiap simbol dalam file objek yang dapat dieksekusi, menentukan RTLD LAZY harus meningkatkan kinerja pada implementasi yang memungkinkan pengikatan simbol dinamis. Selanjutnya, kita memiliki kondisi if-else untuk penanganan error ketika objek handle gagal menjalankan fungsi dlopen. Kami memanggil dlerror untuk menghapus kesalahan.





Fungsi dlerror() menyediakan string diakhiri null yang dapat dibaca manusia dan menetapkan pelaporan kesalahan terbaru yang disebabkan oleh panggilan ke salah satu panggilan API dlopen sejak panggilan dlerror terakhir. Kemudian, kita buat fungsi seperti ini: “(*void**)(&sine)= dlsym(handle, sin)”. Karena ini aneh, casting mematuhi ISO C yang menghindari peringatan dari kompiler. Kami menggunakan fungsi dlsym yang mendapatkan jalur simbol yang ditentukan di dalam modul tautan dinamis yang dapat diakses melalui fungsi dlopen().

Juga, kami melakukan operasi if-else lagi untuk kesalahan standar yang dihasilkan ketika dlerror() bukan NULL. Kemudian, kami memiliki pernyataan printf di mana kami menentukan nilai sinus yang akan dihitung. Pada langkah terakhir, kita menutup objek bersama itu dengan memanggil dlclose untuk pegangan yang dikembalikan oleh dlopen().



#sertakan
#sertakan
#sertakan
#include

ke dalam
utama ( ke dalam argc , arang ** argv )
{
ruang kosong * menangani ;
dobel ( * milik mereka ) ( dobel ) ;
arang * kesalahan ;

menangani = jatuh ( LIBM_SO , RTLD_LAZY ) ;
jika ( ! menangani ) {
fprintf ( stderr , '%s \n ' , kesalahan ( ) ) ;
KELUAR ( EXIT_FAILURE ) ;
}
kesalahan ( ) ;

* ( ruang kosong ** ) ( & milik mereka ) = dlsym ( menangani , 'tanpa' ) ;

jika ( ( kesalahan = kesalahan ( ) ) != BATAL ) {
fprintf ( stderr , '%s \n ' , kesalahan ) ;
KELUAR ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' , ( * milik mereka ) ( 4.0 ) ) ;
dlclose ( menangani ) ;
KELUAR ( EXIT_SUCCESS ) ;
}

Kami menggunakan opsi -ldl dengan perintah kompilasi C karena ini adalah pustaka untuk antarmuka tertaut dlopen dan diperlukan. Ketika eksekusi file dlopen dibuat, ini menampilkan nilai sinus dari nilai yang diberikan sebelumnya.

Contoh 2:

Sekarang, kita ambil contoh lain dari penggunaan fungsi dlopen. Kami memuat program kami dengan semua pustaka C yang diperlukan untuk implementasi kode dlopen. Kemudian, kami memulai program kami di dalam metode utama. Di sini, kita mendefinisikan string dengan deklarasi variabel 'src'. Kami kemudian mendeklarasikan variabel pointer 'strlen', 'handle' dan 'error'.

Selanjutnya, kita memanggil variabel handle dan menerapkan fungsi dlopen. Fungsi dlopen memasukkan pustaka bersama “libstr.so” untuk fungsi penanganan string dan flag “RTLD_LAZY” yang sudah ditunjukkan pada contoh sebelumnya. Kami memanggil fungsi dlerror di dalam variabel 'kesalahan' untuk menghapus kesalahan yang dihasilkan oleh fungsi dlopen. If-else digunakan untuk memeriksa kesalahan.

Kemudian, kami mendapatkan alamat fungsi strlen menggunakan fungsi dlsym dan memverifikasi kesalahan saat melakukan ini. Setelah ini, kami menggunakan fungsi printf untuk memanggil fungsi strnlen untuk mengembalikan panjang string yang diberikan. Pada akhirnya, kami menutup perpustakaan bersama dengan fungsi dlclose.

#sertakan
#sertakan
#sertakan
#include
ke dalam utama ( ruang kosong )
{
arang * src = 'Halo Linux' ;
ke dalam ( * strlen ) ( konstan arang * ) ;
ruang kosong * menangani ;
arang * kesalahan ;


menangani = jatuh ( './libstr.so' , RTLD_LAZY ) ;
kesalahan = kesalahan ( ) ;
jika ( ! menangani || kesalahan != BATAL ) { printf ( 'Upaya Memuat Perpustakaan Gagal! \n %s \n ' , kesalahan ) ;
kembali - 1 ; }

strlen = dlsym ( menangani , 'stren' ) ;
kesalahan = kesalahan ( ) ;
jika ( ! strlen || kesalahan == BATAL ) { printf ( '%s \n ' , kesalahan ) ; kembali - 1 ; }

printf ( 'Panjang String adalah:%d \n ' , strlen ( src ) ) ;
dlclose ( menangani ) ;
kembali 0 ;
}

Kami menggunakan perintah berikut untuk menjalankan program yang diberikan. Di sini, flag -lstr digunakan untuk fungsi panjang string dan ldl digunakan untuk file library dlopen. Program yang dikompilasi memberikan panjang string seperti yang ditunjukkan pada shell:

Kesimpulan

Informasi disediakan mengenai fungsi dlopen bahasa C dalam artikel ini. Kami memiliki pengenalan singkat tentang fungsi dlopen. Kemudian, kami menerapkan dua contoh. Fungsi mengembalikan pengidentifikasi yang mendefinisikan perpustakaan yang dibuka. Alamat fungsi di dalam pustaka yang dibuka kemudian ditentukan menggunakan pengenal ini dan fungsi dlsym. Alamat fungsi dalam perpustakaan yang telah dibuka menggunakan dlopen dapat ditemukan menggunakan fungsi dlsym.