เหตุใดไลบรารีที่แบ่งใช้จึงสามารถเรียกใช้งานได้


59

เหตุใดจึงมีการแชร์ไลบรารีเกือบทั้งหมดใน/usr/lib/จึงมีบิตสิทธิการใช้งานที่ตั้งค่าได้ ฉันไม่เห็นกรณีใช้งานใด ๆ สำหรับการดำเนินการ บางคนจัดการเพื่อเชื่อมต่อรูปแบบของmainฟังก์ชั่นบางอย่างเพื่อพิมพ์ลิขสิทธิ์สั้น ๆ และหมายเหตุรุ่น แต่หลายคนไม่ทำอย่างนั้น

ดังนั้นจุดประสงค์ของการตั้งค่านี้xคืออะไร ผู้ทำแพ็กเกจไลบรารีต้องทำเช่นนั้นหรือไม่ จะเกิดอะไรขึ้นถ้าฉันdlopen()เป็นห้องสมุดสาธารณะที่มี0644สิทธิ์


3
บน OS ใด (หาก Linux, มีการแจกจ่ายอะไร) บน Debian squeeze ไลบรารีที่สามารถเรียกทำงานได้ที่แบ่งใช้เท่านั้นใน/libและ/usr/libเป็น libc และ libpthread และทั้งคู่จะพิมพ์ประกาศเกี่ยวกับลิขสิทธิ์เมื่อดำเนินการ
Gilles

หากพวกเขา segfault พวกเขาอาจเป็นข้อบกพร่องเล็กน้อย ฉันจะรายงานพวกเขาหากคุณเจอพวกเขา การกระจายคืออะไร?
Faheem Mitha

@Faheem: ไม่มีmain()สัญลักษณ์เป็นจุดเริ่มต้นไม่ใช่ข้อผิดพลาดเล็กน้อย แต่เป็นตัวเลือกพื้นฐานในการออกแบบ คุณพลาดจุดของฉัน
Tadeusz A. Kadłubowski

2
@Gilles: ฉันเห็นว่า 755 เป็นตัวเลือกการอนุญาตเริ่มต้นสำหรับระบบ Linux ตระกูล RedHat (Fedora และ Centos) และบน Solaris
Tadeusz A. Kadłubowski

หลักฐานของคำถามนี้ไม่เป็นความจริงในระดับสากล ในความเป็นจริงมันเป็นเท็จตามที่ระบุไว้ข้างต้นสำหรับ Debian Linux และยังเป็นเท็จสำหรับ FreeBSD และสำหรับ OpenBSD
JdeBP

คำตอบ:


32

ภายใต้ HP-UX ไลบรารีที่ใช้ร่วมกันจะถูกแมปเข้ากับหน่วยความจำโดยใช้ mmap () และหน้าหน่วยความจำทั้งหมดในระบบมีบิตการป้องกันซึ่งอยู่คู่กับเคอร์เนลและกลไกการป้องกันเพจหน่วยความจำของฮาร์ดแวร์โปรเซสเซอร์ ในการดำเนินการเนื้อหาของหน้าหน่วยความจำใด ๆ ในระบบหน้านั้นจะต้องมีชุด PROT_EXEC ซึ่งเป็นคุณสมบัติที่มีประโยชน์ในการป้องกันการบุกรุกข้อมูล

การเรียก mmap () ใช้บิตการอนุญาตบนไฟล์ที่จะทำแผนที่เพื่อกำหนดบิตการป้องกันของเพจหน่วยความจำที่แมปซึ่งจะมี: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (จาก sys / mman.h) ดังนั้นเพื่อให้ไลบรารีที่ใช้ร่วมกันสามารถใช้งานได้บน HP-UX ไฟล์ที่มีไลบรารีที่แชร์จะต้องมีสิทธิ์ดำเนินการเพื่อให้แน่ใจว่าไลบรารีที่แมปนั้นมีสิทธิ์ดำเนินการด้วย

