gpt4 book ai didi

c - 混合 fPIC 和非 fPIC 对象模块

转载 作者:行者123 更新时间:2023-12-04 10:14:55 25 4
gpt4 key购买 nike

环境:Ubuntu 16.04

在我的实验中,我运行了以下命令:

gcc -c 1.c
gcc -c -fPIC 2.c
gcc -shared 1.o 2.o -o libmyxxx.so

我需要公开的函数都在 2.c 中通过 extern "C" 声明定义。这些函数在内部调用 1.c 中定义的其他函数。

请注意,我没有将 -fPIC 应用于 1.c。一切似乎都可以正常编译/链接,没有任何警告。

我们能否得出结论,-fPIC 必须仅应用于那些暴露外部函数的源文件?

在更大的图片中,我有一堆可能未使用 -fPIC 标志编译的存档 (.a) 文件。我需要创建一个与这些存档文件链接的自定义共享库。如果我的假设是正确的,我认为可以链接这些存档文件。欣赏你的想法。问候。

最佳答案

Can we conclude that -fPIC must be applied only to those source files that expose external functions?

不,我们不能。 -fPIC 的唯一目的是确保生成的机器代码可以链接到与位置无关的二进制文件中。尽管如此,即使源代码是在没有 -fPIC 的情况下编译的,一些代码也可能看起来是 PIC 就绪的。它可能是没有外部依赖的短自包含函数,无论生成的目标文件中不需要辅助数据结构,如 PLT 和 GOT 条目。

无论如何,如果您的目标文件无法链接到与位置无关的二进制文件,链接器将失败并显示综合错误消息。你需要用这个神奇的选项重新编译它。

因此,您应该始终将 -fPIC 放入共享库的 CFLAGS 中,以节省您自己的时间并避免浪费的重新编译。

关于c - 混合 fPIC 和非 fPIC 对象模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395448/

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