我试图在汇编中编写一个库(共享对象)。我用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文件,以便我可以从第二个调用符号?