ไลบรารีแบบแบ่งใช้ที่มีโหมด 644 บนระบบ HP-UX จะทำให้เกิดการถ่ายโอนข้อมูลหลัก


การใช้งาน Unix อื่น ๆ อาจใช้คุณสมบัตินี้เช่นกัน
Tadeusz A. Kadłubowski

> HP-UX (จาก "Hewlett Packard Unix") คือการติดตั้งระบบปฏิบัติการ Unix ที่เป็นกรรมสิทธิ์ของ Hewlett Packard Enterprise บนพื้นฐานของ UNIX System V
David 天宇วงศ์

อีกตัวอย่างหนึ่งคือการสร้างแพ็คเกจ rpm ด้วยแพ็คเกจ debuginfo แยกต่างหากต้องมีการอนุญาตให้ใช้งานบนไลบรารี่ที่แชร์มิฉะนั้น find-debuginfo.sh จะข้ามการประมวลผล
Domen Vrankar

20

อ็อบเจ็กต์ที่แบ่งใช้ที่ไม่สามารถเรียกทำงานได้นั้นทำงานได้ดี แต่ไลบรารีที่ทำเครื่องหมายไว้อาจเรียกใช้งานได้ว่าเป็นโปรแกรมแบบสแตนด์อโลน

ดังนั้นจุดประสงค์ของการตั้งค่า x นี้คืออะไร?

ไม่มียกเว้นคุณต้องการให้พวกเขาปล่อยเวอร์ชั่นหรือข้อมูลอื่น ๆ

ผู้ทำแพ็กเกจไลบรารีต้องทำเช่นนั้นหรือไม่

ไม่

จะเกิดอะไรขึ้นถ้าฉัน dlopen () ไลบรารีที่แชร์ที่มีสิทธิ์ 0644

คุณจะได้รับการจัดการวัตถุที่ใช้ร่วมกันใหม่ (ตราบเท่าที่ไฟล์สามารถอ่านได้ ฯลฯ ) ... บิต exec ไม่มีผลกับสิ่งนี้


สำหรับสาเหตุที่ไลบรารีที่ไม่สามารถใช้งานได้เนื่องจาก executables แบบสแตนด์อโลนยังคงมีชุดบิต exec: นี่อาจเป็นเพียงสิ่งประดิษฐ์ของระบบบิลด์หรือสคริปต์ลิงค์ที่ใช้


เอาท์พุทตัวอย่างเพียงเพื่อการอ้างอิง:

$ /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()จุดเข้าใช้งานปกติ Libc เป็นเรื่องผิดปกติ นักพัฒนามันทำบันทึกนี้เป็นฟังก์ชั่นพิเศษ ความเรียบง่ายchmod a+xของห้องสมุดอื่น ๆ จะไม่ให้ฟังก์ชั่นนี้แก่คุณ” ฉันยังไม่เห็นจุดที่ตั้งค่า+xสำหรับไลบรารีทั้งหมด
Tadeusz A. Kadłubowski

เห็นด้วยและอาจเป็นเพียงผู้.soที่สามารถดำเนินการได้ควรถูกทำเครื่องหมายเช่นนี้ ฉันจะแก้ไขคำตอบของฉันเพื่อหลีกเลี่ยงการบอกเป็นนัยว่าทุกอย่างที่มีบิตชุด exec เป็นปฏิบัติการแบบสแตนด์อโลน
ไร้ประโยชน์

5
คำสั่ง "ldd" มักจะเป็นสคริปต์ sh ที่เรียกใช้ตัวเชื่อมโยงแบบไดนามิก ld-linux-x86-64.so.2 หรือ /lib/ld-linux.so.2 หรือบางอย่าง ตัวเชื่อมโยงแบบไดนามิกนั้นเป็นวัตถุที่ใช้ร่วมกันเสมอ
Bruce Ediger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.