2016-11-26 26 views
2

我絕對是綠色的,但是在課堂上,老師給我們提供了他爲我們寫的文件,只是爲了運行它而且它運行良好,但是當我試着在家裏做(我用Linux VirtualBox上)和使用:「對於`.bss'重定位R_X86_64_32S不能用於製作共享對象」

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 
+1

可能重複[什麼R \ _X86 \ _64 \ _32S和R \ _X86 \ _64 \ _64重定位是什麼意思?](http://stackoverflow.com/questions/6093547/what-do-r-x86-64 -32s-and-r-x86-64-64-relocation-mean) –

+0

關於使用的答案 gcc -shared -fPIC foo.c -o libfoo.so不能解決我的問題 – overflow

回答

2

你需要確定你正在寫position independent code。 PIC的想法是要使代碼真正實現位置無關,至少需要一個間接級別。這種間接尋址是IP相對尋址,如果這還不夠,則需要第二層,即全局偏移表或GOT。

在NASM中,您會發現DEFAULT REL指令有用。

相關問題