Assembly ld:非法文本重新定位(使用nasm组装的对象文件)
我试图从使用NASM组装的对象文件创建动态库,但出现以下错误: ld:对于体系结构x86\u 64,从objects/ft\u puts.o中的“\u ft\u puts”非法将文本重新定位到objects/ft\u puts.o中的“换行符” 这是我的Assembly ld:非法文本重新定位(使用nasm组装的对象文件),assembly,nasm,x86-64,ld,dylib,Assembly,Nasm,X86 64,Ld,Dylib,我试图从使用NASM组装的对象文件创建动态库,但出现以下错误: ld:对于体系结构x86\u 64,从objects/ft\u puts.o中的“\u ft\u puts”非法将文本重新定位到objects/ft\u puts.o中的“换行符” 这是我的ft\u put.s: SYS_WRITE equ 0x2000004 STDOUT equ 1 section .data newline db 10 section .text global _ft_puts
ft\u put.s
:
SYS_WRITE equ 0x2000004
STDOUT equ 1
section .data
newline db 10
section .text
global _ft_puts
_ft_puts:
push rbp
mov rbp, rsp
mov rdx, rdi ; save address of str to print
; calculate len of string pointed by rdi
mov rcx, -1
xor rax, rax
repnz scasb
not rcx
push rcx ; save string length (+1 for the '\n' to add)
dec rcx
; print the string
mov rax, SYS_WRITE
mov rdi, STDOUT
mov rsi, rdx
mov rdx, rcx
syscall
; print the \n
mov rax, SYS_WRITE
mov rsi, newline
mov rdx, 1
syscall
pop rax
return:
pop rbp
ret
这是我的makefile:
$(LIB): $(OBJECTS)
gcc -dynamiclib -o $@ $(addprefix $(OBJECTS_D), $^)
# ranlib $@
%.o: $(SOURCES_D)%.s
$(NASM) $^ -o $(OBJECTS_D)$@
我使用的是macOS Sierra 10.12.6,NASM版本2.13.03。我不知道如何解决这个问题,所以如果有人能帮忙,并解释这个错误是从哪里来的?
谢谢。将
mov-rsi,newline
更改为lea-rsi,[rel-newline]
以生成位置独立代码。PS:将其放入只读部分,甚至根据需要在堆栈上创建它可能是一个好主意。但与可执行文件不同,共享库不能将mov r64、imm64
与64位绝对地址一起使用:当将库加载到任意虚拟地址时,OS X显然不会进行文本重定位来修复绝对地址。谢谢各位,我仍然很难想象内存是如何工作的,比如虚拟内存之类的。但问题解决了。