คำถามติดแท็ก elf

ELF ย่อมาจาก Executable และ Linkable Format ซึ่งเป็นรูปแบบไฟล์สำหรับไฟล์ที่มีรหัสเครื่อง

8
เราสามารถรับข้อมูลคอมไพเลอร์จากเอลฟ์ไบนารีได้หรือไม่?
มีโอกาสบ้างไหมที่จะรู้วิธีสร้างไบนารีภายใต้ Linux? (และหรือ Unix อื่น ๆ ) คอมไพเลอร์, รุ่น, เวลา, ตั้งค่าสถานะ ฯลฯ ... ฉันดูreadelfและไม่พบอะไรมาก แต่อาจมีวิธีอื่นในการวิเคราะห์รหัสไบนารี / ส่วน ฯลฯ ... สิ่งใดที่คุณรู้วิธีการแยก?

2
ไบนารีที่เก่าแก่ที่สุดทำงานบน Linux?
ในการสนทนาเกี่ยวกับความเข้ากันได้ย้อนหลังใน Linux kernel และ GUI ABIs Alan Cox กล่าวว่า " เคอร์เนล 3.6rc ของฉันจะยังคงใช้ Rogue binary ที่สร้างขึ้นในปี 1992 X กลับเข้ากันได้กับแอพที่เก่ากว่า Linux " ดังนั้นวิธีที่เข้ากันได้ย้อนหลังเป็น Linux Application binary interfaces ? อะไรคือไบนารีที่รันได้ที่เก่าแก่ที่สุดที่เขียนจริงและรวบรวมเมื่อหลายปีก่อนที่จะยังคงทำงานบนการกระจายลีนุกซ์สำหรับจุดประสงค์ทั่วไปที่ทันสมัย? ฉันแน่ใจว่าคำเหล่านั้นทั้งหมดอาจมีการตีความ ความคิดหลักของฉันคือมันไม่ยุติธรรมที่จะเรียกใช้ผ่านเครื่องจำลองหรือเครื่องเสมือนพิเศษหรือนักแปลไบนารี่ แต่สิ่งเหล่านี้บางอย่างอาจถูกสร้างขึ้นใน distros ที่ทันสมัยและการเรียนรู้เกี่ยวกับสิ่งนั้นเป็นส่วนหนึ่งของความสนุกที่นี่ การเปลี่ยนแปลงตามสถาปัตยกรรมฮาร์ดแวร์รูปแบบไฟล์ที่ปฏิบัติการได้ภาษาและการพึ่งพาการโหลดแบบไดนามิกของไลบรารีที่สำคัญก็เป็นที่สนใจเช่นกัน หมายเหตุเมื่อกฎผ่อนคลายนี่เป็นตัวอย่างหนึ่งของการย้อนกลับ หน้า 2002 Web เล่น a.out executables บน Red Hat Linux ทันสมัยการเจรจาเกี่ยวกับการใช้มันเก่าลินุกซ์ก่อนเอลฟ์ a.out รูปแบบ executables หลังจากทำmodprobe …

10
ทำไมโปรแกรมไม่กระจายในรูปแบบที่คอมไพล์แล้ว?
แต่พวกเขาให้คำแนะนำเช่น cd downloaded_program ./configure make install สิ่งนี้จะสร้างเอลฟ์ที่จำเป็นและอาจเป็นไฟล์. so บางไฟล์ ทำไมไม่วางไฟล์เหล่านั้นไว้ในไฟล์ zip เพื่อดาวน์โหลดเช่นเดียวกับแอพ windows? มีเหตุผลใดที่พวกเขาต้องรวบรวมโดยผู้ใช้?

2
ELF Magic คืออะไร
ฉันเคยเห็นการสนทนาก่อนหน้านี้เกี่ยวกับเวทมนตร์เอลฟ์ล่าสุดความคิดเห็นในคำถามแลกเปลี่ยนความปลอดภัยสแต็คนี้ ฉันเคยเห็นมาแล้วและฉันเห็นมันในบันทึกการบูตของตัวเอง .. แต่ฉันไม่แน่ใจว่ามันคืออะไร man pageบน elf นั้นค่อนข้างเหนือหัวฉันเพราะฉันไม่ได้ใช้ภาษา C หรือภาษาระดับต่ำกว่า ในฐานะที่เป็นคนที่ใช้ Linux เป็นระบบปฏิบัติการทุกวันเอลฟ์คืออะไร
26 elf 

1
“ LSB” หมายถึงอะไรเมื่ออ้างถึงไฟล์ที่สามารถใช้งานได้ในเอาต์พุตของ / bin / ไฟล์?
ฉันได้พบคำว่า" LSB executable"หรือ" LSB shared object"ในผลลัพธ์ของfileคำสั่งใน Linux ตัวอย่างเช่น: $ file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=4637713da6cd9aa30d1528471c930f88a39045ff, stripped "LSB" หมายถึงอะไรในบริบทนี้

