为什么链接器要修改--defsym“绝对地址”

2024-04-27

目标:一个使用可执行文件中的函数(不导出符号)的共享库。

Means: gcc -Wl,--defsym,function=0x432238

手册页指出:

"--defsym symbol=expression" Create a global symbol in the output
file, containing the absolute address given by expression.

令我沮丧的是,dlopen()正在添加0x7ffff676f000,共享库的基地址(这是 64 位代码)到导出的“绝对符号地址”:

        executable        shared library
        ---------- linker --------------
symbol: 0x432238   =====> 0x7ffff6ba1238

objdump 显示正确的符号地址(0x432238)在库中,但一旦加载dlopen(),符号有地址0x7ffff6ba1238.

如果加载后,我手动将库符号修补到正确的地址,则一切正常(否则,库 SEGFAULT)。

  • 为什么要修改“绝对地址”呢?
  • 如何避免呢?

Update:

我对下面回复的技术相关性提出质疑,甚至更质疑其“更新”:

使用 --defsym 在 PIC 库/可执行文件中定义重定位符号是没有意义的(除了污染二进制文件而没有任何可用功能之外,它没有任何用途)。

因此,在 PIC 共享库或 PIC 可执行文件中 --defsym 的唯一相关用途应该是定义 (未搬迁)“绝对地址”。

顺便说一句,如果您费心阅读手册页,这就是 --defsym 的官方目的:

“在输出文件中创建一个全局符号,包含absolute address由表达式给出。”

充其量,这是一个 Linux 链接器缺陷,修复起来很简单。对于那些迫不及待地等待否认者意识到(并修复)他们的错误的人来说,解决方案是在有缺陷的链接器加载二进制映像后修补重定位表。

然后,--defsym 在 PIC 库/可执行文件中变得有用,在我看来这是一个可喜的进步。


你似乎从根本上误解了什么--defsym does.

--defsym=symbol=expression
   Create a global symbol in the *output* file, ...

也就是说,您正在创建新符号在图书馆你正在建造的。因此,该符号(自然地)随库一起重新定位。

我猜你想要这样的东西:

// code in library
int fn()
{
    // exe_fn not exported from the executable, but we know where it is.
    int (*exe_fn)(void) = (int (*)(void)) 0x432238;
    return (*exe_fn)();
}

如果你不想硬编码0x432238到库中,而不是在构建时在命令行上传递值,只需使用-DEXE_FN=0x432238为了实现这一点。

Update:

目标:使用可执行文件中的函数的共享库

那个目标can not通过您选择的方法来实现。你必须使用其他手段。

为什么要修改“绝对地址”呢?

事实并非如此。当您要求链接器定义时function在绝对地址处0x432238,它确实exactly那。你可以在objdump, nm and readelf -s output.

但因为符号已定义in共享库,所有参考到该符号的位置被重定位,即通过共享库加载地址进行调整(由动态加载器完成)。它使毫无意义让动态加载器做其他事情。

如何避免呢?

你不能。使用其他手段来实现你的目标。

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

为什么链接器要修改--defsym“绝对地址” 的相关文章

