gpt4 book ai didi

c++ - 用 GCC 编译时还需要使用 -fPIC 吗?

转载 作者:可可西里 更新时间:2023-11-01 16:39:32 31 4
gpt4 key购买 nike

在 gcc 目标机器上,当一个人想要编译一个共享库时,需要指定 -fpic 或 -fPIC 才能使事情正常工作。这是因为默认情况下使用绝对寻址,这适用于对自己的地址空间具有完全控制权的可执行文件,但不适用于可以加载到可执行文件地址空间中任何位置的共享库。

然而,现代内核现在正在实现地址空间随机化,并且许多现代架构都支持 PC 相对寻址。这一切似乎都使绝对寻址变得不可用(地址空间随机化)或不需要(PC 相对寻址)。

我还注意到 clang 没有 -fPIC 选项,这让我觉得它不再是必需的。

那么 -fPIC 现在是多余的还是需要生成单独的 .o 文件,一个用于静态库,一个用于共享库?

最佳答案

您仍然需要使用-fPIC 进行编译。使用 pc 相对寻址无法解决该问题。问题是如何解析外部符号。在动态链接程序中,解析遵循不同的规则,尤其是地址空间随机化时,它无法在链接时解析。

而且 clang 确实有 -fPIcflags,就像 gcc 一样。

$ cat > foo.c
void foo(void);
void bar(void) { foo(); }
$ gcc -S foo.c && grep call.*foo foo.s
call foo
$ gcc -fPIC -S foo.c && grep call.*foo foo.s
call foo@PLT
$ clang -S foo.c && grep call.*foo foo.s
callq foo
$ clang -fPIC -S foo.c && grep call.*foo foo.s
callq foo@PLT
$

关于c++ - 用 GCC 编译时还需要使用 -fPIC 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20637310/

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