-symbolic 和 -shared GCC 标志之间有什么区别?

2024-03-08

从文档的描述来看,它们似乎做了同样的事情,除了“并非所有系统”支持共享并且“只有某些系统”支持符号(尚不清楚这些是否是同一组系统):

-共享 生成一个共享对象,然后可以将其与其他对象链接起来 形成可执行文件。并非所有系统 支持这个选项。对于可预测的 结果,您还必须指定 与过去使用的相同选项集 生成代码(-fpic、-fPIC 或模型 子选项)当您指定此选项时 选项1]

-象征性的 构建共享对象时将引用绑定到全局符号。警告 关于任何未解决的参考文献 (除非被链接编辑器覆盖 选项 -Xlinker -z -Xlinker defs)。 只有少数系统支持此功能 选项。

我怀疑差异在于“生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件”部分,但这听起来对任何库都是如此。这是否意味着生成的共享对象也可以静态链接?


摘要:-symbolic 防止共享对象函数内部插入

与共享对象的链接允许使用称为符号插入的功能。这个想法是,您可以“插入”全局符号的新定义,以便调用它而不是“常规”定义。

一个典型的例子是 malloc()。在最常见的情况下,malloc() 是在 libc 中定义的。但是您可以通过在加载 libc 之前加载定义该符号的库来插入您自己的 malloc 版本(大多数运行时链接器允许您使用 LD_PRELOAD 到特定库以在可执行文件之前加载)。

默认情况下,共享对象中的任何非静态函数都是全局符号。因此,共享对象中的任何函数都可以被插入。考虑这样一种情况:共享对象具有函数 high_level() 和 low_level(),并且 high_level() 调用 low_level() 作为其实现的一部分,并且 high_level() 和 low_level() 都不是静态函数。

可以插入 low_level() ,以便 high_level() 从不同的共享对象调用 low_level() 。

这就是 -symbolic 的用武之地。创建共享对象时,链接器将看到 low_level() 与 high_level() 在同一共享对象中定义,并绑定该调用,使其无法被插入。这样,您就知道从共享对象中的一个函数到同一共享对象中的另一个函数的任何调用都不会被插入。

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

-symbolic 和 -shared GCC 标志之间有什么区别? 的相关文章

随机推荐

  • 如何使用 Javascript 将数组拆分为基于值的多个数组?

    我有一个数组 我想根据值 完成 将其拆分为多个数组 当我找到它时 我拆分数组 我的代码是 var input urlGettingF BROKEN aquaHTTP 404 BROKEN url1HTTP 404 ok urlok Fini
  • 提高 html canvas mousemove 图像蒙版的性能

    我有一个画布 正在绘制图像并进行剪辑以创建图像被显示的效果 我的代码工作正常 我尝试使用 debouce 方法和 rAF 来提高画布渲染性能 但我只看到了很小的收益 如果有的话 我怀疑我迭代 x 和 y 坐标数组的方式可能是问题所在 当将数
  • Flutter - JSON 和时间序列图表

    我试图在时间序列图表中显示一些数据 我找到了一个例子 https google github io charts flutter example time series charts simple html https google git
  • 找到一条经过最大点数的线[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 创建机器人时出错

    我在创建机器人时遇到错误 我正在尝试部署一个网络应用程序机器人 指定资源组的名称及其位置后 我单击 创建 之后机器人部署过程开始 但最终会出现错误 MsaAppId MsaAppId 已在使用中 我可以做什么来成功部署基本机器人 这是一周内
  • 按一列分组,为每对列选择一列中最小值的行

    很难说清楚的问题 这是我想做的一个例子 我开始的一个例子 set seed 0 dt lt data table dr1 d rnorm 5 dr1 p abs rnorm 5 sd 0 08 dr2 d rnorm 5 dr2 p abs
  • 使用 Python 更改控制台窗口的位置 (Windows)

    是否可以通过python改变Windows控制台的位置 如果没有 有什么解决方法吗 我不知道您是否需要任何具体信息 但以防万一 我使用的是 Windows 8 1 64x Python 3 5 0 控制台是通过Popen主要目标是将其移动到
  • 如何使用用例关系 - uml

    嘿伙计们 我一直在研究 UML 并且正在尝试设计问题的用例图 假设我的应用程序包含以下内容 两个要求 创建团队 创建玩家 这是这笔交易 用户可以创建一个球队 创建球队后可以为该球队创建球员 非必需 但在这个应用程序中有多个用户 一个用户可以
  • 将Django模型父类添加到现有模型中以实现多表继承

    The Django 文档 https docs djangoproject com en 1 9 topics db models multi table inheritance使用此示例来演示多表继承 from django db im
  • LINQ查询中的自连接并返回视图

    我正在使用 LINQ 自联接查询在视图上显示数据 我的 sql 表包含一些员工详细信息 我需要显示员工详细信息及其经理姓名 因为它是表中的 ManagerID EmpID Name ManagerID Designation Phone A
  • “导出声明类型 Xyz”与“导出类型 Xyz”中的声明意味着什么

    在定义文件中 写入以下两者是有效的 export declare type Abc string export type Bcd string The declare这里的关键字没有任何作用 对吗 正确的 declare当您需要说明执行时会
  • Visual Studio 2017状态栏颜色

    VS2017 至少是我刚刚安装的最新更新 在主窗口的底部有一个闪亮的蓝色状态栏 在视觉上非常突出 由于这是整个屏幕上唯一的大亮蓝色物体 因此非常分散注意力 有没有办法改变颜色 根据这个答案 https stackoverflow com q
  • 如何从 android studio 发出拉取请求?

    我将应用程序分叉到 android studio 当我尝试发出拉取请求时 I get Can t Create Pull Request Push failed failed to push some refs to https githu
  • 如何在一种解决方案中调试/单元测试 Web APi

    有没有一种方法可以在一个解决方案中对 Web api 进行单元测试或调试 我正在使用 HttpClient 使用 WebAPI 并且有两个 VS 实例来执行此操作 在 1 个 VS 实例中 我进行了单元测试 在第二个 VS 实例中 我在 l
  • RavenDB 中的子字符串搜索

    我有一组类型的对象Idea public class Idea public string Title get set public string Body get set 我想通过子字符串搜索这个对象 例如 当我有标题对象 idea 我希
  • 使用 GDB 调试 va_list args

    我尝试调试 Va list 参数并打印变量值示例代码是 include
  • 在 Azure WebRoles 中启用 HTTP 严格传输安全 (HSTS)

    如何为 Azure WebRoles 启用 HTTP 严格传输安全 HSTS 接受的答案令人困惑 并且正确答案 https serverfault com questions 417173 enable http strict transp
  • 在解决方案资源管理器中折叠项目

    如何使用键盘折叠 展开解决方案探索中的所有项目 In Visual Studio 2013 it is finally just part of solution explorer with a Collapse All icon 早期版本
  • 使用 MySQL Workbench 搜索所有表

    我可以使用 MySQL GUI 在所有表中搜索字符串吗 或者是这样的 mySQL 查询在数据库中的所有表中搜索字符串 https stackoverflow com questions 7523039 mysql query to sear
  • -symbolic 和 -shared GCC 标志之间有什么区别?

    从文档的描述来看 它们似乎做了同样的事情 除了 并非所有系统 支持共享并且 只有某些系统 支持符号 尚不清楚这些是否是同一组系统 共享 生成一个共享对象 然后可以将其与其他对象链接起来 形成可执行文件 并非所有系统 支持这个选项 对于可预测