为什么包含 -fPIC 来编译静态库会导致运行时出现分段错误?

2024-01-20

我正在使用 g++ 编译 C++ 静态库并使用 -fPIC 选项。我必须使用 -fPIC 选项,因为最终该库将与其他静态库链接以形成动态库。

当我在本地测试静态库时,如果不包含 -fPIC 选项,它可以完全正常工作。但是,一旦我使用 -fPIC 编译库,我就会在调用其中一个函数时在运行时收到分段错误错误。

包含 -fPIC 来编译静态库的原因可能会导致运行时出现分段错误?


动态库应该在运行时加载,因此不能有位置相关的代码。

另一方面,静态库只是目标文件的存档。

当与动态库链接时,链接器将库的名称添加到可执行文件中,以便加载器在加载程序时可以加载它。当链接器链接静态库时,它基本上会提取目标文件并像任何其他目标文件一样链接它们。

因此,除非您创建一个可执行文件,其中所有其他目标文件都是位置无关的(您使用-fPIC对于您的程序代码),那么您无法链接到使用位置无关代码的静态库,生成的可执行文件根本就没有为其设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么包含 -fPIC 来编译静态库会导致运行时出现分段错误? 的相关文章

随机推荐