为什么链接器要修改--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“绝对地址” 的相关文章

  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 保护一个保存 MySQL 数据库的简单 Linux 服务器?

    这是一个初学者问题 但我浏览了该网站上的许多问题 但没有找到简单直接的答案 我正在设置一个运行 Ubuntu 的 Linux 服务器来存储 MySQL 数据库 该服务器尽可能安全非常重要 据我所知 我主要担心的是传入的 DoS DDoS 攻
  • 用于列出用户和组的 Python 脚本

    我正在尝试编写一个脚本 在自己的行上输出每个用户及其组 如下所示 user1 group1 user2 group1 user3 group2 user10 group6 etc 我正在为此用 python 编写一个脚本 但想知道如何做到这
  • 将 -1 作为文件描述符传递给 mmap

    我对 FC17 Linux 中的 ls 命令进行了 strace 以下是输出 execve usr bin ls ls 48 vars 0 brk 0 0x27c1000 mmap NULL 4096 PROT READ PROT WRIT
  • 除非链接到 pthreads,否则不会出现死锁?

    为什么创建 std mutex 死锁实际上不会导致死锁 除非程序链接到 pthreads 以下内容在与 pthreads 库链接时会死锁 如果未链接 pthreads 则不会死锁 在 gcc 和 clang 上测试 clang main c
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我
  • 如何在 Linux 上调用 Python 中的内联机器代码?

    我正在尝试从 Linux 上的纯 Python 代码调用内联机器代码 为此 我将代码嵌入到字节文字中 code b x55 x89 xe5 x5d xc3 然后打电话mprotect http www kernel org doc man
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page
  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供
  • 如何检测文本文件中大于 n 的一系列“空洞”(孔、与模式不匹配的线)?

    Case scenario cat Status txt 1 connected 2 connected 3 connected 4 connected 5 connected 6 connected 7 disconnected 8 di
  • 在类中使用静态互斥体

    我有一个可以有很多实例的类 它在内部创建并初始化来自第三方库 使用一些全局变量 的一些成员 并且不是线程安全的 我考虑过使用 static boost mutex 它将被锁定在我的类构造函数和析构函数中 因此 在我的线程中创建和销毁实例对于
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf

随机推荐

  • 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