- บทความนี้สำรวจขีดจำกัดของรูปแบบไฟล์โมดูล .NET เพื่อสร้างไฟล์ปฏิบัติการที่เล็กที่สุดซึ่งพิมพ์ "Hello, World!" ออกสู่ standard output
- เพื่อใช้เป็นเงื่อนไขในการทดลอง ผู้เขียนกำหนดกติกาขึ้นเองว่าให้ใช้ managed entry point ที่เขียนด้วย C# หรือ CIL, รันบน .NET Framework 4.x.x และไม่มีการพึ่งพาไลบรารีของบุคคลที่สาม
- เพื่อค่อย ๆ ลดขนาดของไฟล์ปฏิบัติการ ผู้เขียนปิดใช้งาน nullable reference annotations, เขียนโมดูล .NET ด้วยมือ, ลบ imports และ base relocations, ตัด metadata ที่ไม่จำเป็นออก และปรับการใช้สตริง ASCII ให้เหมาะสม
- ผลลัพธ์สุดท้ายคือไฟล์ปฏิบัติการขนาด 889 ไบต์ ซึ่งเป็นขนาดต่ำสุดตามทฤษฎีที่เป็นไปได้ของไฟล์ .NET PE ที่ถูกต้อง
- ในบทความมีตัวอย่างโค้ดและคำอธิบายของแต่ละขั้นตอนที่ใช้เพื่อลดขนาดไฟล์ปฏิบัติการ
- ผู้เขียนเน้นย้ำถึงความสำคัญของการทำความเข้าใจรูปแบบไฟล์และการตัดสินใจเชิงกลยุทธ์เพื่อเพิ่มประสิทธิภาพขนาดไฟล์ปฏิบัติการ
- การย้ายสตริงไปไว้ในเซกเมนต์ padding ที่ไม่ได้ใช้งานช่วยลดขนาดไฟล์ลงได้อีก 13 ไบต์
- การลบการอ้างอิงถึง
mscorlib สามารถช่วยประหยัดพื้นที่ในไฟล์ไบนารีได้
- การตัด
VersionString ใน .NET metadata directory ช่วยประหยัดไบต์เพิ่มได้อีก
- ขนาดสุดท้ายของไฟล์ไบนารีคือ 834 ไบต์ และเมื่อบีบอัดแล้วสามารถลดลงได้อีกเหลือ 476 ไบต์
- แม้จะเป็นโปรเจกต์ที่ไม่ได้มีสาระสำคัญนัก แต่การสำรวจขีดจำกัดของระบบที่มีอยู่ก็อาจเป็นเรื่องสนุกได้
- ผู้เขียนเผยแพร่ซอร์สโค้ดทั้งหมดบน GitHub เพื่อใช้อ้างอิง
- บทความกล่าวถึง reverse engineering, code golf และการปรับแต่งไฟล์ PE ให้เล็กที่สุด
- ผู้เขียนแบ่งปันประสบการณ์ของตนและชวนให้ผู้อื่นลองสำรวจวิธีลดขนาดไฟล์เพิ่มเติม
- บทความนี้ได้รับอนุญาตภายใต้สัญญาอนุญาต CC BY 4.0 โดยผู้เขียน
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News