Eu tenho o seguinte:
BITS 64
__NR_getuid equ 102
global sys_getuid
section .text
sys_getuid:
xor eax, eax
mov al, __NR_getuid
syscall
ret
Isso é compilado com:
nasm -f elf64 -o getuid.o getuid.asm
ld -shared -o libgetuid.so getuid.o
Porém sys_getuid
não é exportado. Testemunha:
#include <stdio.h>
extern int sys_getuid();
int main()
{
printf("UID = %d\n", sys_getuid());
return 0;
}
gcc -o junk -L. -lgetuid junk.c
/usr/bin/ld: /tmp/ccHOc4iR.o: in function `main':
junk.c:(.text+0xa): undefined reference to `sys_getuid'
collect2: error: ld returned 1 exit status
Como faço para exportar o símbolo?
Claramente não preciso de nenhuma informação de realocação para esta biblioteca, então devo ser capaz de fazer isso assim.
O símbolo já foi exportado:
Como comentou Michael Petch, seu problema é a linha de link incorreta. Usando
permite que seu executável seja vinculado e executado.
Entre os vinculadores UNIX comuns, apenas o LLD permite "definições antes das referências". Binutils GNU
ld
egold
não.