“在制作共享对象时,不能使用”.bss“重定位R_X86_64_32S”

时间:2016-11-26 17:05:11

标签: linux

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

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

我收到错误“在制作共享对象时无法使用针对`.bss'的重定位R_X86_64_32S;使用-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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我有同样的问题。 GCC出现此错误的原因是(假设此处为6.3.0版)您正在构建共享库(显然不是),因此 .bss 的存在使它发疯。因此,您可以通过传递 -static 选项:gcc hello.o -static -o hello(在我的情况下有效)来解决此问题,或者使用 Clang 作为链接器:clang hello.o -o hello 。后者没有任何抱怨。