Linker teen sets maintain karta hai jab woh inputs ko left → right scan karta hai:
E — object files ka set jo executable mein jaayenge.
U — abhi ke undefined symbols ka set.
D — E mein files dwara pehle se define kiye gaye symbols ka set.
Sabse zaroori clause: archive ko sirf us U ke against search kiya jaata hai jo linker ke
us tak pahunchne par exist karta hai. Symbols jo baad mein undefined ban jaate hain (kyunki
koi object aur right mein hai) woh abhi U mein nahi the, isliye archive — jo pehle hi pass ho
chuka hai — dobara kabhi nahi dekha jaata.
Consequence (woh rule jo yaad karna hai):
Objects pehle daalo, phir libraries; aur library ko us har object ke baad daalo jo use
karta hai. Agar library A, library B use karti hai, toh ... A B likho (user, phir dependency).
Recall Feynman: ek 12-saal ke bacche ko explain karo
Socho tum ek hallway mein lockers ke aage se ek baar guzar ke school bag pack kar rahe ho,
kabhi peeche nahi mudna. Jab bhi koi note milta hai "mujhe ek red pen chahiye," tum agle
locker se red pen uthate ho jisme woh ho. Lekin agar tum pens se bhare locker tak pahunch jaate
ho pehle koi maange bina, tum seedha aage nikal jaate ho — tum sirf wahi uthate ho jo kisi ne
pehle hi maanga ho. Toh agar jis bacche ko pen chahiye woh pen locker se aage hallway mein
hai, use kabhi pen nahi milega. Lesson: maangne waale ko dene waale se pehle rakho.
Traditional Unix linker apni command line kis direction mein scan karta hai, aur kitni baar?
Left to right, ek single pass (objects/archives ek baar process hote hain; sirf --start-group ya repeat karna re-scan force karta hai).
Linker resolution ke dauran teen sets kya maintain karta hai?
E (executable mein jaane wale objects), U (abhi ke undefined symbols), D (pehle se define kiye gaye symbols).
Static archive .a ka koi member link mein kab pull hota hai?
Sirf agar, linker ke archive tak pahunchne ke waqt, woh member U mein currently koi symbol define karta ho (undefined).
gcc -lm main.o fail kyun hota hai jabke gcc main.o -lm kaam karta hai?
Pehle -lm par, U khaali hai isliye sqrt.o pull nahi hota; main.o baad mein sqrt undefined banata hai lekin libm pehle hi pass ho chuka hai. Objects libraries se pehle aane chahiye jo unhe use karte hain.
Link line par libraries rakhne ka general rule?
Objects pehle, phir libraries; har library us har object/library ke baad jo usse depend karta hai (user provider se pehle).
Do static libraries ke beech circular dependency kaise resolve karte hain?
Ek library repeat karo (-lfoo -lbar -lfoo) ya inhe -Wl,--start-group ... -Wl,--end-group mein wrap karo taaki repeated scanning force ho.
--whole-archive kya karta hai aur iske zaroorat kyun hai?
Archive ke har member ko link hone ke liye force karta hai, chahe reference ho ya na ho — tab zaroori hota hai jab kisi member ke side effects hote hain (jaise ek constructor) lekin koi referenced symbol nahi hota.
Multiple definitions ke liye strong vs weak symbol rule?
Ek strong + kai weak → strong definition silently choose hoti hai; do strong → multiple-definition error. (-fno-common tentative globals ko errors banata hai.)