Assembly ld:非法文本重新定位(使用nasm组装的对象文件)

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

我试图从使用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_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显然不会进行文本重定位来修复绝对地址。谢谢各位,我仍然很难想象内存是如何工作的,比如虚拟内存之类的。但问题解决了。