กลับไปหน้าบทความ

อ่าน 8 นาที

รหัสที่ไม่ขึ้นกับตำแหน่ง

ในการ คำนวณ รหัสที่ไม่ขึ้นกับตำแหน่ง [ 1 ] ( PIC [ 1 ] ) หรือ ไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง ( PIE ) [ 2 ] คือส่วนของ รหัสเครื่อง...

รหัสที่ไม่ขึ้นกับตำแหน่ง

ในการคำนวณรหัสที่ไม่ขึ้นกับตำแหน่ง[ 1 ] ( PIC [ 1 ] ) หรือไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง ( PIE ) [ 2 ]คือส่วนของรหัสเครื่องที่ทำงานได้อย่างถูกต้องโดยไม่คำนึงถึงที่อยู่หน่วยความจำ[ a ] ​​PIC มักใช้สำหรับไลบรารีที่ใช้ร่วมกันเพื่อให้สามารถโหลดรหัสไลบรารีเดียวกันได้ในตำแหน่งในพื้นที่ที่อยู่ของแต่ละโปรแกรมโดยไม่ทับซ้อนกับหน่วยความจำอื่นที่ใช้โดยไลบรารีที่ใช้ร่วมกันอื่นๆ เป็นต้น PIC ยังถูกใช้ในระบบคอมพิวเตอร์รุ่นเก่าที่ไม่มีหน่วยจัดการหน่วยความจำ (MMU) [ 3 ]เพื่อให้ระบบปฏิบัติการสามารถแยกแอปพลิเคชันออกจากกันได้แม้ภายในพื้นที่ที่อยู่เดียวของระบบที่ไม่มี MMU

โค้ดที่ไม่ขึ้นกับตำแหน่งสามารถทำงานได้ที่ที่อยู่หน่วยความจำใดๆ ก็ได้โดยไม่ต้องแก้ไข ซึ่งแตกต่างจากโค้ดแบบสัมบูรณ์[ 1 ]ที่ต้องโหลดที่ตำแหน่งเฉพาะเพื่อให้ทำงานได้อย่างถูกต้อง[ 1 ]และ โค้ด ที่ระบุตำแหน่งได้ในเวลาโหลด (LTL) [ 1 ]ซึ่งตัวเชื่อมโยงหรือตัวโหลดโปรแกรมจะแก้ไขโปรแกรมก่อนการทำงาน ดังนั้นจึงสามารถทำงานได้จากตำแหน่งหน่วยความจำเฉพาะเท่านั้น[ 1 ]บางครั้งคำศัพท์หลังนี้เรียกว่าโค้ดที่ขึ้นกับตำแหน่ง[ 4 ]การสร้างโค้ดที่ไม่ขึ้นกับตำแหน่งมักเป็นพฤติกรรมเริ่มต้นของคอมไพเลอร์แต่คอมไพเลอร์อาจกำหนดข้อจำกัดในการใช้คุณสมบัติบางอย่างของภาษา เช่น ไม่อนุญาตให้ใช้ที่อยู่แบบสัมบูรณ์ (โค้ดที่ไม่ขึ้นกับตำแหน่งต้องใช้การกำหนดที่อยู่แบบสัมพัทธ์ ) คำสั่งที่อ้างอิงถึงที่อยู่หน่วยความจำเฉพาะโดยตรงบางครั้งทำงานได้เร็วกว่า และการแทนที่ด้วยคำสั่งการกำหนดที่อยู่แบบสัมพัทธ์ที่เทียบเท่ากันอาจส่งผลให้การทำงานช้าลงเล็กน้อย แม้ว่าโปรเซสเซอร์สมัยใหม่จะทำให้ความแตกต่างนั้นแทบไม่มีนัยสำคัญ[ 5 ]

ประวัติศาสตร์

ในคอมพิวเตอร์รุ่นแรกๆ เช่นIBM 701 [ 6 ] (29 เมษายน พ.ศ. 2495) หรือUNIVAC I (31 มีนาคม พ.ศ. 2494) โค้ดไม่ได้เป็นอิสระจากตำแหน่ง: แต่ละโปรแกรมถูกสร้างขึ้นเพื่อโหลดและรันจากที่อยู่เฉพาะ คอมพิวเตอร์รุ่นแรกๆ เหล่านั้นไม่มีระบบปฏิบัติการและไม่สามารถทำงานหลายอย่างพร้อมกันได้ โปรแกรมจะถูกโหลดลงในหน่วยความจำหลัก (หรือแม้แต่เก็บไว้ในดรัมแม่เหล็กเพื่อเรียกใช้งานโดยตรงจากที่นั่น) และรันทีละโปรแกรม ในบริบทการทำงานเช่นนี้ โค้ดที่เป็นอิสระจากตำแหน่งจึงไม่จำเป็น