1
เหตุใดคำสั่ง file จึงบอกว่า ELF ไบนารีมีไว้สำหรับ Linux 2.6.9
เมื่อใดก็ตามที่ฉันเรียกใช้ไฟล์บนไบนารี ELF ฉันจะได้รับผลลัพธ์นี้: [jonescb@localhost ~]$ file a.out a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped ฉันแค่สงสัยว่ามีการเปลี่ยนแปลงอะไรใน Linux 2.6.9 ที่ไบนารีนี้ไม่สามารถทำงานบน 2.6.8 ได้? ไม่รองรับ ELF ใน Linux 2.0 หรือไม่
18 linux  executable  elf 

2
ตรวจสอบว่ากระบวนการเฉพาะเป็น 32- หรือ 64- บิต
ให้เคอร์เนล 2.6.x หรือใหม่กว่า Linux และ userland ที่มีอยู่ซึ่งสามารถใช้งานทั้ง ELF32 และ ELF64 ไบนารี (เช่นที่ผ่านมาฉันจะรู้ได้อย่างไรว่า CPU ของฉันรองรับระบบปฏิบัติการ 64 บิตภายใต้ Linux? ) ฉันจะทราบได้อย่างไรว่ากระบวนการที่กำหนด โดย PID) กำลังทำงานในโหมด 32- หรือ 64- บิต? วิธีแก้ปัญหาไร้เดียงสาจะทำงาน: file -L /proc/pid/exe | grep -o 'ELF ..-bit [LM]SB' แต่ข้อมูลนั้นถูกเปิดเผยโดยตรง/procโดยไม่ต้องพึ่งพาlibmagicหรือไม่
14 linux  64bit  proc  elf 

1
Linux, GNU GCC, ld, สคริปต์เวอร์ชันและรูปแบบไบนารีของ ELF - มันทำงานอย่างไร
ฉันพยายามเรียนรู้เพิ่มเติมเกี่ยวกับการกำหนดเวอร์ชันของไลบรารีใน Linux และวิธีการทำให้ทุกอย่างทำงานได้ นี่คือบริบท: - ฉันมีสองรุ่นของห้องสมุดแบบไดนามิกซึ่งเผยให้เห็นชุดเดียวกันของอินเตอร์เฟซพูดและlibsome1.solibsome2.so - libsome1.soโปรแกรมที่มีการเชื่อมโยงกับ - โปรแกรมนี้จะใช้ในการโหลดแบบไดนามิกโมดูลอื่นพูดlibdl.solibmagic.so - ตอนนี้มีการเชื่อมโยงกับlibmagic.so libsome2.soเห็นได้ชัดโดยไม่ต้องใช้สคริปต์ลิงเกอร์สัญลักษณ์ซ่อนตัวอยู่ในlibmagic.soที่เวลาทำงานทุกสายอินเตอร์เฟซในการได้รับการแก้ไขไปlibsome2.so libsome1.soนี้ได้รับการยืนยันโดยการตรวจสอบค่าส่งกลับโดยเทียบกับมูลค่าของแมโครlibVersion()LIB_VERSION - ดังนั้นฉันลองถัดไปเพื่อคอมไพล์และเชื่อมโยงlibmagic.soกับสคริปต์ linker ซึ่งซ่อนสัญลักษณ์ทั้งหมดยกเว้น 3 ซึ่งกำหนดไว้ในlibmagic.soและถูกส่งออกโดยมัน ใช้งานได้ ... หรืออย่างน้อยที่สุดlibVersion()และLIB_VERSIONค่าตรงกัน (และรายงานรุ่น 2 ไม่ใช่ 1) - อย่างไรก็ตามเมื่อโครงสร้างข้อมูลบางอย่างต่อเนื่องเป็นดิสก์ฉันสังเกตเห็นความเสียหายบางอย่าง ในไดเรกทอรีของแอปพลิเคชันหากฉันลบlibsome1.soและสร้างลิงค์ซอฟต์ลิสต์ในตำแหน่งที่จะชี้ไปlibsome2.soทุกอย่างทำงานได้ตามที่คาดหวังและความเสียหายเดียวกันจะไม่เกิดขึ้น ฉันอดไม่ได้ที่จะคิดว่าสิ่งนี้อาจเกิดขึ้นเนื่องจากความขัดแย้งในการแก้ปัญหาสัญลักษณ์ของลิงเกอร์ ฉันได้ลองหลายสิ่งหลายอย่างเช่นพยายามเชื่อมโยงlibsome2.soเพื่อให้สัญลักษณ์ทั้งหมดเป็นสัญลักษณ์symbol@@VER_2(ซึ่งฉันยังสับสนอยู่เพราะคำสั่งnm -CD libsome2.soยังคงแสดงสัญลักษณ์เป็นsymbolและไม่ใช่symbol@@VER_2) ... ดูเหมือนจะไม่มีอะไรทำงาน !!! ช่วยด้วย!!!!!!

