การถ่ายโอนข้อมูลหลักเป็นเพียงการถ่ายโอนข้อมูลของหน่วยความจำโปรแกรมของคุณหากคุณรู้ว่าทุกอย่างอยู่ที่ไหนคุณสามารถใช้สิ่งนั้นได้
คุณใช้ความสามารถในการปฏิบัติการได้เพราะมันอธิบายถึงสิ่งต่าง ๆ (ในแง่ของที่อยู่แบบลอจิคัล) ในหน่วยความจำเช่นไฟล์หลัก
หากคุณใช้คำสั่งobjdump
มันจะถ่ายโอนข้อมูลเมตาเกี่ยวกับวัตถุที่ปฏิบัติการได้ที่คุณกำลังตรวจสอบ การใช้วัตถุที่ปฏิบัติการได้ชื่อว่า a.out เป็นตัวอย่าง
objdump -h a.out
ดัมพ์ข้อมูลส่วนหัวเท่านั้นคุณจะเห็นส่วนชื่อเช่น .dataหรือ. bssหรือ. text (มีอีกมากมาย) สิ่งเหล่านี้แจ้งเคอร์เนลโหลดเดอร์ซึ่งในส่วนต่าง ๆ ของวัตถุสามารถพบได้และตำแหน่งใดในพื้นที่แอดเดรสของกระบวนการควรโหลดส่วนและในบางส่วน (เช่น. data. text) ควรจะโหลดอะไร (.bss ส่วนไม่มีข้อมูลใด ๆ ในไฟล์ แต่มันหมายถึงจำนวนหน่วยความจำที่จะจองในกระบวนการสำหรับข้อมูลที่ไม่มีการกำหนดค่าเริ่มต้นซึ่งจะเต็มไปด้วยศูนย์)
โครงร่างของไฟล์วัตถุที่ปฏิบัติการได้เป็นไปตามมาตรฐาน ELF
objdump -x a.out
- ทิ้งทุกอย่าง
หากวัตถุที่ปฏิบัติการได้ยังคงมีตารางสัญลักษณ์ (มันไม่ได้ถูกปล้น - man strip
และคุณใช้-g
ในการสร้างการดีบักเพื่อgcc
สมมติว่าการรวบรวมแหล่ง AC) จากนั้นคุณสามารถตรวจสอบเนื้อหาหลักโดยชื่อสัญลักษณ์เช่นถ้าคุณมีตัวแปร / บัฟเฟอร์ ชื่อinputLineในซอร์สโค้ดของคุณคุณสามารถใช้ชื่อนั้นgdb
เพื่อดูเนื้อหา คือgdb
จะรู้ว่าออฟเซ็ตจากจุดเริ่มต้นของโปรแกรมของคุณเริ่มต้นส่วนข้อมูลที่inputLineเริ่มและความยาวของตัวแปรนั้น
อ่านเพิ่มเติมarticle1 ,
ข้อ 2และสำหรับ nitty ทรายปฏิบัติการและการเชื่อมโยงรูปแบบ (ELF) สเปค
อัปเดตหลังจากความคิดเห็น @mirabilos ด้านล่าง
แต่ถ้าใช้ตารางสัญลักษณ์เหมือนใน
$ gdb --batch -s a.out -c core -q -ex "x buf1"
ผลิต
0x601060 <buf1>: 0x72617453
จากนั้นไม่ใช้ตารางสัญลักษณ์และตรวจสอบที่อยู่โดยตรง
$ gdb --batch -c core -q -ex "x 0x601060"
ผลิต
0x601060: 0x72617453
ฉันตรวจสอบหน่วยความจำโดยตรงโดยไม่ใช้ตารางสัญลักษณ์ในคำสั่งที่ 2
ฉันเห็นด้วยเช่นกันว่าคำตอบของ @ user580082 จะเพิ่มคำอธิบายเพิ่มเติมและจะโหวตให้