แม้แต่ใน ระบบ ฐานและขอบเขต[ b ]เช่นCDC 6600 , GE 625และUNIVAC 1107เมื่อระบบปฏิบัติการโหลดโค้ดลงในที่เก็บข้อมูลของงานแล้ว โค้ดนั้นจะสามารถรันได้จากที่อยู่สัมพัทธ์ที่โหลดไว้เท่านั้น

Burroughsได้นำเสนอระบบแบบแบ่งส่วน (segmented system) รุ่น B5000 (ปี 1961) ซึ่งโปรแกรมจะอ้างอิงถึงส่วนต่างๆ โดยอ้อมผ่านคำสั่งควบคุมบนสแต็กหรือในตารางอ้างอิงโปรแกรม (PRT) โดยส่วนที่ใช้ร่วมกันสามารถอ้างอิงได้ผ่านตำแหน่ง PRT ที่แตกต่างกันในกระบวนการต่างๆ ในทำนองเดียวกัน ในรุ่นB6500 ในภายหลัง การอ้างอิงส่วนทั้งหมดจะทำผ่านตำแหน่งในเฟรมสแต็

ระบบIBM System/360 (7 เมษายน 1964) ได้รับการออกแบบโดยใช้การกำหนดแอดเดรสแบบตัดทอน คล้ายกับของUNIVAC III [ 7 ] โดยคำนึงถึงความเป็นอิสระ ของตำแหน่งโค้ด ในการกำหนดแอดเดรสแบบตัดทอน แอดเดรสหน่วยความจำจะถูกคำนวณจากรีจิสเตอร์ฐานและออฟเซ็ต ในตอนเริ่มต้นของโปรแกรม โปรแกรมเมอร์ต้องสร้างแอดเดรสได้โดยการโหลดรีจิสเตอร์ฐาน โดยปกติแล้ว โปรแกรมเมอร์จะแจ้งให้แอสเซมเบลอร์ทราบด้วย คำสั่ง เสมือน USINGโปรแกรมเมอร์สามารถโหลดรีจิสเตอร์ฐานจากรีจิสเตอร์ที่ทราบว่ามีแอดเดรสจุดเริ่มต้น โดยทั่วไปคือ R15 หรือสามารถใช้ คำสั่ง BALR (Branch And Link, Register form) (โดยมีค่า R2 เป็น 0) เพื่อเก็บแอดเดรสของคำสั่งลำดับถัดไปลงในรีจิสเตอร์ฐาน ซึ่งจะถูกเขียนโค้ดอย่างชัดเจนหรือโดยปริยายในแต่ละคำสั่งที่อ้างอิงถึงตำแหน่งจัดเก็บภายในโปรแกรม สามารถใช้รีจิสเตอร์ฐานหลายตัวสำหรับโค้ดหรือข้อมูลก็ได้ คำสั่งดังกล่าวต้องการหน่วยความจำน้อยกว่า เนื่องจากไม่จำเป็นต้องเก็บที่อยู่แบบเต็ม 24, 31, 32 หรือ 64 บิต (4 หรือ 8 ไบต์) แต่จะใช้เพียงหมายเลขรีจิสเตอร์ฐาน (เข้ารหัสใน 4 บิต) และค่าชดเชยที่อยู่ 12 บิต (เข้ารหัสใน 12 บิต) ซึ่งต้องการเพียงสองไบต์เท่านั้น

เทคนิคการเขียนโปรแกรมนี้เป็นมาตรฐานในระบบประเภท IBM S/360 และยังคงใช้มาจนถึงปัจจุบันในระบบ IBM System/z เมื่อเขียนโค้ดด้วยภาษาแอสเซมบลี โปรแกรมเมอร์จะต้องกำหนดแอดเดรสสำหรับโปรแกรมตามที่อธิบายไว้ข้างต้น และใช้รีจิสเตอร์พื้นฐานอื่นๆ สำหรับหน่วยความจำที่จัดสรรแบบไดนามิก คอมไพเลอร์จะจัดการเรื่องการกำหนดแอดเดรสแบบนี้โดยอัตโนมัติ

