История изменений
Исправление praseodim, (текущая версия) :
Самое интересное - что компилятор попытался не дать изменить значение и можно было бы обойтись без Segmentation fault. Тогда код просто вхолостую бы отрабатывал.
$gcc -S weirdConst.c -o weirdConst.s
$cat weirdConst.s
.file "weirdConst.c"
.text
.section .rodata
.align 4
.type a0, @object
.size a0, 4
a0:
.zero 4
.LC0:
.string "%u\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
leaq a0(%rip), %rax
movl $102, (%rax)
movl $0, %eax
movl %eax, %esi
leaq .LC0(%rip), %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 8.3.0-6) 8.3.0"
.section .note.GNU-stack,"",@progbits
Если заменить в третьей строчке ассемблерного листинга .rodata на просто .data и потом скомпилировать, то сегфолта не будет и программа нормально исполнится, выдав константный ноль.
$gcc weirdConst.s -o weirdConst
$./weirdConst
0
Видно, что отрабатывается засылка значени 102 movl $102, (%rax) но затем она уничтожается movl $0, %eax 0 - это константное значение
Исправление praseodim, :
Самое интересное - что компилятор попытался не дать изменить значение и можно было бы обойтись без Segmentation fault. Тогда код просто вхолостую бы отрабатывал.
$gcc -S weirdConst.c - o weirdConst.s
$cat weirdConst.s
.file "weirdConst.c"
.text
.section .rodata
.align 4
.type a0, @object
.size a0, 4
a0:
.zero 4
.LC0:
.string "%u\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
leaq a0(%rip), %rax
movl $102, (%rax)
movl $0, %eax
movl %eax, %esi
leaq .LC0(%rip), %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 8.3.0-6) 8.3.0"
.section .note.GNU-stack,"",@progbits
Если заменить в третьей строчке ассемблерного листинга .rodata на просто .data и потом скомпилировать, то сегфолта не будет и программа нормально исполнится, выдав константный ноль.
$gcc weirdConst.s -o weirdConst
$./weirdConst
0
Видно, что отрабатывается засылка значени 102 movl $102, (%rax) но затем она уничтожается movl $0, %eax 0 - это константное значение
Исходная версия praseodim, :
Самое интересное - что компилятор попытался не дать изменить значение и можно было бы обойтись без Segmentation fault. Тогда код просто вхолостую бы отрабатывал.
$gcc -S weirdConst.c - o weirdConst.s
$cat weirdConst.s
.file "weirdConst.c"
.text
.section .rodata
.align 4
.type a0, @object
.size a0, 4
a0:
.zero 4
.LC0:
.string "%u\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
leaq a0(%rip), %rax
movl $102, (%rax)
movl $0, %eax
movl %eax, %esi
leaq .LC0(%rip), %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 8.3.0-6) 8.3.0"
.section .note.GNU-stack,"",@progbits
Если заменить в третьей строчке ассемблерного листинга .rodata на просто .data и потом скомпилировать, то сегфолта не будет и программа нормально исполнится, выдав константный ноль.
$gcc weirdConst.s -o weirdConst
$./weirdConst
0
Видно, что отрабатывается засылка значени 102 movl $102, (%rax) но затем она уничтожается movl $0, %eax 0 - это константное значение