Linker
লিংকার
একাধিক object file আর library জুড়ে সব undefined symbol resolve করে একটা executable বা shared library বানায় — static (কোড embed) বা dynamic (runtime dependency) দুইভাবে।
কাজ: symbol resolution। প্রতিটা .o-এর undefined symbol (nm-এ U)
খুঁজে বের করে কোথায় সংজ্ঞায়িত, সেই relocation entry পূরণ করা।
gcc main.o square.o -o prog # ld চালায় ভেতরে — main.o-এর U square,
# square.o-তে খুঁজে পায়, ঠিকানা বসায়
“Undefined reference to X” error মানেই linker কোথাও X-এর সংজ্ঞা
খুঁজে পায়নি — একটা .o/library বাদ পড়েছে link কমান্ডে।
Static বনাম dynamic:
| Static | Dynamic | |
|---|---|---|
| Library code | executable-এ কপি | রেফারেন্স মাত্র |
| আকার | বড় | ছোট |
| Runtime dependency | নেই | আছে (.so) |
Static library (.a, ar দিয়ে বানানো) থেকে linker শুধু দরকারি member
.o টানে — সরাসরি .o দিলে সবটা যায়, কিন্তু library-র ভেতরের member
selective। তাই library সবসময় সেই ফাইলের পরে রাখতে হয় যা তার symbol
ব্যবহার করে (gcc main.o -lfoo, উল্টো না)।
Dynamic linking-এ resolution তিন স্তরে ভাগ হতে পারে — link time (static), load time ([[loader]] চলার সময়), অথবা run time (lazy binding, PLT/GOT দিয়ে প্রথম call-এই resolve, বাকিতে না)।