Linux &引用;重新定位R_X86_64_32S与`.bss';创建共享对象时不能使用”;

Linux &引用;重新定位R_X86_64_32S与`.bss';创建共享对象时不能使用”;,linux,assembly,x86-64,nasm,linker-errors,Linux,Assembly,X86 64,Nasm,Linker Errors,在这方面我绝对是新手,但在课堂上,老师给了我们他为我们编写的文件来运行它,当时它工作得很好,但当我尝试在家里做这件事时(我在VirtualBox上使用Linux),并使用: 我收到一个错误“针对`.bss'重新定位R_X86_64_32S在创建共享对象时无法使用;请使用-fPIC重新编译”。有人能解释一下如何使其工作吗 global main extern printf section .data napis: db ' Hello world! - po raz %ld',10,0

在这方面我绝对是新手,但在课堂上,老师给了我们他为我们编写的文件来运行它,当时它工作得很好,但当我尝试在家里做这件事时(我在VirtualBox上使用Linux),并使用:

我收到一个错误“针对`.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

你需要确定你在写。PIC的思想是,要使代码真正独立于位置,你至少需要一个间接层。这个间接层是IP相对寻址,当这还不够时,你需要第二层,全局偏移表或GET


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

我也有同样的问题。GCC之所以会出现此错误,是因为它假设(这里的版本6.3.0)您正在构建一个共享对象(显然,您不是),因此.bss的存在让它变得疯狂。因此,您可以通过传递-static选项来解决此问题:
gcc hello.o-static-o hello
(在我的案例中使用),或者使用Clang作为链接器:
Clang hello.o-o hello
。后者没有任何抱怨。

关于使用gcc-shared-fPIC foo.c-o libfoo的答案可能重复。因此,这不会解决我的问题。可执行文件不需要通过GOT间接访问自己的函数/变量;这只是为了支持符号插入。
gcc-fPIC
意味着共享库符号插入,但现代默认的
gcc-fpie-pie
只需要避免32位绝对寻址。因此,是的,
default rel
。pie可执行文件实际上是ELF共享对象。更好的修复方法是尽可能避免32位绝对寻址使用
default rel
,或者在绝对寻址的情况下使用
-fno pie-no pie
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