साझा लाइब्रेरी निष्पादन योग्य क्यों हैं?


59

लगभग सभी साझा पुस्तकालयों में /usr/lib/निष्पादन योग्य अनुमति बिट सेट क्यों है? मैं उन्हें निष्पादित करने के लिए कोई उपयोग मामला नहीं देखता। कुछ mainएक लघु कॉपीराइट और संस्करण नोट को प्रिंट करने के लिए कुछ प्रकार के फ़ंक्शन को हुक-अप करने के लिए प्रबंधित करते हैं , लेकिन बहुत से ऐसा नहीं करते हैं और निष्पादन के दौरान सेगफॉल्ट भी करते हैं।

तो, इसे स्थापित करने का क्या मतलब है x? क्या सभी लाइब्रेरी पैकर्स को ऐसा करना चाहिए? यदि मेरे dlopen()पास साझा लाइब्रेरी है जिसकी 0644अनुमति है तो क्या होगा ?


3
किस ओएस पर (यदि लिनक्स, क्या वितरण)? डेबियन निचोड़ने पर, केवल निष्पादन योग्य साझा पुस्तकालय में /libऔर /usr/liblibc और libpthread हैं, और दोनों निष्पादित होने पर एक कॉपीराइट नोटिस प्रिंट करते हैं।
गाइल्स

यदि वे सेगफॉल्ट करते हैं, तो वे संभवतः मामूली कीड़े हैं। यदि आप उनके पास आते हैं तो मैं उन्हें रिपोर्ट करूँगा। वितरण क्या है?
फहीम मीठा

@ फहीम: main()एंट्री पॉइंट के रूप में सिंबल न होना मामूली बग नहीं है, बल्कि एक मौलिक डिजाइन विकल्प है। आपने मेरी बात को याद किया।
तदेउस्ज़ ए। कदलोबोस्की

2
@ गिल्स: मैंने 755 को रेडहैट-परिवार लिनक्स सिस्टम (फेडोरा और सेंटोस) और सोलारिस पर एक डिफ़ॉल्ट अनुमति विकल्प के रूप में देखा है।
तदेउस्ज़ ए। कदलोबोस्की

इस प्रश्न का आधार सार्वभौमिक रूप से सत्य नहीं है। वास्तव में, यह गलत है, जैसा कि ऊपर उल्लेख किया गया है, डेबियन लिनक्स के लिए; और FreeBSD के लिए और OpenBSD के लिए भी गलत है।
JdeBP

जवाबों:


32

HP-UX के तहत, साझा पुस्तकालयों को mmap () का उपयोग करके मेमोरी में मैप किया जाता है, और सिस्टम के सभी मेमोरी पेज में प्रोटेक्शन बिट्स होते हैं जो कर्नेल और प्रोसेसर हार्डवेयर के मेमोरी पेज प्रोटेक्शन मैकेनिज्म के साथ जोड़े जाते हैं। सिस्टम पर स्मृति के किसी भी पृष्ठ की सामग्री को निष्पादित करने के लिए, उस पृष्ठ में PROT_EXEC सेट होना चाहिए - डेटा निष्पादन कारनामों को रोकने के लिए एक उपयोगी सुविधा।

Mmap () कॉल फ़ाइल पर अनुमति बिट्स का उपयोग करता है यह मैप की गई मेमोरी पेजों के सुरक्षा बिट्स को परिभाषित करने के लिए मैप करने के बारे में है जो इसमें हैं: rwx -> PROT_READ | PROT_WRITE | PROT_EXREC (sys / mman.h से)। इसलिए किसी साझा लाइब्रेरी को HP-UX पर प्रयोग करने योग्य बनाने के लिए, साझा लाइब्रेरी वाली फ़ाइल में यह सुनिश्चित करने के लिए अनुमति होनी चाहिए कि मैप की गई लाइब्रेरी ने भी अनुमति निष्पादित की है।

HP-UX सिस्टम पर मोड 644 के साथ एक साझा पुस्तकालय कोर डंप का कारण होगा।


संभवतः अन्य यूनिक्स कार्यान्वयन भी इस सुविधा का उपयोग करते हैं।
तदेउस्ज़ ए। कदलोबोस्की

> HP-UX ("Hewlett Packard Unix") UNIX System V
डेविड t वोंग

एक अन्य उदाहरण यह है कि अलग-अलग डिबगिनफो पैकेजों के साथ आरपीएम पैकेज बनाने के लिए साझा पुस्तकालयों पर अनुमति की आवश्यकता होती है, अन्यथा उन्हें खोजने के लिए -debuginfo.sh स्कीप को संसाधित करना पड़ता है।
डोमन व्रकर 19

20

गैर-निष्पादन योग्य साझा किए गए ऑब्जेक्ट ठीक काम करते हैं, लेकिन निष्पादन योग्य चिह्नित पुस्तकालयों को स्टैंडअलोन कार्यक्रमों के रूप में भी चलाया जा सकता है।

तो, इस x को सेट करने का क्या मतलब है?

जब तक आप उन्हें संस्करण या अन्य जानकारी से बाहर निकालना नहीं चाहते हैं

क्या सभी लाइब्रेरी पैकर्स को ऐसा करना चाहिए?

नहीं

यदि मेरे पास 0644 अनुमतियाँ हैं, तो मैं एक साझा पुस्तकालय (dlopen) को क्या करूँगा?

आपको एक नया साझा ऑब्जेक्ट हैंडल मिलेगा (इसलिए जब तक फ़ाइल पठनीय होगी आदि) ... निष्पादन बिट इसे प्रभावित नहीं करता है


क्यों पुस्तकालयों के लिए जो स्टैंडअलोन निष्पादन योग्य के रूप में उपयोग करने योग्य नहीं हैं, अभी भी निष्पादन बिट सेट है: यह संभवतः निर्माण प्रणाली या लिंक स्क्रिप्ट का केवल एक उपयोग है।


उदाहरण आउटपुट, सिर्फ संदर्भ के लिए:

$ /lib/i386-linux-gnu/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.3.
Compiled on a Linux 3.2.14 system on 2012-04-19.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

11
अधिकांश .so पुस्तकालयों में बस segfault होता है क्योंकि उनके पास सामान्य main()प्रविष्टि बिंदु जैसा कुछ भी नहीं होता है । लिबक एक बाहरी है। इसके डेवलपर्स ने एक अतिरिक्त कार्यक्षमता के रूप में इस नोट को किया। chmod a+xकिसी भी अन्य पुस्तकालय का सरल आपको यह कार्यक्षमता नहीं देगा `मैं अभी भी +xसभी पुस्तकालयों के लिए सेटिंग का बिंदु नहीं देखता हूं ।
तदेउस्ज़ ए। कदलोबोव्स्की

सहमत हैं, और शायद केवल उन .soएस को निष्पादित किया जा सकता है जिन्हें इस तरह चिह्नित किया जाना चाहिए। मैं अपने उत्तर को लागू करने से बचने के लिए संशोधन करूँगा कि निष्पादन बिट सेट के साथ सब कुछ वास्तव में एक स्टैंडअलोन निष्पादन योग्य है।
बेकार

5
"Ldd" कमांड आमतौर पर एक शा स्क्रिप्ट होती है जो डायनेमिक लिंकर, ld-linux-x86-64.so.2 या /lib/ld-linux.so.2 या कुछ ऐसे को जोड़ती है। डायनेमिक लिंकर हमेशा एक साझा ऑब्जेक्ट है।
ब्रूस एडिगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.