ที่อยู่ส่วนการโหลดที่สองของ ELF ของ .data + .bss

เอาต์พุต ELF ของ readelf

ในกรณีนี้ ที่อยู่ของ:

.data เริ่มต้นที่ 0x08048054 สูงสุด 0x08048054+0x0000e

.bss เริ่มต้นที่ 0x08048054+0x0000e สูงสุด 0x0804805+0x00016

หรือฉันขาดอะไรบางอย่างไป? โปรดชี้แจงให้ฉันด้วย

แก้ไข

ฉันใช้คำสั่งนี้เพื่อรับข้อมูลดังภาพ:

readelf -l filename

person The Mask    schedule 08.04.2014    source แหล่งที่มา
comment
คุณมีสิทธิ์เข้าถึง Linker Script หรือถูกคอมไพล์ด้วยสคริปต์ Linker เริ่มต้นหรือไม่ หากเป็นเช่นนั้น มีการใช้คอมไพเลอร์/ลิงเกอร์ตัวใด   -  person nonsensickle    schedule 09.04.2014
comment
ปัญหาคือ คุณไม่มีทางรู้ได้เลยว่า bss หรือ data อันไหนมาก่อน เว้นแต่คุณจะได้รับข้อมูลสคริปต์ตัวเชื่อมโยง (สมมติว่าคุณใช้ GCC หรือ Clang)   -  person nonsensickle    schedule 09.04.2014
comment
@nonsensickle: มันถูกคอมไพล์ด้วยคอมไพเลอร์ C เก่า ฉันไม่รู้ว่ามีการใช้ลิงเกอร์ แต่ฉันลองคิดดูได้ แต่โดยปกติแล้ว .bss มาก่อน มันเป็นพฤติกรรมของคอมไพเลอร์ส่วนใหญ่ ในกรณีนี้ ถ้าเราถือว่ามันเป็นของคอมไพเลอร์นี้ด้วย ฉันคิดถูกเกี่ยวกับที่อยู่หรือไม่   -  person The Mask    schedule 09.04.2014
comment
หากคุณสมมติว่า .bss มาก่อน .bss จะอยู่ที่ 0x08048054 และ .data จะอยู่ที่ 0x08048054+0x0000e ใช่ มันเป็นสมมติฐานที่ยุติธรรมที่จะทำ   -  person nonsensickle    schedule 09.04.2014
comment
ไฟล์ปฏิบัติการไม่ได้เชื่อมโยงแบบไดนามิกตามที่คำสั่ง file บอกว่า: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped ในกรณีนี้ไม่มีสคริปต์ตัวเชื่อมโยงใช่ไหม   -  person The Mask    schedule 09.04.2014
comment
ถูกต้อง ไลบรารีนั้นจะมีข้อมูลสัญลักษณ์ซึ่งจะผ่านสคริปต์ลิงก์เกอร์ที่แอปพลิเคชันของคุณใช้ ดังนั้น หากเป็นเช่นนั้น คุณสามารถควบคุมลำดับการจัดวาง .bss และ .data ได้   -  person nonsensickle    schedule 09.04.2014
comment
@nonsensickle: ขออภัย ฉันอยากจะหมายถึง .data มักจะมาก่อน   -  person The Mask    schedule 09.04.2014
comment
@nonsensickle: ขอบคุณมากสำหรับความคิดเห็น คุณสามารถพิจารณาย้ายเพื่อตอบ คำถามสุดท้าย: หากฉันมีตัวแปรส่วนกลางสองตัวที่มีค่าที่ไม่ได้กำหนดค่าเริ่มต้น เช่น a และ b บนเครื่อง 32 บิต โดยที่ sizeof(int) = 4, a อยู่ที่ 0x08048054+0x0000e และ b ที่ 0x08048054+0x0000e+0x4 ใช่ไหม หรือฉันควรพิจารณาอย่างอื่น   -  person The Mask    schedule 09.04.2014
comment
globals ที่ไม่ได้รับการกำหนดค่าเริ่มต้นและ globals ที่กำหนดค่าเริ่มต้นเป็นศูนย์อยู่ในเซ็กเมนต์ .bss หากนั่นคือสิ่งที่เราตกลงกันว่า .bss เซกเมนต์คือ เราก็สามารถสรุปได้ว่า a และ b ทั้งคู่อยู่ในบล็อกของหน่วยความจำนั้น ฉันเคยตอบคำถามที่คล้ายกันมาแล้ว และจะพยายามหาลิงก์ที่ฉันมีมาให้กับคุณ   -  person nonsensickle    schedule 09.04.2014
comment
ขอบคุณอีกครั้ง. มันช่วยได้มาก! ฉันกำลังพยายามทำความเข้าใจรูปแบบไฟล์ ELF (เพื่อสร้างของตัวเอง) ฉันไม่พบบทช่วยสอนที่ฉันสามารถเข้าใจสิ่งเฉพาะเหล่านี้ได้ (ฉันมีข้อกำหนดไฟล์ ELF อยู่แล้ว) ดังนั้นฉันจึงศึกษาผลลัพธ์ของคอมไพเลอร์เก่า ๆ บางตัวเนื่องจากมีความซับซ้อนน้อยกว่าและควรเรียนรู้ดีกว่าในตอนนี้   -  person The Mask    schedule 09.04.2014
comment
ขออภัย ฉันไม่พบลิงก์ที่ฉันคิดว่าฉันมี นี่คือโพสต์บนบล็อกที่ฉันทำเมื่อไม่นานมานี้ ไม่ใช่ทั้งหมดที่เกี่ยวข้อง แต่ฉันพูดถึงตำแหน่งที่คุณสามารถคาดหวังให้ตัวแปรของคุณถูกวางไว้เมื่อใช้ C blog.lazar.co.nz/post/71304177510/how-an-arm-cortex-m3-boots คุณสามารถข้ามโพสต์นั้นได้อย่างปลอดภัยประมาณครึ่งหนึ่ง และไปที่สิ่งที่เกี่ยวข้องกับลิงก์เกอร์   -  person nonsensickle    schedule 09.04.2014
comment
ขอบคุณสำหรับบทความ ฉันอ่านบทความทั้งหมดแล้ว ทำได้ดี. คำถามอื่น (สุดท้ายจริงๆ) ยังคงเกี่ยวข้อง: เมื่อเราสร้าง PT_LOAD ส่วนที่สองซึ่งเป็น .data + .bss ส่วนของเราด้วยกัน ขนาด p_filesiz และ p_memsiz จะถูกร้องขอและเคอร์เนลก็ขึ้นอยู่กับการจัดสรร (จัดสรรคำที่ถูกต้องหรือไม่) p_memsiz ไบต์และความแตกต่างเป็นศูนย์ ระหว่าง p_memsiz ถึง p_filesiz,   -  person The Mask    schedule 09.04.2014
comment
[ความต่อเนื่อง...] เช่น N = p_memsiz - p_filesiz และ N คือขอบเขตหน่วยความจำ .bss ที่ตอนนี้เต็มไปด้วยศูนย์ ในกรณีนี้ ที่อยู่ของบล็อกนี้ได้รับการจัดสรรใหม่โดยเคอร์เนลอยู่ที่ไหน กล่าวคือ การขอร้องของขอบเขตหน่วยความจำบล็อกนี้ (ในกรณีของเราที่นี่ ที่ 0x08048054) เคอร์เนลแก้ไข p_paddr และใส่ที่อยู่ในนั้นหรือไม่ ฉันหวังว่ามันจะชัดเจน   -  person The Mask    schedule 09.04.2014
comment
(ขออภัยฉันหมายถึง p_vaddr ในความคิดเห็นก่อนหน้า)   -  person The Mask    schedule 10.04.2014


