พื้นที่ที่อยู่ของพื้นที่ส่วน .bss ในไฟล์เอลฟ์

ถ้าฉันเข้าใจอย่างถูกต้องโดยการสร้างส่วนประเภท .bss (ตามตัวอย่างโค้ดด้านล่าง) พื้นที่การเขียน/อ่านของส่วน .bss นั้นมาจากออฟเซ็ตของส่วนในไฟล์เป็น N และในกรณีนี้ phdr.p_memsz จะเพิ่มขึ้น N ไบต์ และขึ้นอยู่กับ ระบบปฏิบัติการ/เคอร์เนลเป็นศูนย์พื้นที่หน่วยความจำนี้ การตีความของฉันถูกต้องหรือไม่?

    Elf32_Phdr phdr;
    // ...
    phdr.p_memsiz = somevalue;
    Elf32_Shdr sec;
    // ...
    sec.sh_name   = bss_name;
    sec.sh_type   = SHT_nobits;
    sec.sh_flags  = SHF_alloc + SHF_write;
    sec.sh_size = N;
    phdr.p_memsiz += N;

person The Mask    schedule 04.04.2014    source แหล่งที่มา


คำตอบ (1)


ใช่ ระบบปฏิบัติการจะเติมส่วน .bss ด้วยเลขศูนย์

โดยทั่วไปแล้ว Linux (และ Unix เวอร์ชันอื่นๆ) จะทำให้หน้า "ใหม่" ทั้งหมดเป็นศูนย์ในกระบวนการอยู่ดี เพื่อหลีกเลี่ยงไม่ให้เนื้อหารั่วไหลจาก "เจ้าของคนก่อน" (คิดว่ามันเหมือนกับการทำลายการรีไซเคิลของคุณ)

แก้ไข:

ท้ายที่สุดแล้ว ตัวเชื่อมโยงและตัวโหลดมีหน้าที่รับผิดชอบตำแหน่งที่แท้จริงของส่วน .bss โดยทั่วไปจะอยู่ที่ส่วนท้ายของส่วนข้อมูล ตามที่อธิบายไว้ในข้อกำหนด ELF 1.2 รูปที่ 2.5

ตามที่ "ส่วน" อธิบายไว้ ส่วน .bss มีประเภท SHT_NOBITS แม้ว่าจะไม่กินพื้นที่ในไฟล์ แต่ก็มีส่วนช่วยในอิมเมจหน่วยความจำของเซ็กเมนต์ โดยปกติ ข้อมูลที่ไม่ได้เตรียมใช้งานเหล่านี้จะอยู่ที่ส่วนท้ายของกลุ่ม ดังนั้นจึงทำให้ p_memsz มีขนาดใหญ่กว่า p_filesz

(ที่อื่นอธิบายว่าเนื้อหารับประกันว่าเป็นศูนย์)

คุณสามารถค้นหาข้อกำหนดได้ที่นี่ (และที่อื่นๆ อีกมากมาย แต่ไซต์นี้ยังมีเอกสารส่วนขยายที่มีประโยชน์บางส่วน ฯลฯ) http://refspecs.linuxbase.org/

ซอร์สโค้ด LLVM และเอกสารที่เกี่ยวข้องก็สามารถอ่านได้พอสมควร (IMO): http://llvm.org/docs/doxygen/html/Support_2ELF_8h_source.html

ข้อมูลเกี่ยวกับวิธีการระบุการเชื่อมโยงและการสั่งซื้อ ตำแหน่งของส่วนต่างๆ: http://www.math.utah.edu/docs/info/ld_3.html

person Mats Petersson    schedule 04.04.2014
comment
ฉันคิดอย่างนั้น แต่ฉันไม่แน่ใจว่าคุณกำลังพยายามทำอะไร - แม้ว่าคุณกำลังถามว่าหน่วยความจำที่ได้รับการจัดสรรรับประกันว่าเป็นศูนย์หรือไม่ - ฉันไม่ได้ดูอย่างใกล้ชิดว่าภูมิภาคถูกสร้างขึ้นอย่างไร แต่ดู มีเหตุผล. - person Mats Petersson; 05.04.2014
comment
ฉันแค่พยายามรู้ว่าจุดเริ่มต้นและจุดสิ้นสุดของขอบเขตของ .bss ส่วนใด - person The Mask; 05.04.2014
comment
ไม่แน่ใจว่าคุณหมายถึงอะไร... ตำแหน่งที่มันอยู่คือการรวมกันของตัวเชื่อมโยงและตัวโหลดที่โหลดไฟล์ลงในหน่วยความจำ รหัสของคุณดูใช้ได้สำหรับการขยาย .bss เป็น N ไบต์ - person Mats Petersson; 05.04.2014
comment
ขออภัยหากไม่ชัดเจนพอ สมมติว่าเป็นไฟล์ปฏิบัติการแบบคงที่และไม่ใช่ไดนามิก มันมี 2 ส่วนรวมถึง phdr และ ehdr แบบคงที่: .text และ .bss ดังนั้นฉันจึงมีทั้งหมด 4 ส่วน .bss เป็นไฟล์สุดท้ายในไฟล์ elf และมี sh_size = sizeof(int) * 2 หมายความว่ามีพื้นที่ว่างสำหรับตัวแปรคงที่สองตัว สิ่งที่ฉันกำลังมองหาเพื่อทำความเข้าใจคือพื้นที่ของส่วนนี้ (ในกรณีนี้คือ sizeof(int) * 2) เริ่มต้นและสิ้นสุด เช่น ที่อยู่หน่วยความจำและออฟเซ็ต ยังไม่ชัดเจน ดังนั้นฉันคิดว่ามันมาจากจุดสิ้นสุดของส่วน offset .bss ในไฟล์ elf จนถึงขนาดที่ฉันระบุ: sizeof(int) * 2) - person The Mask; 05.04.2014
comment
อย่างที่ฉันบอกไป มันขึ้นอยู่กับตัวเชื่อมโยง - แต่โดยทั่วไปแล้ว มันจะอยู่หลังส่วน .data ทันที (หรือส่วน .bss ก่อนหน้า หากมีมากกว่าหนึ่ง) คุณสามารถเขียนไฟล์การกำหนดค่าตัวเชื่อมโยงที่วาง .bss ไว้ที่ที่อยู่ห่างไกลจาก .data โดยทั่วไปแล้ว .bss จะตามหลัง .data ทันที (และส่วน .bss ทั้งหมดจะติดตามกัน) - person Mats Petersson; 05.04.2014
comment
แก้ไขคำตอบของคุณด้วยความคิดเห็นนี้เพื่อให้ฉันยอมรับ นอกจากนี้ คุณมีทรัพยากรที่ดี (รวมถึงไฟล์ข้อมูลจำเพาะของ ELF) เพื่อให้ฉันเข้าใจเนื้อหาที่เกี่ยวข้องกับ ELF ดีขึ้นหรือไม่ - person The Mask; 05.04.2014