以下代码编译成可执行文件没有问题:
static const char *foo = "bar";
void main(void)
{
__asm__ ("mov %0,%%rax"
:
: "i"(&foo)
: "%rax");
}
但作为一个共享库,我得到一个错误:
static const char *foo = "bar";
void zot(void)
{
__asm__ ("mov %0,%%rax"
:
: "i"(&foo)
: "%rax");
}
编译结果:
hacker@lab$ gcc -shared -o mini-lib mini-lib.c
/usr/bin/ld: /tmp/ccwume3d.o: relocation R_X86_64_32S against `.data'
can not be used when making a shared object; recompile with -fPIC
/tmp/ccwume3d.o: error adding symbols: Bad value
编译-fPIC
没有区别。我怎样才能调整它以使链接器重新定位对地址的引用foo
?它必须是 asm 中的立即整数操作数。
更新:我最终使用了一条不同的指令,它需要一个内存操作数,因为显然没有办法用立即操作数来做到这一点。