【发布时间】:2017-06-28 22:10:41
【问题描述】:
我正在编译一个静态库,它利用了一些内联汇编代码。
我注意到当我为 jmp 指令使用标签时:
int foo(){
asm volatile
(
"mov 0x60(%r8),%r11d\n\t"
"jmp *S_401a70\n\t"
...
"S_401a70: xor %rax, %rax\n\t"
...
)
}
并将代码编译成带有以下标志的静态库:
-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
我会收到一些错误,例如:
/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
但是,由于我正在编译成一个静态库,我认为-fPIC 没有意义。我试过了,但它根本不起作用。
这似乎是gcc assembly extension 的问题,但我不确定。任何人都可以对此有所了解吗?谢谢!
【问题讨论】:
-
您是否尝试过从
jmp指令中删除间接(*)?这应该是一个相对的跳跃,这看起来像你想要的。
标签: c static-libraries static-linking linkage relocation