LINUX.ORG.RU

История изменений

Исправление 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 - это константное значение