В общем, когда код собирается под x86-64, то в относительно свежих дистрибутивах Linux включен ASLR
https://ru.wikipedia.org/wiki/ASLRКоторый требует, чтобы ассемблерный код был позиционно независимым
https://ru.bmstu.wiki/PIE_(Position_Independent_Execution)Самый простой вариант - указать gcc флаг
-no-pie
- тогда не будет требоваться, чтобы ассемблерный код был позиционно независимым.
Либо можно подправить код в стиле RIP-relative адресации, например вместо такого:
.data
hello_str:
.asciz "Hello, world!\n"
.set hello_str_length, . - hello_str - 1
.text
.global main
main:
movq $1, %rax
movq $1, %rdi
movq $hello_str, %rsi
movq $hello_str_length, %rdx
syscall
movq $60, %rax
movq $0, %rdi
syscall
переписать так:
.data
hello_str:
.asciz "Hello, world!\n"
.set hello_str_length, . - hello_str - 1
.text
.global main
main:
mov $1, %rax
mov $1, %rdi
lea hello_str(%rip), %rsi
mov $hello_str_length, %rdx
syscall
mov $60, %rax
mov $0, %rdi
syscall