Lompat ke konten Lompat ke sidebar Lompat ke footer

Linker Bahasa C dan Fungsinya

Ketika melakukan kompilasi program, kompilator akan mengeksport setiap simbol global menuju ke assembler apakah termasuk kategori yang kuat atau lemah, selanjutnya assembler melakukan encode informasi tersebut secara implisit dalam tabel simbol dari file object relokasi. Fungsi dan inisialisasi variabel global akan mendapatkan simbol yang kuat. Sedangkan variabel global yang tidak diinisialisasi akan mendapatkan simbol yang lemah. Untuk lebih memahami pendefinisian ini perhatikan contoh program berikut ini.


Sebelum mempelajari materi tentang Linker Bahasa C dan Fungsinya, terlebih dahulu pelajari materi tentang: Keyword Variabel Bahasa C dan Fungsinya, Scope Variabel Bahasa C dan Fungsinya, dan Aturan Penggunaan Scope Bahasa C dan Fungsinya.

Dalam pengembangan perangkat lunak menggunakan Bahasa C, proses penyusunan dan penyuntingan kode melibatkan beberapa tahapan, salah satunya adalah linker. Linker merupakan komponen penting dalam rangkaian alat pengembangan perangkat lunak yang bertanggung jawab untuk menggabungkan berbagai bagian program menjadi satu kesatuan yang dapat dieksekusi. Artikel ini akan membahas peran, fungsi, dan pentingnya linker dalam Bahasa C.

Pengertian

Linker adalah program yang berfungsi menggabungkan modul-modul atau file objek menjadi satu program yang dapat dieksekusi. Proses ini dikenal sebagai linking atau peny-link-an. Linker memeriksa dan menyesuaikan referensi variabel dan fungsi antar file objek, menyusunnya menjadi bentuk yang dapat dieksekusi, dan menangani alamat memori yang diperlukan untuk program tersebut.

Peran dan Fungsi Linker:
  • Resolving External References: Linker mengatasi referensi eksternal antar file objek. Jika suatu fungsi atau variabel dideklarasikan di satu file objek tetapi diimplementasikan di file objek lain, linker akan memastikan bahwa referensi tersebut terhubung dengan implementasinya.
  • Menggabungkan File Objek: Linker menggabungkan semua file objek yang dihasilkan oleh proses kompilasi menjadi satu executable atau shared object. Ini melibatkan penyusunan berbagai fungsi dan variabel ke dalam satu kesatuan yang dapat dieksekusi.
  • Penanganan Simbol: Linker mengelola tabel simbol yang berisi informasi tentang fungsi dan variabel yang digunakan dalam program. Tabel ini membantu dalam penentuan alamat memori yang tepat untuk setiap simbol.
  • Pemberian Alamat Memori: Linker memberikan alamat memori absolut untuk setiap instruksi dan data dalam program. Ini melibatkan penentuan lokasi relatif terhadap awal program di memori.
  • Penggabungan Libraries: Linker dapat menggabungkan libraries yang di-link secara statis atau dinamis. Libraries ini berisi fungsi-fungsi yang dapat digunakan oleh program dan dihubungkan selama proses linking.
  • Penanganan Dynamic Linking: Dalam dynamic linking, linker mempersiapkan program untuk bekerja dengan shared libraries atau dynamic-link libraries (DLL). Linker dinamis melakukan linking saat program dijalankan, memungkinkan berbagi sumber daya antar program.

Contoh:

/* fungsi main.c */

void swap();

int buf[2] = {1, 2};

 

int main()

{

swap();

return 0;

}

 

/* fungsi swap.c */

extern int buf[];

 

int *bufp0 = &buf[0];

int *bufp1;

 

void swap()

{

int temp;

 

bufp1 = &buf[1];

temp = *bufp0;

*bufp0 = *bufp1;

*bufp1 = temp;

}


Tentukan apakah simbol berikut ini termasuk simbol yang kuat atau lemah, Unix Linker menggunakan aturan berikut ini untuk beurusan dengan banyak simbol yang didefinisikan:
  • Aturan satu: Multiple strong simbol dengan nama variabel sama tidak dibolehkan.
  • Aturan dua: Jika diberikan strong simbol dan weak simbol, maka yang dipilih adalah strong simbol.
  • Aturan tiga: Jika diberikan banyak weak simbol, pilih salah satu dari weak simbol apapun. Contohnya, misalnya akan berupaya untuk mengkompilasi dan menautkan dua modul bahasa C berikut ini:
    • /* foo1.c */ int main() {return 0; }
    • /* bar1.c */ int main(){return 0;}

Pada contoh program sebelumnya, akan dihasilkan pesan error karena strong simbol main didefinsikan lebih dari satu kali (aturan satu).

Contoh:

/* foo1.c */

int main()

{

return 0;

} 


/* bar1.c */

int main()

{

return 0;

}


Dengan hasil yang sama, akan dihasilkan pesan error dari modul berikut karena strong simbol x didefinisikan dua kali (aturan satu).

Contoh:

/* foo2.c */

int x = 15213;

int main()

{

return 0;

}

  

/* bar2.c */

int x = 15213;

void f()

{}


Namun demikian, jika x tidak diinisialisasi dalam satu modul, maka linker akan memilih strong simbol yang didefinisikan pada (aturan dua) modul lainnya seperti contoh program berikut ini.

Baca Juga:

Contoh:

/* foo3.c */

#include <stdio.h>

 

void f(void);

int x = 15213;

 

int main()

{

f();

printf("x = %d\n", x);

return 0;

}

 

/* bar3.c */

int x;

 

void f()

{

x = 15212;

}


