【问题标题】:relocation R_X86_64_32S against `.text' can not be used when making a shared object重定位 R_X86_64_32S 对 `.text' 在制作共享对象时不能使用
【发布时间】: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


【解决方案1】:

这不是工具问题。首先-fPIC 只影响C 代码。并以这样的方式影响它,生成的代码不会包含引用数据/代码的绝对地址,也不会依赖于它自己在内存中的地址(这是一个有点简化的解释)。接下来 - 它与汇编内联无关。由于这里的代码是由程序员生成的。如果它的编写方式引入了绝对地址或一些引入了对其内存位置的依赖的东西 - 编译器将无能为力。

附:即使使用与位置相关的代码,您也可以构建静态库,但如果有人试图将其链接到共享库,则链接器不会接受它,因为生成的共享库应该与位置无关。

【讨论】:

  • 嗯,我认为主要是因为label。原因是当我注释掉"jmp *S_401a70\n\t"时,构建过程就正确了。
猜你喜欢
  • 2017-04-10
  • 2018-06-19
  • 2016-06-06
  • 1970-01-01
  • 2017-07-23
  • 2018-09-01
  • 2018-08-12
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多