【问题标题】:Compiling executable with "-fPIC" flag (no shared library)使用“-fPIC”标志编译可执行文件(无共享库)
【发布时间】:2023-03-23 17:43:01
【问题描述】:

我目前正在处理一些遗留包,我看到一些Makefiles 使用-fPIC 标志来编译最终的可执行文件。

我的理解是,这是在创建共享库时使用的,在创建可执行文件时使用它是没有意义的。

我想知道我是对的还是我遗漏了什么,因为当我在互联网上搜索时,我只得到关于共享库而不是可执行文件的结果。

谢谢,

【问题讨论】:

标签: linux gcc makefile fpic


【解决方案1】:

位置无关代码在共享库上下文之外很有用。一种常见的情况是Address space layout randomization,它使最终的可执行文件更安全地抵御代码注入攻击。

在几个发行版中,例如Fedora,大多数包都构建为 PIE。

【讨论】:

  • 谢谢!这很有趣,虽然我正在查看的应用程序的 makefile 并不是那么敏感(小型测试应用程序),所以我认为他们只是错误地添加了该标志:)(例如复制粘贴)
  • 理论上,该标志在某些架构上可能很有用,否则这些架构会默认为位置相关代码但由于某种原因无法链接。
  • 不解释 -fPIC,只解释 -fPIE。
【解决方案2】:

它可能用于构建位置无关的可执行文件,这可以通过 ASRL 带来更好的安全性。但是,您应该改用-fpie-pie

cc -c -fpie foo.c -o foo.o
cc    -pie  foo.o -o foo

【讨论】:

  • 谢谢!我也会看看那个标志,虽然我认为这个包并不真的需要那个特性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多