Linux &引用;重新定位R_X86_64_32S与`.bss';创建共享对象时不能使用”;
在这方面我绝对是新手,但在课堂上,老师给了我们他为我们编写的文件来运行它,当时它工作得很好,但当我尝试在家里做这件事时(我在VirtualBox上使用Linux),并使用: 我收到一个错误“针对`.bss'重新定位R_X86_64_32S在创建共享对象时无法使用;请使用-fPIC重新编译”。有人能解释一下如何使其工作吗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
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