2

次のコードは、問題なく実行可能ファイルにコンパイルされます。

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 の即値整数オペランドである必要があります。


更新:メモリオペランドを取る別の命令を使用することになりました。これは、即値オペランドでこれを行う方法が明らかにないためです。

4

1 に答える 1