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

2024-03-14

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

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

我还注意到 clang 没有 -fPIC 选项,这让我认为不再需要它。

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


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

clang 确实有 -fPIC 标志,就像 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
$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用GCC编译时还需要使用-fPIC吗? 的相关文章

随机推荐

  • 关于Future.firstCompletedOf和Garbage Collect机制

    I ve encountered this problem in my real life project and proved by my testing code and profiler Instead of pasting tl d
  • 如何创建一个流,其中的项目基于该流之前返回的项目?

    我有一个函数可以生成futures Stream基于一个论点 我想多次调用这个函数并将流压平在一起 使问题变得复杂的是 我想将流返回的值作为参数提供给原始函数 具体来说 我有一个函数可以将数字流返回到零 fn numbers down to
  • 具有精确 OR 值的嵌套 IF 语句

    我是 Excel IF 语句的新手 并且在我认为所谓的 IF 语句方面遇到了麻烦嵌套 IF 函数 我在这里查看了其他 IF 问题 它们对于我的新手大脑来说太复杂了 无法理解 我有一列 里面有数字 大约有十几个不同的数字 这些数字代表一个特定
  • 对重复内容不显示是否会影响 SEO/语义?

    重复内容上的 Display none 是否会影响 SEO 语义 假设您正在构建一个移动优先的响应式网站 在较小的断点处 您选择显示页面的标题标语 h1 在主要英雄横幅中 但是 稍后您希望在同一位置显示公司徽标 并在子横幅中显示您的口号 例
  • 如何获取使用 Angular $http 下载的文件的名称?

    我编写了使用 Angular http 下载文件的代码 文件的名称是notURL 中指定 URL 包含文件的唯一标识符 该标识符是从应用程序外部获取的 When http get myUrl 被调用 一切正常 文件已被检索 我可以在回调处理
  • Java 中动态转换为泛型类型

    这是我整理的一个简单的例子 private static
  • 使用 WPF 视觉层的高性能图形

    我正在创建一个 WPF 映射程序 该程序可能会同时加载数百个文件并将其绘制到屏幕上 并且用户可能想要缩放和平移此显示 其中一些文件类型可能包含数千个点 这些点很可能作为某种路径连接 其他支持的格式包括 TIFF 文件 使用一个绘制所有数据的
  • Stripe API - 收据列表

    我正在使用 Stripe API 我想向客户展示他们的发票历史记录列表以及相关收据 我在 Stripe API 中找不到任何地方 https stripe com docs api lang php https stripe com doc
  • PHP 会话很难跨分布式系统扩展吗?

    在工作中 我们几乎用 Java 和 Perl 完成所有工作 但我想使用 PHP 和会话构建一个功能 有些人认为尝试在我们的系统上进行 PHP 会话是一个坏主意 因为它分布到许多服务器 具体问题会是什么 您还可以使用自定义会话保存处理程序 h
  • 如何在条件查询中使用MAP的键?

    我有一个这样的豆子 Class TestA Map
  • 构建 python 模块并将其链接到 MacOSX 框架

    我正在尝试在 MacOSX 10 6 上构建 Python 扩展并将其链接到多个框架 仅限 i386 我使用 distutils 和 Extension 对象创建了一个 setup py 文件 我为了链接我的框架 我的LDFLAGS环境变量
  • Imshow 和 imwrite 在 matlab 中显示空白图像

    我正在尝试将图像存储在数组中以进行一些分析 当我循环该过程并将结果 imwrite 到各种文件中时 它会存储一个空白图像 与 imshow 相同 当我在控制台上打印图像数组时 这些值是它们应该的值 从 50 到 200 不等 这是我的代码出
  • 如何发出 SOAP 请求

    我正在 Android 中发出 SOAP 请求 我到底想要实现的是
  • WiX - 未定义的预处理器变量“$(var.SetupProject1.TargetDir)”

    我正在跟进本教程 http www paulsodimu co uk Post How To Create a Wix Installer For a Console Application创建 WiX 安装程序VS2017 Winform
  • 应用程序初始化非常慢:FirebaseApp初始化失败

    我知道关于这个问题 https stackoverflow com questions 37321728 firebaseinitprovider firebaseapp initialization unsuccessful但我认为这对我
  • 将本地 Nuget 包导入 Visual Studio 解决方案[重复]

    这个问题在这里已经有答案了 我的桌面上保存了一个 nuget 包文件 nupkg 我正在尝试将其纳入我的 Visual Studio 解决方案中 有谁知道如何做到这一点 请按照以下步骤操作 从 Visual Studio 打开项目的解决方案
  • 为什么 -O3 GCC Optimization 没有内联这个函数?

    在GCC编译器中 每当标记 O3时 编译器主要通过循环展开和函数内联进行优化 但是 当我编译具有以下函数的应用程序时 它没有执行函数内联 从 gprofing 和 gconving 中我可以注意到这个函数 comp t delay 不是从这
  • 如何使用默认的 Android 绘图

    使用默认 Android 可绘制对象时的最佳方法是什么 我应该使用android R drawable或者我应该复制项目中的可绘制对象并使用R drawable 在较新版本的 Android 中 某些默认可绘制对象被删除或调整大小是否存在任
  • 与主题属性的数据绑定

    我正在尝试新的 Android数据绑定库 https developer android com tools data binding guide html我想使用绑定设置工具栏的背景颜色 默认情况下 颜色应为 colorPrimary 来
  • 使用GCC编译时还需要使用-fPIC吗?

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