0
votes

I am compiling a static library, which leverages some inline assembly code.

I notice that when I use labels for the jmp instruction:

int foo(){

 asm volatile
 (
    "mov    0x60(%r8),%r11d\n\t"
    "jmp    *S_401a70\n\t"
    ...
    "S_401a70: xor %rax, %rax\n\t"
    ...
 )
}

and compile the code into a static library with the following flags:

-Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SOME_LIBRARY_PATH) \
-Wl,--whole-archive -l$(SOME_Library_Name) -Wl,--no-whole-archive \
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic  \
-Wl,--defsym,__ImageBase=0 

I would get some errors like:

/usr/bin/ld: Enclave/libtest.o: relocation R_X86_64_32S against `.text' can not be used when making a shared object; recompile with -fPIC

However, since I am compiling into a static library, I don't think -fPIC would make sense. I tried so, but it doesn't work at all.

This seems like an issue with the gcc assembly extension, but I am not sure. Could anyone shed some lights on this? Thank you!

1
Have you tried removing the indirect (*) from the jmp instruction? That should make a relative jump instead, which looks like what you want.owacoder

1 Answers

1
votes

It is not a tool issue. First of all -fPIC affects only C code. And affects it in such way that generated code won't contain absolute addresses of referred data/code and won't rely on its own address in memory (it is a somewhat simplified explanation). Next - it has nothing to do with assembly inlines. Since here code was generated by programmer. And if it is written in a way that introduces absolute addresses or some stuff that introduces dependency on its memory location - compiler can't help with it.

P.S. You may built static library even with position-dependent code but it won't be accepted by linker if someone will try to link it into shared library, since resulting shared library should be position-independent.