随机推荐

  • findbugs-maven-plugin 不执行任何操作

    我不明白 我想在 Maven 3 项目站点中启用 findbugs 报告 并通过将其添加到我的 pom xml 中来实现 如所述here http mojo codehaus org findbugs maven plugin usage
  • 使用反射从泛型结构获取类型参数

    想象一下我有以下结构 type MyGeneric T string int struct 我想在创建新的 MyGeneric 时检查用于实例化该结构的泛型是字符串还是 int myGenericString MyGeneric strin
  • 使用 r 写入和更新 DB2 表

    我不知道如何更新 R 中现有的 DB2 数据库或更新其中的单个值 除了非常一般的信息之外 我在网上找不到关于这个主题的太多信息 但没有具体的例子 library RJDBC teachersalaries data frame name c
  • Java OutputStream 读取字符串行

    我使用一个 API 更多信息 见下文 它接受输出流捕获数据 相反 我想提供一个Consumer of Strings它消耗了一行又一行的数据 因此我必须编写一个 OutputStream 实现来包装这样的 Consumer 这是我能想到的最
  • 无法让 D3 .on('mouseover', ...) 工作

    我正在学习 D3 并尝试通过将鼠标悬停在 SVG 圆圈上来在散点图上显示数据信息 我从 csv 文件中获取数据 数据位于太阳系 包含行星名称 质量和半径 并且所有圆圈都正确显示 但是当我尝试在鼠标悬停时 console log 数据信息 例
  • 如何使用 grep 查找文件夹内的单词?

    在 Windows 中 我会进行搜索以在文件夹中查找单词 同样 我想知道某个特定单词是否出现在包含许多子目录和文件的目录中 我对 grep 语法的搜索显示我必须指定文件名 即grep string filename Now I do not
  • 使用 Javascript DOM 获取带有标签名称的第一个元素

    我正在尝试获取带有标签的第一个元素
  • 渐进增强 - Node.js、Backbone.js

    Node js 服务器有两个角色 前缀为 api 的路由上的 RESTFul API 在其他路线上呈现网站页面 plans features terms 目前 我的所有页面都会呈现一个 正在加载页面 并与 Backbone router 启
  • 如何增加/检查 Linux 上 Docker 的默认内存?

    我发现在 Windows 和 Mac 上 更改给定的 RAM 容器非常容易 您只需进入 GUI 即可 但是如何在 Linux 上执行此操作 使用 CLI 而不是 GUI 呢 Docker 文档提到了 m标志 但这个标志没有给出任何响应 只是
  • 我可以自定义 UILocalNotification 重复间隔(即仅限工作日吗?)

    我希望能够安排 UILocalNotification 在每天的同一时间重复 但仅限于工作日 没有周六或周日 使用 UILocalNotification 的重复间隔功能是否可以实现这一点 或者是我创建某种处理时间和日期并计算出何时提前安排
  • 如何快速识别 SQL Server 中最近修改的存储过程

    我需要手动将修改后的存储过程从 DEV SQL Server 2005 数据库实例迁移到 TEST 实例 除了我要迁移的更改之外 数据库具有相同的架构 如何快速识别DEV数据库中哪些存储过程被修改并迁移到TEST实例 我假设我可以针对某些系
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • 掌握 CodeIgniter - 模板化/加载视图

    尝试学习 CI 并浏览文档以获得更好的理解 如果没有单独的库 我可以通过包含视图列表来制作模板 如下所示 this gt load gt view header this gt load gt view navigation this gt
  • Doctrine2 多对一双向关系不起作用

    我正在尝试在两个实体之间进行双向关联 问题是 从 Book 我可以得到它们的所有者 但从 Owner 我无法得到拥有的书籍 这是代码的重要部分 Acme BookBundle Entity Book ORM ManyToOne target
  • TensorFlow - 根据另一个变量的形状动态定义变量的形状

    假设我有一定的张量x其维度未在图初始化时定义 我可以使用以下方法获得它的形状 x shape tf shape input x 现在 如果我想根据中定义的值创建一个变量x shape using y tf get variable vari
  • C 结构体的 Python ctypes 定义

    我正在尝试调用 Matlab 编码器生成的一些 C 代码 Matlab 使用名为 emxArray 的 C 结构体来表示矩阵 记录如下 http www mathworks co uk help fixedpoint ug c code i
  • 如何使用 codeigniter 生成 5 位字母数字唯一 ID?

    我有一个项目 需要为用户生成唯一的 5 位数字母数字 ID 我怎样才能使用 codeigniter 实现这一点 thanks 字符串助手中有一个名为 random string 的函数 this gt load gt helper stri
  • urllib2.urlopen 在 Django 中失败

    I use urllib2 urlopen url 获取 HTML 内容 网址是http 127 0 0 1 8000 m html 该方法成功获取HTML内容 但在 Django 中 如果我尝试获取 HTML 内容 它会在函数中停止 ur
  • 检查 python 中的 type == list 是否[重复]

    这个问题在这里已经有答案了 我无法弄清楚我的代码有什么问题 for key in tmpDict print type tmpDict key time sleep 1 if type tmpDict key list print this
  • 为什么链接器要修改--defsym“绝对地址”

    目标 一个使用可执行文件中的函数 不导出符号 的共享库 Means gcc Wl defsym function 0x432238 手册页指出 defsym symbol expression Create a global symbol