में विफल नहीं हुआ मैं एक librandom.so
पुस्तकालय और एक main
exectuable जो इस प्रकार संकलित किया गया है:
$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"
वे एक ही निर्देशिका में दोनों कर रहे हैं। चूंकि main
में $ORIGIN
है rpath
में, यह ठीक काम करता है - ./main
त्रुटियों के बिना रिटर्न देता है।
अब, मैं setuid
रूप root
साथ चलाने के लिए main
सेट कर रहा हूं:
$ sudo chown root main
$ sudo chmod a+s main
$ ./main
मैं main
उम्मीद $ORIGIN
के बाद से विफल setuid
अनुप्रयोगों में विस्तार नहीं है। आश्चर्य की बात है, यह काम करता है।
अगर मैं एक और निर्देशिका से main
चलाने, हालांकि, यह असफल अपेक्षा के अनुरूप कार्य करता है:
$ cd /tmp
$ /path/to/main
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory
यह क्यों काम करता है जब मैं अपने युक्त निर्देशिका से main
चला सकता हूँ?
दूसरे हिस्सों के संबंध में - मैं फ़ाइल को नहीं ले रहा हूं, बस वर्तमान निर्देशिका। '$ ORIGIN' निष्पादन योग्य के स्थान से संबंधित है, वर्तमान कार्यशील निर्देशिका नहीं। –
दाएं। ऐसा लगता है कि उबंटू ग्लिबैक पैच के संस्करण का उपयोग करता है जो खाली स्ट्रिंग के लिए '$ ओरिजिन' का विस्तार करता है (उदाहरण के लिए [इस टिप्पणी] में वर्णित है (https://sourceware.org/bugzilla/show_bug.cgi?id=12393#c0))। डायनामिक लिंकर तब इसे सीडब्ल्यूडी के रूप में पेश करेगा जो व्यवहार की व्याख्या करेगा। आप शायद [डेवलपर्स को इसकी रिपोर्ट कर सकते हैं] (https://bugs.launchpad.net/ubuntu/) लेकिन मुझे संदेह है कि वे रुचि रखते हैं। – yugr