ระบบปฏิบัติการ DOS/360รุ่นแรกของ IBM (ปี 1966) ไม่ได้ใช้หน่วยความจำเสมือน (เนื่องจากรุ่นแรกๆ ของ System S/360 ไม่รองรับ) แต่มีความสามารถในการวางโปรแกรมไปยังตำแหน่งจัดเก็บข้อมูลที่กำหนดเอง (หรือเลือกโดยอัตโนมัติ) ในระหว่างการโหลดผ่าน คำสั่ง PHASE name,* JCL (Job Control Language)

ดังนั้น ในระบบ S/360 ที่ไม่มีหน่วยความจำเสมือน โปรแกรมสามารถโหลดได้ที่ตำแหน่งหน่วยความจำใดก็ได้ แต่จำเป็นต้องมีพื้นที่หน่วยความจำต่อเนื่องขนาดใหญ่พอที่จะเก็บโปรแกรมนั้นได้ บางครั้ง อาจเกิด การแตกกระจายของหน่วยความจำจากการโหลดและยกเลิกการโหลดโมดูลที่มีขนาดแตกต่างกัน หน่วยความจำเสมือนนั้นไม่มีข้อจำกัดดังกล่าวตามที่ออกแบบไว้

แม้ว่า DOS/360 และOS/360จะไม่รองรับ PIC แต่รูทีน SVC ชั่วคราว ใน OS/360 ไม่สามารถมีค่าคงที่แอดเดรสที่สามารถย้ายตำแหน่งได้ และสามารถทำงานในพื้นที่ชั่วคราวใดก็ได้โดยไม่ต้องย้าย ตำแหน่ง

IBM เป็นผู้ริเริ่มใช้หน่วยความจำเสมือน (virtual storage) บนเครื่องคอมพิวเตอร์ IBM System/360 รุ่น 67ในปี 1965 เพื่อรองรับระบบปฏิบัติการมัลติทาสก์และระบบปฏิบัติการแบ่งเวลาใช้งาน (time-sharing) รุ่นแรกของ IBM คือ TSS/360 ระบบปฏิบัติการ DOS/360 รุ่นต่อมา (DOS/VS เป็นต้น) และระบบปฏิบัติการอื่นๆ ของ IBM ในภายหลัง ต่างก็ใช้หน่วยความจำเสมือน การกำหนดแอดเดรสแบบตัดทอน (Truncated addressing) ยังคงเป็นส่วนหนึ่งของสถาปัตยกรรมพื้นฐาน และยังคงมีข้อดีเมื่อต้องโหลดโมดูลหลายโมดูลลงในพื้นที่แอดเดรสเสมือนเดียวกัน

เพื่อเป็นการเปรียบเทียบ ใน ระบบ แบบแบ่งส่วน ในยุคแรก เช่นBurroughs MCPบนBurroughs B5000 (1961) และMultics (1964) และในระบบเพจจิ้ง เช่น IBM TSS/360 (1967) [ c ]โค้ดก็เป็นอิสระจากตำแหน่งโดยเนื้อแท้เช่นกัน เนื่องจากที่อยู่เสมือนของซับรูทีนในโปรแกรมจะอยู่ในข้อมูลส่วนตัวภายนอกโค้ด เช่น ตารางอ้างอิงโปรแกรม เซ็กเมนต์การเชื่อมโยง ส่วนต้นแบบ

การคิดค้นการแปลงที่อยู่แบบไดนามิก (ฟังก์ชันที่จัดให้โดยMMU ) เดิมทีช่วยลดความจำเป็นในการใช้โค้ดที่ไม่ขึ้นกับตำแหน่ง เนื่องจากแต่ละกระบวนการสามารถมีพื้นที่ที่อยู่ (ช่วงของที่อยู่) ที่เป็นอิสระของตนเองได้ อย่างไรก็ตาม การทำงานพร้อมกันหลายงานโดยใช้โค้ดเดียวกันทำให้เกิดการสิ้นเปลืองหน่วยความจำทางกายภาพ หากงานสองงานรันโปรแกรมที่เหมือนกันทุกประการ การแปลงที่อยู่แบบไดนามิกจะช่วยแก้ปัญหาได้โดยอนุญาตให้ระบบแมปที่อยู่ 32K ของงานสองงานที่แตกต่างกันไปยังไบต์เดียวกันในหน่วยความจำจริง ซึ่งมีสำเนาเดียวของโปรแกรมอยู่

โปรแกรมต่าง ๆ อาจใช้โค้ดร่วมกันได้ ตัวอย่างเช่น โปรแกรมเงินเดือนและโปรแกรมบัญชีลูกหนี้อาจมีซับรูทีนการเรียงลำดับที่เหมือนกัน โมดูลที่ใช้ร่วมกัน (ไลบรารีที่ใช้ร่วมกันเป็นรูปแบบหนึ่งของโมดูลที่ใช้ร่วมกัน) จะถูกโหลดเพียงครั้งเดียวและแมปไปยังพื้นที่แอดเดรสทั้งสอง

SunOS 4.x และ ELF

โดยทั่วไปแล้ว การเรียกใช้ขั้นตอนภายในไลบรารีที่ใช้ร่วมกันจะทำผ่านสตับ ตารางการเชื่อมโยงขั้นตอน (PLT) ขนาดเล็ก ซึ่งจะเรียกใช้ฟังก์ชันที่แน่นอน วิธีนี้ช่วยให้ไลบรารีที่ใช้ร่วมกันสามารถสืบทอดการเรียกใช้ฟังก์ชันบางอย่างจากไลบรารีที่โหลดไว้ก่อนหน้านี้แทนที่จะใช้เวอร์ชันของตัวเอง[ 8 ]

การอ้างอิงข้อมูลจากโค้ดที่ไม่ขึ้นกับตำแหน่งมักจะทำโดยอ้อมผ่านตารางออฟเซ็ตทั่วโลก (GOT) ซึ่งเก็บที่อยู่ของตัวแปรทั่วโลก ที่เข้าถึงทั้งหมด มี GOT หนึ่งรายการต่อหน่วยการคอมไพล์หรือโมดูลออบเจ็กต์ และตั้งอยู่ที่ออฟเซ็ตคงที่จากโค้ด (แม้ว่าออฟเซ็ตนี้จะไม่ทราบจนกว่าจะมีการเชื่อมโยง ไลบรารี ) เมื่อลิงเกอร์เชื่อมโยงโมดูลเพื่อสร้างไลบรารีที่ใช้ร่วมกัน มันจะรวม GOT และตั้งค่าออฟเซ็ตสุดท้ายในโค้ด ไม่จำเป็นต้องปรับออฟเซ็ตเมื่อโหลดไลบรารีที่ใช้ร่วมกันในภายหลัง[ 8 ]

โค้ดที่ไม่ขึ้นกับตำแหน่งที่เข้าถึงข้อมูลส่วนกลางจะทำเช่นนั้นโดยการดึงที่อยู่ของตัวแปรส่วนกลางจากรายการใน GOT เนื่องจาก GOT อยู่ที่ออฟเซ็ตคงที่จากโค้ด ออฟเซ็ตระหว่างที่อยู่ของคำสั่งที่กำหนดในโค้ดและที่อยู่ของรายการ GOT สำหรับตัวแปรส่วนกลางที่กำหนดจึงคงที่เช่นกัน ดังนั้นออฟเซ็ตจึงไม่จำเป็นต้องเปลี่ยนแปลงขึ้นอยู่กับที่อยู่ที่จะโหลดโค้ดที่ไม่ขึ้นกับตำแหน่ง คำสั่งที่ดึงรายการ GOT สำหรับตัวแปรส่วนกลางจะใช้โหมดการกำหนดที่อยู่ที่มีออฟเซ็ตสัมพันธ์กับคำสั่งบางคำสั่งในโค้ด ซึ่งอาจเป็น โหมดการกำหนดที่อยู่แบบ สัมพันธ์กับ PCหากสถาปัตยกรรมชุดคำสั่งรองรับ หรือ โหมดการกำหนด ที่อยู่แบบสัมพันธ์กับรีจิสเตอร์โดยฟังก์ชันจะโหลดรีจิสเตอร์นั้นด้วยที่อยู่ของคำสั่งในคำนำของฟังก์ชัน[ 8 ] [ 9 ] [ 10 ] [ 11 ]

ไฟล์ DLL ของ Windows

ไลบรารีแบบไดนามิกลิงก์ (DLL) ในMicrosoft Windowsใช้คำสั่ง CALL รูปแบบ E8 (เรียกใช้คำสั่งใกล้เคียง สัมพันธ์กับคำสั่งถัดไป โดยมีระยะห่างสัมพันธ์กับคำสั่งถัดไป) คำสั่งเหล่านี้ไม่จำเป็นต้องแก้ไขเมื่อโหลด DLL

ตัวแปรส่วนกลางบางตัว (เช่น อาร์เรย์ของสตริงลิเทอรัล ตารางฟังก์ชันเสมือน) คาดว่าจะเก็บที่อยู่ของอ็อบเจ็กต์ในส่วนข้อมูลหรือส่วนโค้ดของไลบรารีแบบไดนามิก ดังนั้น ที่อยู่ที่เก็บไว้ในตัวแปรส่วนกลางจะต้องได้รับการอัปเดตเพื่อให้สะท้อนถึงที่อยู่ที่มีการโหลด DLL ตัวโหลดแบบไดนามิกจะคำนวณที่อยู่อ้างอิงโดยตัวแปรส่วนกลางและเก็บค่าไว้ในตัวแปรส่วนกลางนั้น ซึ่งจะกระตุ้นการคัดลอกเมื่อมีการเขียน (copy-on-write) ของหน้าหน่วยความจำที่มีตัวแปรส่วนกลางนั้น หน้าที่มีโค้ดและหน้าที่มีตัวแปรส่วนกลางที่ไม่มีตัวชี้ไปยังโค้ดหรือข้อมูลส่วนกลางจะยังคงใช้ร่วมกันระหว่างกระบวนการต่างๆ การดำเนินการนี้ต้องทำในระบบปฏิบัติการใดๆ ก็ตามที่สามารถโหลดไลบรารีแบบไดนามิกที่ที่อยู่ใดๆ ก็ได้

ใน Windows Vista และ Windows เวอร์ชันต่อมาการย้ายตำแหน่งของ DLL และไฟล์ปฏิบัติการจะดำเนินการโดยตัวจัดการหน่วยความจำเคอร์เนล ซึ่งจะแชร์ไบนารีที่ย้ายตำแหน่งแล้วระหว่างกระบวนการต่างๆ รูปภาพจะถูกย้ายตำแหน่งจากที่อยู่ฐานที่ต้องการเสมอ ทำให้เกิดการสุ่มเค้าโครงพื้นที่ที่อยู่ (ASLR) [ 12 ]

ระบบปฏิบัติการ Windows รุ่นก่อน Vista กำหนดให้ต้องมีการเชื่อมโยง DLL ของระบบไว้ล่วงหน้าณ ที่อยู่คงที่ที่ไม่ขัดแย้งกันในระหว่างการเชื่อมโยง เพื่อหลีกเลี่ยงการย้ายตำแหน่งของอิมเมจในระหว่างการทำงาน การย้ายตำแหน่งในระหว่างการทำงานใน Windows รุ่นเก่าเหล่านี้จะดำเนินการโดยตัวโหลด DLL ภายในบริบทของแต่ละกระบวนการ และส่วนต่างๆ ของอิมเมจที่ถูกย้ายตำแหน่งแล้วจะไม่สามารถใช้ร่วมกันระหว่างกระบวนการได้อีกต่อไป

วิธี การจัดการ DLL ใน Windows แตกต่างจาก ขั้นตอนใน OS/2 รุ่นก่อน หน้า OS/2 นำเสนอทางเลือกที่สาม โดยพยายามโหลด DLL ที่ไม่ใช่แบบอิสระต่อตำแหน่งเข้าไปใน "พื้นที่ใช้ร่วมกัน" เฉพาะในหน่วยความจำ และทำการแมปเมื่อโหลดเสร็จแล้ว ผู้ใช้ DLL ทุกคนสามารถใช้สำเนาในหน่วยความจำเดียวกันได้

มัลติซีส์

ในMulticsแต่ละขั้นตอนตามแนวคิด[ d ]มีส่วนโค้ดและส่วนเชื่อมโยง[ 13 ] [ 14 ]ส่วนโค้ดประกอบด้วยโค้ดเท่านั้น และส่วนเชื่อมโยงทำหน้าที่เป็นแม่แบบสำหรับส่วนเชื่อมโยงใหม่ ตัวชี้รีจิสเตอร์ 4 (PR4) ชี้ไปยังส่วนเชื่อมโยงของขั้นตอน การเรียกขั้นตอนจะบันทึก PR4 ไว้ในสแต็กก่อนที่จะโหลดด้วยตัวชี้ไปยังส่วนเชื่อมโยงของผู้ถูกเรียก การเรียกขั้นตอนใช้คู่ตัวชี้ทางอ้อม[ 15 ]พร้อมแฟล็กเพื่อทำให้เกิดกับดักในการเรียกครั้งแรก เพื่อให้กลไกการเชื่อมโยงแบบไดนามิกสามารถเพิ่มขั้นตอนใหม่และส่วนเชื่อมโยงลงในตารางส่วนที่รู้จัก (KST) สร้างส่วนเชื่อมโยงใหม่ ใส่หมายเลขส่วนในส่วนเชื่อมโยงของผู้เรียก และรีเซ็ตแฟล็กในคู่ตัวชี้ทางอ้อม

ทีเอสเอส

ในระบบแบ่งเวลาใช้งาน IBM S/360 (TSS/360 และ TSS/370) แต่ละขั้นตอนอาจมี CSECT สาธารณะแบบอ่านอย่างเดียวและส่วนต้นแบบส่วนตัว (PSECT) ที่เขียนได้ ผู้เรียกจะโหลดค่าคงที่ V สำหรับรูทีนลงในรีจิสเตอร์ทั่วไป 15 (GR15) และคัดลอกค่าคงที่ R สำหรับ PSECT ของรูทีนลงในเวิร์ดที่ 19 ของพื้นที่บันทึกที่ชี้ไปยัง GR13 [ 16 ]

ตัวโหลดแบบไดนามิก[ 17 ]จะไม่โหลดหน้าโปรแกรมหรือแก้ไขค่าคงที่ที่อยู่จนกว่าจะเกิดข้อผิดพลาดของหน้าแรก

ไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง

ไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง (PIE) คือไฟล์ไบนารีปฏิบัติการที่สร้างขึ้นจากโค้ดที่ไม่ขึ้นกับตำแหน่งทั้งหมด แม้ว่าบางระบบจะรันเฉพาะไฟล์ปฏิบัติการ PIC เท่านั้น แต่ก็ยังมีเหตุผลอื่นๆ ที่ใช้ไฟล์เหล่านี้ ไฟล์ไบนารี PIE ถูกใช้ใน ระบบปฏิบัติการ Linux บางระบบ ที่เน้นความปลอดภัย เพื่อให้PaXหรือExec Shieldสามารถใช้การสุ่มตำแหน่งพื้นที่แอดเดรส (ASLR) เพื่อป้องกันไม่ให้ผู้โจมตีรู้ตำแหน่งของโค้ดปฏิบัติการที่มีอยู่ระหว่างการโจมตีด้านความปลอดภัยโดยใช้ช่องโหว่ที่อาศัยการรู้ค่าออฟเซ็ตของโค้ดปฏิบัติการในไฟล์ไบนารี เช่นการโจมตีแบบ return-to-libc (เคอร์เนล Linux อย่างเป็นทางการตั้งแต่เวอร์ชัน 2.6.12 ในปี 2005 มี ASLR ที่อ่อนกว่าซึ่งทำงานร่วมกับ PIE ได้เช่นกัน แต่มีความอ่อนตรงที่ใช้การสุ่มกับหน่วยไฟล์ ELF ทั้งหมด) [ 18 ]

ระบบ ปฏิบัติการ macOSและiOSของ Apple รองรับไฟล์ปฏิบัติการ PIE อย่างเต็มที่ตั้งแต่เวอร์ชัน 10.7 และ 4.3 ตามลำดับ โดยจะมีการแจ้งเตือนเมื่อมีการส่งไฟล์ปฏิบัติการ iOS ที่ไม่ใช่ PIE เพื่อขออนุมัติไปยัง App Store ของ Apple แต่ยังไม่มีข้อกำหนดที่เข้มงวด และแอปพลิเคชันที่ไม่ใช่ PIE จะไม่ถูกปฏิเสธ[ 19 ] [ 20 ]

OpenBSDมีการเปิดใช้งาน PIE เป็นค่าเริ่มต้นในสถาปัตยกรรมส่วนใหญ่ตั้งแต่ OpenBSD 5.3 ซึ่งวางจำหน่ายเมื่อวันที่ 1 พฤษภาคม 2013 [ 21 ] การสนับสนุน PIE ใน ไบนารี ที่เชื่อมโยงแบบคงที่เช่น ไฟล์ปฏิบัติการใน ไดเร็กทอรี /binต่างๆ/sbinถูกเพิ่มเข้ามาในช่วงปลายปี 2014 [ 22 ] openSUSE เพิ่ม PIE เป็นค่าเริ่มต้นในเดือนกุมภาพันธ์ 2015 เริ่มต้นด้วยFedora  23 ผู้ดูแล Fedora ตัดสินใจสร้างแพ็กเกจโดยเปิดใช้งาน PIE เป็นค่าเริ่มต้น[ 23 ] Ubuntu 17.10มีการเปิดใช้งาน PIE เป็นค่าเริ่มต้นในทุกสถาปัตยกรรม[ 24 ] โปรไฟล์ใหม่ของGentoo รองรับ PIE เป็นค่าเริ่มต้นแล้ว [ 25 ]ประมาณเดือนกรกฎาคม 2017 Debianได้เปิดใช้งาน PIE เป็นค่าเริ่มต้น[ 26 ]

Androidเปิดใช้งานการสนับสนุน PIE ในJelly Bean [ 27 ]และลบการสนับสนุนตัวเชื่อมโยงที่ไม่ใช่ PIE ในLollipop [ 28 ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^วิธีนี้ทำให้แต่ละกระบวนการที่ใช้สำเนาที่ใช้ร่วมกันสามารถมองเห็นสำเนานั้นได้ที่ที่อยู่เสมือนที่แตกต่างกัน
  2. ^แต่มีการโหลดโค้ดสำเนาแยกต่างหากสำหรับแต่ละงาน
  3. ^แม้ว่า TSS/360 จะรองรับ PIC ที่ใช้ร่วมกันได้ แต่ระบบเพจจิ้งทุกระบบก็ไม่ได้รองรับคุณสมบัตินี้เช่นกัน
  4. ^มีการเปลี่ยนแปลงทางเทคนิคบางประการเพื่อเหตุผลด้านประสิทธิภาพ ซึ่งอยู่นอกเหนือขอบเขตของบทความนี้
  • บทนำเกี่ยวกับรหัสที่ไม่ขึ้นกับตำแหน่ง
  • ตำแหน่งภายในของโค้ดอิสระ
  • การเขียนโปรแกรมด้วยภาษาแอสเซมบลีบน PIC
  • กรณีที่น่าสนใจของไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Position-independent_code&oldid=1360497016#PIE "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ รหัสที่ไม่ขึ้นกับตำแหน่ง

ในการ คำนวณ รหัสที่ไม่ขึ้นกับตำแหน่ง [ 1 ] ( PIC [ 1 ] ) หรือ ไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง ( PIE ) [ 2 ] คือส่วนของ รหัสเครื่อง...

ประวัติศาสตร์

ในคอมพิวเตอร์รุ่นแรกๆ เช่น IBM 701 [ 6 ] (29 เมษายน พ.ศ. 2495) หรือ UNIVAC I (31 มีนาคม พ.ศ.

SunOS 4.x และ ELF

โดยทั่วไปแล้ว การเรียกใช้ขั้นตอนภายในไลบรารีที่ใช้ร่วมกันจะทำผ่าน สตับ ตารางการเชื่อมโยงขั้นตอน (PLT) ขนาดเล็ก ซึ่งจะเรียกใช้ฟังก์ชันที่แน่นอน...

ไฟล์ DLL ของ Windows

ไลบรารีแบบไดนามิกลิงก์ (DLL) ใน Microsoft Windows ใช้คำสั่ง CALL รูปแบบ E8 (เรียกใช้คำสั่งใกล้เคียง สัมพันธ์กับคำสั่งถัดไป โดยมีระยะห่างสัมพันธ์กับคำสั่งถัดไป) คำสั่งเหล่านี้ไม่จำเป็นต้องแก้ไขเมื่อโหลด DLL