ELF Shared Object на языке ассемблера x86-64

Я пытаюсь создать общую библиотеку (*.so) в ASM и не уверен, что делаю это правильно...

Мой код таков:

    .section .data
    .globl var1
var1:
    .quad     0x012345

    .section .text
    .globl func1
func1:
    xor %rax, %rax
  # mov var1, %rcx       # this is commented
    ret

Для компиляции я запускаю

gcc ker.s -g -fPIC -m64 -o ker.o
gcc ker.o -shared -fPIC -m64 -o libker.so

Я могу получить доступ к переменной var1 и вызвать func1 с помощью dlopen() и dlsym() из программы на C.

Проблема в переменной var1. Когда я пытаюсь получить к ней доступ из func1, т.е. раскомментировать эту строку, компилятор выдает ошибку:

/usr/bin/ld: ker.o: relocation R_X86_64_32S against `var1' can not be used when making a shared object; recompile with -fPIC
ker.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

Я не понимаю. Я уже компилировал с -fPIC, так в чем дело?

7
задан Peter Cordes 23 January 2019 в 22:31
поделиться