gpt4 book ai didi

c - 创建共享对象时不能使用针对 `.text' 的重定位 R_X86_64_32S

转载 作者:行者123 更新时间:2023-11-30 14:56:18 24 4
gpt4 key购买 nike

我正在编译一个静态库,它利用一些内联汇编代码。

我注意到,当我为 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 程序集扩展 的问题,但我不确定。有人能解释一下吗?谢谢!

最佳答案

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

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

关于c - 创建共享对象时不能使用针对 `.text' 的重定位 R_X86_64_32S,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com