Pendant le travail sur un projet, j'ai rencontré un problème : je n'arrive pas à construire une bibliothèque . J'ai reçu l'erreur suivante : relocation R_X86_64_PC32 par rapport au symbole '' ne peut pas être utilisé lors de la création d'un objet partagé ; recompilez avec -fPIC Finalement, j'ai réussi à trouver la cause racine. Et c'était la fonction récursive dans la bibliothèque. Par exemple, j'ai l'exemple bien connu suivant:
.section .text
.globl factorial
.type factorial,STT_FUNC
factorial:
push %rbp
mov %rsp,%rbp
mov 16(%rbp),%rax
cmp $1,%rax
je end_factorial
dec %rax
push %rax #c'est ainsi que nous passons l'argument à la fonction
call factorial
pop %rbx
inc %rbx
imul %rbx,%rax
end_factorial:
mov %rbp, %rsp
pop %rbp
ret
Maintenant, essayons de construire la bibliothèque partagée :
as -g -o fact.o fact.s
ld -shared fact.o -o libfact.so
ld: fact.o: relocation R_X86_64_PC32 par rapport au symbole `factorial' ne peut pas être utilisé lors de la création d'un objet partagé ; recompilez avec -fPIC
Si j'encapsule la fonction factorial, comme ceci :
.section .text
.globl fact
.type fact,STT_FUNC
fact:
factorial:
push %rbp
mov %rsp,%rbp
mov 16(%rbp),%rax
cmp $1,%rax
je end_factorial
dec %rax
push %rax #c'est ainsi que nous passons l'argument à la fonction
call factorial
pop %rbx
inc %rbx
imul %rbx,%rax
end_factorial:
mov %rbp, %rsp
pop %rbp
ret
Je peux construire la bibliothèque sans erreurs.
La question est : pourquoi ai-je une erreur lors de la construction d'une bibliothèque partagée qui contient une fonction récursive? P.S. Le lien statique fonctionne bien dans ce cas. Merci !