คำตอบ (2)


ตกลง แล้วฉันจะเริ่มต้นจากตรงไหน... ใช่ ทั้ง .data และ .bss อยู่ในภูมิภาคนั้นในหน่วยความจำ ปัญหาคือไม่มีทางรู้ได้ว่าพวกมันอยู่ในลำดับใด

เราสามารถสรุปได้ว่ามีการปฏิบัติตามลำดับเริ่มต้นและคาดเดาอย่างมีหลักการ แต่ฉันไม่ชอบสิ่งนั้น

จากกระทู้ความคิดเห็นที่ยาวเหยียดใต้คำถามที่คุณพูดถึงสิ่งที่น่าสนใจซึ่งไม่ชัดเจนในคำถามของคุณ

ไฟล์ปฏิบัติการไม่ได้เชื่อมโยงแบบไดนามิกตามที่คำสั่งไฟล์บอกว่า: ปฏิบัติการ ELF 32 บิต LSB, Intel 80386, เวอร์ชัน 1 (SYSV), เชื่อมโยงแบบคงที่, ถอดออกในกรณีนี้, ไม่มีสคริปต์ตัวเชื่อมโยงใช่ไหม - หน้ากาก

ในกรณีนี้ไลบรารีจะมีตารางสัญลักษณ์ที่มีการออฟเซ็ตสัญลักษณ์ทั้งหมด ตารางนี้มีข้อมูลส่วนต่างๆ ตัวเชื่อมโยงจะได้รับการประมวลผลเมื่อคุณรวบรวมใบสมัครของคุณ เมื่อถึงจุดนั้น สคริปต์ตัวเชื่อมโยงของคุณจะควบคุมลำดับของการใส่ส่วน .data และ .bss

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

ตัวฉันเองได้ถามคำถาม ที่ไม่เกี่ยวข้อง แต่มีโค้ดตัวอย่างของสคริปต์ตัวเชื่อมโยงและโค้ด C บางส่วน ในสคริปต์ตัวเชื่อมโยงนั้น ส่วน .bss จะอยู่ หลัง ส่วน .data

person nonsensickle    schedule 09.04.2014
comment
ขอบคุณมาก ๆ. และไม่ ลิงค์นี้มีประโยชน์ ไม่ต้องถอดออก - person The Mask; 09.04.2014

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

หากต้องการดูส่วนหัวของส่วน ให้ใช้:

อ่านเอลฟ์ -S

person Tom Gooding    schedule 10.04.2014