我在这方面绝对是绿色的,但是在课堂上,老师给了我们文件,他只是为我们编写它来运行它然后工作正常,但是当我尝试在家里做(我在VirtualBox上使用Linux)并使用:

nasm -f elf64 hello.asm -o hello.o
gcc hello.o -o hello

我得到一个错误“在制作共享对象时不能使用重定位R\_X86\_64\_32S对`.bss’;使用-fPIC重新编译”.有人可以解释一下如何使它工作吗?

global main
extern printf

section .data
napis:      db ' Hello world! - po raz %ld',10,0

liczba_iteracji: equ 5

section .bss
licznik: resb 1

section .text

main:

push    rbp
mov rbp,rsp

mov byte [licznik],0

petla:              ;naiwna!

inc byte [licznik]

mov rdi, qword napis
mov rsi, qword [licznik]
mov rax, 0
call    printf

cmp byte [licznik],liczba_iteracji
jnz petla

mov rsp,rbp
pop rbp

mov rax,1           ;SYS_EXIT
mov rbx,0
int 80h

解决方法:

你需要确定你正在编写position independent code.PIC的想法是,为了使代码真正与位置无关,你需要至少一个级别的间接.该间接级别是IP相对寻址,当这还不够时,您将需要第二层,全局偏移表或GOT.


在NASM中,您会发现DEFAULT REL指令很有用.

标签: linux

相关文章推荐

添加新评论,含*的栏目为必填