Saat waktu running program, fungsi f() mengubah nilai dari x yang awalnya 15213 menjadi 15212, yang mungkin saja tidak diterima oleh author dari fungsi main. catatan, bahwa linker umumnya tidak memberikan indikasi bahwa telah mendeteksi definisi ganda dari x.

Contoh: Hal serupa juga dapat terjadi jika terdapat dua definisi weak dari x (aturan 3).

/*a.c*/

#include <stdio.h>

void b(void);

 

int x;

int main()

{

x = 2016;

b();

printf("x = %d ",x);

return 0;

}

 

/*b.c*/

#include <stdio.h>

int x;

 

void b()

{

x = 2017;

}


Penerapan aturan dua dan aturan tiga dapat mengakibatkan bug runtime yang berbahaya yang tidak inconferehensif bagi para programmer, khususnya jika terjadi pendefinisikan duplikasi simbol pada tipe yang berbeda Contoh; x didefinisikan sebagai int pada modul satu dan juga didefinisikan pada modul yang lainnya.

Contoh:

/*a.c*/

#include <stdio.h>

void b(void);

 

int x = 2016;

int y = 2017;

 

int main()

{

b();

printf("x = 0x%x y = 0x"

"%x \n", x, y);

return 0;

}

 

/*b.c*/

double x;

 

void b()

{

x = -0.0;

}


Program yang telah dibuat tersebut telah menghasilkan bug, khususnya karena bug tersebut sulit dideteksi, karena tidak ada pesan warning dari sistem kompilasi, dan juga bug tersebut tetap dapat muncul pada bagian program lainnya, jauh dari tempat kemunculan awal dari bug tersebut. Pada program dengan skala yang lebih luas jenis bug yang telah diciptakan seperti ini akan jauh lebih sulit lagi untuk dideteksi, khususnya karena banyak programmer tidak antisipasi terhadap bagaimana linker bekerja. Tanpa ragu, seorang programmer memanggil linker dengan flag seperti gcc -fno-common flag, yang dapat men-trigger error dalam multi definisi simbol yang global.

Langkah-langkah Proses Linking dalam Bahasa C:
  • Preprocessing: Proses dimulai dengan pra-pemrosesan (preprocessing) terhadap file kode sumber. Ini melibatkan penggantian macros, pengelompokan header, dan penghilangan komentar.
  • Compiling: File kode sumber kemudian di-compile untuk menghasilkan file objek. Setiap file objek berisi kode mesin yang sesuai dengan satu modul atau unit program.
  • Linking: Selama linking, linker mengambil file objek dan menggabungkannya menjadi satu program yang dapat dieksekusi atau shared object. Referensi antar file objek diatasi, dan alamat memori diberikan.
  • Dynamic Linking (Opsional): Jika dynamic linking digunakan, linker dinamis dapat memproses shared libraries dan menghasilkan dynamic-link libraries (DLL) yang diperlukan untuk program.
  • Output: Hasil akhir dari proses linking adalah file eksekusi atau shared object, siap untuk dieksekusi atau dijalankan bersama dengan program lain.

Keuntungan Penggunaan Linker dalam Bahasa C:
  • Pengelolaan Kode yang Modular: Linker memungkinkan pengelolaan kode yang modular. Program dapat dibagi menjadi file objek terpisah, memudahkan pengembangan dan pemeliharaan.
  • Pemisahan Implementasi dan Deklarasi: Linker memungkinkan pemisahan antara implementasi (di file objek) dan deklarasi (di header files) suatu fungsi atau variabel. Hal ini mendukung konsep pemrograman berorientasi objek.
  • Pemanfaatan Libraries: Linker memungkinkan pemanfaatan libraries, baik secara statis maupun dinamis. Ini mengurangi redundansi dan meningkatkan efisiensi penggunaan memori.
  • Dukungan untuk Pengembangan Besar: Linker memfasilitasi pengembangan besar dan kolaborasi tim pengembang dengan memungkinkan integrasi modul-modul yang berbeda.
  • Optimasi Kode: Linker dapat melakukan beberapa optimasi kode, seperti eliminasi kode mati atau penyusunan ulang instruksi untuk meningkatkan performa program.

Referensi Tambahan:

Artikel ini didedikasikan kepada: Achvirilia Eka Hastuti, Agung Pranoto, Aisyah Harum, Amalia Ayu Rizkiani, dan Anggita Ragil Subekti.

5 komentar untuk "Linker Bahasa C dan Fungsinya"

  1. Apa yang dimaksud dengan linker?

    BalasHapus
    Balasan
    1. Dalam dunia komputasi atau pemrograman komputer, linker atau editor link adalah program sistem komputer yang mengambil satu atau lebih objek file yang dihasilkan oleh sebuah kompilator atau assembler dan menggabungkannya menjadi satu file baru yang dapat eksekusi oleh mesin berupa file library, atau file objek lainnya.

      Hapus
  2. Apa yang dimaksud dengan linker dan loader pada bahasa C?

    BalasHapus
    Balasan
    1. Linker merupakan objek yang menggabungkan satu atau lebih objek file beserta beberapa kode library yang diubah menjadi beberapa objek baru atau library baru yang dapat dieksekusi.

      Sedangkan loader merupakan sebuah pembaca kode program yang kemudian mengeksekusinya ke dalam sebuah memori, juga dapat melakukan beberapa penerjemahan alamat dan dapat menjalankan program ataupun menampilkan pesan kesalahan atau error tertentu.

      Hapus
    2. Linker mengambil masukkan kode dari sebuah objek yang dihasilkan oleh kompilator atau assembler. Sedangkan loader mengambil masukkan daril file yang dapat dieksekusi yang dihasilkan oleh linker.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -