อ่าน 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 ]
ดูเพิ่มเติม
หมายเหตุ
- ^วิธีนี้ทำให้แต่ละกระบวนการที่ใช้สำเนาที่ใช้ร่วมกันสามารถมองเห็นสำเนานั้นได้ที่ที่อยู่เสมือนที่แตกต่างกัน
- ^แต่มีการโหลดโค้ดสำเนาแยกต่างหากสำหรับแต่ละงาน
- ^แม้ว่า TSS/360 จะรองรับ PIC ที่ใช้ร่วมกันได้ แต่ระบบเพจจิ้งทุกระบบก็ไม่ได้รองรับคุณสมบัตินี้เช่นกัน
- ^มีการเปลี่ยนแปลงทางเทคนิคบางประการเพื่อเหตุผลด้านประสิทธิภาพ ซึ่งอยู่นอกเหนือขอบเขตของบทความนี้
ลิงก์ภายนอก
- บทนำเกี่ยวกับรหัสที่ไม่ขึ้นกับตำแหน่ง
- ตำแหน่งภายในของโค้ดอิสระ
- การเขียนโปรแกรมด้วยภาษาแอสเซมบลีบน PIC
- กรณีที่น่าสนใจของไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ รหัสที่ไม่ขึ้นกับตำแหน่ง
ในการ คำนวณ รหัสที่ไม่ขึ้นกับตำแหน่ง [ 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