Foundationপ্রথম নীতি থেকে
LEVEL 3 · Assembly Language

Position-Independent Code

পজিশন-ইনডিপেন্ডেন্ট কোড

এমন কোড যার internal reference সব RIP-relative (absolute ঠিকানা না) — তাই যেকোনো লোড-অ্যাড্রেসে সঠিকভাবে চলে। Shared library ও ASLR-এর ভিত্তি।

also: PIC, PIE

lea rax, [rip+offset] — absolute ঠিকানা না, বরং “এখান থেকে কত দূরে”। লাইব্রেরি যেখানেই লোড হোক, কোড আর তার target একসাথে shift হয়, দূরত্ব অপরিবর্তিত থাকে।

দুই ধরনের symbol, দুই রকম access:

internal (static):  lea rax, [rip+off]        সরাসরি, কোনো indirection নেই
external:            mov rax, [rip+got_off]     GOT-এ resolved ঠিকানা পড়া
external function:   call func@plt              PLT stub → GOT → আসল ফাংশন

GOT (Global Offset Table) — প্রতি-প্রসেস টেবিল, বাইরের প্রতিটা symbol-এর resolved absolute address ধরে রাখে, dynamic linker load-time-এ ভরে দেয়।

PLT (Procedure Linkage Table) — শুধু function-এর জন্য, একটা stub layer যা lazy binding সম্ভব করে: প্রথম call-এ resolver চলে ও GOT patch হয়, পরের প্রতিটা call সরাসরি resolved ঠিকানায় jump করে।

PIC বনাম PIE: PIC একটা কম্পাইলেশন-বৈশিষ্ট্য (-fPIC, যেকোনো .o/.so/executable-এ প্রযোজ্য); PIE একটা সম্পূর্ণ executable যেটা নিজেও .so-র মতো যেকোনো ঠিকানায় লোড হতে পারে (-fPIE -pie)। সব PIE কোড PIC, সব PIC .so PIE না।

নিরাপত্তার payoff — ASLR। কোড position-independent না হলে Address Space Layout Randomization সম্ভবই হতো না — প্রতি রানে লাইব্রেরি/executable-এর লোড-ঠিকানা randomize করা, যাতে buffer-overflow আক্রমণকারী system()-এর মতো ফাংশনের ঠিকানা নিশ্চিতভাবে অনুমান করতে না পারে। আধুনিক Linux distro-তে (gcc 6+) ডিফল্টভাবে সব executable PIE।