C (x86_64, tcc ), 7 ไบต์
main=6;
แรงบันดาลใจจากคำตอบนี้
ลองออนไลน์!
มันทำงานอย่างไร
แอสเซมบลีที่สร้างขึ้นมีลักษณะเช่นนี้
.globl main
main:
.long 6
โปรดทราบว่า TCC ไม่ได้วาง "ฟังก์ชั่น" ที่กำหนดไว้ในส่วนข้อมูล
หลังจากการรวบรวม_startจะชี้ไปที่หลักตามปกติ เมื่อโปรแกรมที่เกิดขึ้นจะถูกดำเนินการคาดว่ารหัสในหลักและพบน้อย endian (!) 32 บิตจำนวนเต็ม6ซึ่งจะถูกเข้ารหัสเป็น0x06 0x00 0x00 0x00 ไบต์แรก - 0x06 - เป็น opcode ที่ไม่ถูกต้องเพื่อให้โปรแกรมสิ้นสุดกับSIGILL
C (x86_64, gcc ), 13 ไบต์
const main=6;
ลองออนไลน์!
มันทำงานอย่างไร
หากไม่มีตัวดัดแปลงconstแอสเซมบลีที่สร้างจะมีลักษณะเช่นนี้
.globl main
.data
main:
.long 6
.section .note.GNU-stack,"",@progbits
ตัวเชื่อมโยงของ GCC ใช้บรรทัดสุดท้ายเป็นคำใบ้ว่าวัตถุที่สร้างขึ้นไม่จำเป็นต้องมีสแต็กที่เรียกใช้งานได้ เนื่องจากmainถูกวางไว้อย่างชัดเจนในส่วนของข้อมูล opcode ที่มีอยู่นั้นไม่สามารถเรียกใช้งานได้ดังนั้นโปรแกรมจะยุติการทำงานSIGSEGV (การแบ่งเซกเมนต์ผิด)
การลบบรรทัดที่สองหรือบรรทัดสุดท้ายจะทำให้งานที่สร้างขึ้นนั้นเป็นไปตามที่ต้องการ บรรทัดสุดท้ายอาจจะไม่สนใจที่มีธงคอมไพเลอร์-zexecstack
( ลองออนไลน์! ) แต่ค่าใช้จ่ายนี้12 ไบต์
ทางเลือกที่สั้นกว่าคือการประกาศmainด้วยตัวแก้ไขconstทำให้เกิดแอสเซมบลีต่อไปนี้
.globl main
.section .rodata
main:
.long 6
.section .note.GNU-stack,"",@progbits
สิ่งนี้ทำงานได้โดยไม่มีแฟล็กคอมไพเลอร์ โปรดทราบว่าmain=6;
จะเขียน "ฟังก์ชั่น" ที่กำหนดไว้ในข้อมูลแต่ตัวดัดแปลงconstทำให้ GCC เขียนในRodataแทนซึ่งอย่างน้อย (บนแพลตฟอร์มของฉัน) ได้รับอนุญาตให้มีรหัส
raise(SIGILL)
หรือไม่