链接共享对象中的函数 - ld

时间:2018-03-07 19:49:43

标签: linux assembly linker nasm x86-64

我试图在汇编中编写一个库(共享对象)。我用nasm编译并与ld链接。我有2个包含不同符号的ASM文件。我试图从第二个文件中调用第一个文件中包含的符号,但是ld不断抛出错误:relocation R_X86_64_PC32 against symbol 'strchr' can not be used when making a shared object; recompile with -fPIC

第一个文件包含:

BITS 64

section .text
    global strchr

strchr:
    push        rbp
    mov         rbp, rsp
    xor         rax, rax
looper:
    cmp         sil, byte [rdi]
    je          saveptr
    cmp         byte [rdi], 0x0
    je          endloop
    inc         rdi
    jmp         looper
saveptr:
    mov         rax, rdi
endloop:
    mov         rsp, rbp
    pop         rbp
    ret

第二个文件包含:

BITS 64

section .text
    extern strchr
    global strspn

strspn:
    push        rbp
    mov         rbp, rsp
    xor         rax, rax
    xor         r11, r11
    mov         rax, rdi
looper:
    cmp         byte [rsi], 0x0
    je          endloop
    push        rax
    mov         sil, byte [rsi]
    call        strchr
    cmp         rax, 0x0
    jne         increase
    inc         rsi
    mov         rax, rdi
    jmp         looper
increase:
    inc         r11
    inc         rax
    jmp         looper
endloop:
    mov         rax, r11
    mov         rsp, rbp
    pop         rbp
    ret

我正在通过这个过程编译库:

nasm -f elf64 first_file.asm -o first_file.o
nasm -f elf64 second_file.asm -o second_file.o
ld -shared first_file.o second_file.o -o mylib.so

如何链接第一个(已编译的)ASM文件,以便我可以从第二个调用符号?

0 个答案:

没有答案