ในกรณีนี้ ที่อยู่ของ:
.data
เริ่มต้นที่ 0x08048054
สูงสุด 0x08048054+0x0000e
.bss
เริ่มต้นที่ 0x08048054+0x0000e
สูงสุด 0x0804805+0x00016
หรือฉันขาดอะไรบางอย่างไป? โปรดชี้แจงให้ฉันด้วย
แก้ไข
ฉันใช้คำสั่งนี้เพื่อรับข้อมูลดังภาพ:
readelf -l filename
.bss
มาก่อน มันเป็นพฤติกรรมของคอมไพเลอร์ส่วนใหญ่ ในกรณีนี้ ถ้าเราถือว่ามันเป็นของคอมไพเลอร์นี้ด้วย ฉันคิดถูกเกี่ยวกับที่อยู่หรือไม่ - person The Mask   schedule 09.04.2014.bss
มาก่อน.bss
จะอยู่ที่0x08048054
และ.data
จะอยู่ที่0x08048054+0x0000e
ใช่ มันเป็นสมมติฐานที่ยุติธรรมที่จะทำ - person nonsensickle   schedule 09.04.2014ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
ในกรณีนี้ไม่มีสคริปต์ตัวเชื่อมโยงใช่ไหม - person The Mask   schedule 09.04.2014.bss
และ.data
ได้ - person nonsensickle   schedule 09.04.2014a
และb
บนเครื่อง 32 บิต โดยที่sizeof(int) = 4
,a
อยู่ที่0x08048054+0x0000e
และb
ที่0x08048054+0x0000e+0x4
ใช่ไหม หรือฉันควรพิจารณาอย่างอื่น - person The Mask   schedule 09.04.2014.bss
หากนั่นคือสิ่งที่เราตกลงกันว่า.bss
เซกเมนต์คือ เราก็สามารถสรุปได้ว่าa
และb
ทั้งคู่อยู่ในบล็อกของหน่วยความจำนั้น ฉันเคยตอบคำถามที่คล้ายกันมาแล้ว และจะพยายามหาลิงก์ที่ฉันมีมาให้กับคุณ - person nonsensickle   schedule 09.04.2014PT_LOAD
ส่วนที่สองซึ่งเป็น.data + .bss
ส่วนของเราด้วยกัน ขนาด p_filesiz และ p_memsiz จะถูกร้องขอและเคอร์เนลก็ขึ้นอยู่กับการจัดสรร (จัดสรรคำที่ถูกต้องหรือไม่)p_memsiz
ไบต์และความแตกต่างเป็นศูนย์ ระหว่างp_memsiz
ถึงp_filesiz
, - person The Mask   schedule 09.04.2014N = p_memsiz - p_filesiz
และN
คือขอบเขตหน่วยความจำ.bss
ที่ตอนนี้เต็มไปด้วยศูนย์ ในกรณีนี้ ที่อยู่ของบล็อกนี้ได้รับการจัดสรรใหม่โดยเคอร์เนลอยู่ที่ไหน กล่าวคือ การขอร้องของขอบเขตหน่วยความจำบล็อกนี้ (ในกรณีของเราที่นี่ ที่0x08048054
) เคอร์เนลแก้ไข p_paddr และใส่ที่อยู่ในนั้นหรือไม่ ฉันหวังว่ามันจะชัดเจน - person The Mask   schedule 09.04.2014p_vaddr
ในความคิดเห็นก่อนหน้า) - person The Mask   schedule 10.04.2014