1
เมื่อใดที่ฉันจะแก้ไขสตริงในไบนารีที่สามารถเรียกทำงานได้
ฉันมีไบนารีที่ปฏิบัติการได้; a.outขอเรียกว่า ฉันสามารถดูไบนารีมีสตริง $ strings a.out ... /usr/share/foo .... ฉันจำเป็นต้องเปลี่ยนสายไป/usr/share/foo /usr/share/barฉันสามารถแทนที่สตริงด้วยsedหรือไม่: sed -i 's@/usr/share/foo@/usr/share/bar@' a.out นี่เป็นสิ่งที่ควรทำ สิ่งนี้จะใช้งานได้เมื่อสายไม่ยาวเท่ากันหรือไม่

3
ตรวจสอบว่า ELF ไบนารีถูกสร้างขึ้นด้วยเครื่องมือ gprof หรือไม่
มันเป็นไปได้ที่จะตรวจสอบว่าโปรแกรมที่กำหนดได้รับการรวบรวมกับ GNU gprof วัดคือมี '-pg' ธงส่งผ่านไปยังทั้งคอมไพเลอร์และลิงเกอร์, โดยไม่ต้องใช้มันเพื่อตรวจสอบว่ามันจะสร้างgmon.outไฟล์?

1
ทำไมผู้อ่านถึงแสดง“ System V” เป็นระบบปฏิบัติการของฉันแทนที่จะเป็น Linux
ฉันรวบรวมโปรแกรม C ขนาดเล็ก (รหัส 2 บรรทัด) กับ gcc เพื่อพยายามทำความเข้าใจกับรูปแบบไฟล์ ELF ทำreadelf -hในไฟล์วัตถุฉันมีในส่วนหัว: OS/ABI: UNIX - System V ฉันกำลังใช้งาน Fedora ดังนั้นทำไมไม่ใช้ Linux แทนล่ะ แก้ไข : ฉันรวบรวม int main(){ int x = 0; x++; } gcc -o main.o -c main.cกับ รุ่น gcc ของฉันคือ gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
10 linux  elf 

1
ส่วนไหนของเอลฟ์ที่ปฏิบัติการได้ถูกโหลดเข้าสู่หน่วยความจำและที่ไหน
สิ่งที่ฉันรู้แล้ว: ปฏิบัติการของ ELF นั้นมีหลายส่วนโดยเฉพาะอย่างยิ่งส่วน. text และ. data ที่ถูกโหลดเข้าสู่หน่วยความจำเนื่องจากเป็นส่วนหลักของโปรแกรม แต่สำหรับโปรแกรมที่ทำงานมันต้องการข้อมูลเพิ่มเติมโดยเฉพาะเมื่อเชื่อมโยงแบบไดนามิก สิ่งที่ฉันสนใจคือส่วนต่างๆเช่น. plt, .got, .dynamic, .dynsym, .dynstr etcetera ส่วนต่างๆของเอลฟ์ที่รับผิดชอบการเชื่อมโยงฟังก์ชั่นไปยังที่อยู่ จากสิ่งที่ฉันสามารถคิดได้จนถึงตอนนี้ก็คือสิ่งต่าง ๆ เช่น. symtab และ. strtab ไม่ได้รับการโหลด (หรือไม่อยู่) ในหน่วยความจำ แต่ .dynsym และ. dynstr ถูกใช้โดย linker หรือไม่ พวกเขาอยู่ในความทรงจำหรือไม่? ฉันสามารถเข้าถึงได้จากรหัสโปรแกรมหรือไม่ และมีส่วนใดของปฏิบัติการที่อยู่ในหน่วยความจำเคอร์เนล? ความสนใจของฉันในเรื่องนี้ส่วนใหญ่เป็นนิติวิทยาศาสตร์ แต่ข้อมูลใด ๆ ในหัวข้อนี้จะช่วยได้ ทรัพยากรที่ฉันได้อ่านเกี่ยวกับตารางเหล่านี้และการเชื่อมโยงแบบไดนามิกอยู่ในระดับสูงมากขึ้นพวกเขาอธิบายเฉพาะการทำงานไม่ใช่สิ่งที่เป็นประโยชน์เกี่ยวกับเนื้อหาในหน่วยความจำ แจ้งให้เราทราบหากมีข้อสงสัยเกี่ยวกับคำถามของฉัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.