在运行时动态修改符号表(C语言)

2023-12-28

是否可以在C运行时动态修改符号表(Linux上的elf格式)?

我的最终目标如下:

在某些函数里面说foo,我想覆盖malloc函数到我的自定义处理程序my_malloc。但在外面foo, any malloc仍应像 glibc 中那样调用 malloc。

注意:这与LD_PRELOAD这将覆盖malloc在整个程序执行过程中。


是否可以在C运行时动态修改符号表(Linux上的elf格式)?

理论上这是可能的,但实际上却很难做到。

在某些函数里面说foo,我想覆盖malloc函数到我的自定义处理程序my_malloc。但在外面foo, any malloc仍应致电malloc就像在 glibc 中一样。

修改符号表(即使可能)not让您达到您想要的目标。

All来电来自anywhere在你的 ELF 二进制文件中(假设foo在主可执行文件中),解析为samePLT导入槽malloc@plt。该插槽已解析为 glibcmalloc在第一次调用时(从程序中的任何位置,假设您没有使用LD_BIND_NOW=1或类似)。解决该插槽后,对符号表的任何进一步修改都将具有没有效果.

你没说控制多少foo你有。

如果你可以重新编译它,问题就变得微不足道了:

#define malloc my_malloc
int foo() {
  // same code as before
}
#undef malloc

如果您收到预编译的foo.o,您将其链接到my_malloc.o,并且您希望从内部重定向所有呼叫foo.o from malloc to my_malloc,这实际上在对象级别(即最终链接之前)非常简单。

你所要做的就是通过foo.o重定位记录,并更改“放置外部地址”的记录malloc这里“到”放置外部地址my_malloc here".

If foo.o除此之外还包含附加功能foo,将重定位重写限制为仅内部的重定位非常简单foo.

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

在运行时动态修改符号表(C语言) 的相关文章

  • 为什么Intellij IDEA不显示

    Windows 8 设置中的所有内容均设置为UTF 8 例如 Intellij IDEA 显示中文字符 这意味着它确实设置为 Unicode 字符集 但它显示一个框而不是 MATHEMATICAL FRAKTUR CAPITAL G 符号
  • 尽管符号存在,但 CMake 中的符号查找失败

    我正在尝试使用 CMake 检查符号 getaddrinfo a 是否存在 list APPEND CMAKE REQUIRED DEFINITIONS D GNU SOURCE check symbol exists getaddrinf
  • R 如何在另一个函数中将函数作为字符串传递

    对于这个小难题的任何帮助将不胜感激 我正在尝试向tq transmute函数从tidyquant包裹 参数的值是一个函数 但是我想将其作为字符串传递 在下面示例的范围内 我将通过 Shiny 传递它 selectInput 我已经尝试了所有
  • -fPIC 仅适用于共享库吗?

    I know fPIC对于共享库是必要的并且知道为什么 不过 我对这个问题并不清楚 Should fPIC在构建可执行文件或静态库期间永远不会使用 Should fPIC在构建可执行文件或静态库期间永远不会使用 从不是一个很强烈的词 上面的
  • 从共享对象调用主可执行文件中的函数

    我必须从加载了 LD PRELOAD 的共享库调用主可执行文件中的函数 可执行文件导出所有符号并包含调试信息 不幸的是我无法访问它的源代码 目前 我在尝试加载该共享库时遇到未定义的符号错误 有没有办法做到这一点 附 目标平台是FreeBSD
  • 程序可以读取自己的 elf 部分吗?

    我想使用 ld 的 build id 选项来将构建信息添加到我的二进制文件中 但是 我不确定如何在程序中提供此信息 假设我想编写一个程序 每次发生异常时都会写入回溯 以及一个解析此信息的脚本 该脚本读取程序的符号表并搜索回溯中打印的地址 我
  • 在剥离的 ELF 可执行文件中设置断点

    我有一个 ELF 32 位动态链接 剥离文件 我希望对其进行调试 尝试在某个地址设置断点时 出现一条消息 提示符号表未加载 我的问题是 当你说 ELF 文件是stripped究竟发生了什么 如何剥离 ELF 文件 是否可以以某种方式重建符号
  • 编辑 ELF 文件中的变量值?

    我需要更改已编译的 ELF 文件中的几个变量 为了清楚地解释这一点 我将使用一个简单的 C 结构作为示例 单个源文件被编译并从 MyFile c 链接 0x1000 到 MyFile elf typedef struct uint32 t
  • python:更改符号变量并分配数值

    为了计算导数和其他表达式 我使用了 sympy 包并表示T sy Symbol T 现在我已经计算出正确的表达式 E T 2 F deriv T T rho where def F deriv rho T rho ret 0 for n i
  • 为什么回调在 Ruby on Rails 中使用符号

    我很难理解何时以及何时不应该在 Rails 中使用符号 我知道符号与没有许多方法的字符串并没有太大不同 我还知道这些符号是很好的键 因为同名的符号在内存中占据一个地址 我很难理解为什么 Rails 决定在某些情况下使用符号 如果我有回调 b
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • GCC-汇编错误:针对“.data”重定位 R_X86_64_32S

    情况 环境 Arch Linux x86 64 4 2 3 1 ARCH GCC 海湾合作委员会 海湾合作委员会 5 2 0 Command gcc Wall g o asm printf asm printf s Error usr bi
  • shark不显示源代码

    我们正在尝试在 iPhone 应用程序上运行 shark 然而 在分析的样本中 它没有列出我们的任何应用程序功能 所有列出的都是库 当我们单击其中任何一个时 汇编代码都是可见的 大多数网站在构建应用程序时都会提到 生成调试符号 选项 我也找
  • 静态库 (.a) 和共享库 (.so) 之间的文件格式差异?

    我知道关于共享库和静态库的用例有很多问题 这个问题与此无关 我问的是磁盘上存储的文件格式的差异 为什么问题是 两者之间有什么区别 或者它们完全相同 只是用途不同 我相信它们是不一样的 因为在共享库上运行 nm 需要 D 标志 显然它需要做一
  • 为什么我应该使用&而不是&?

    我为什么要使用 amp 代替 为我的网站编写 HTML 时 在哪里可以找到我应该编码的其他符号的列表 酒吧 也是吧 如果我将符号按原样粘贴到 html 中 可能会遇到什么问题 事情是 我有一些附属链接 我担心 如果我在某些情况下用 编写它们
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • Ruby Koans #75 test_constants_become_symbols,正确答案?

    我的问题建立在这个问题的基础上 Ruby Koan 常量变成符号 https stackoverflow com questions 5358727 ruby koan constants become symbols 我有以下代码 in
  • 如何使用 VBA 将符号/图标格式化为单元格而不使用条件格式

    我使用 VBA 代码放置条件格式以覆盖大型表格中的值 每个单元格使用 2 个公式来确定使用 3 个符号中的哪一个 我需要根据列使用不同的单元格检查每个单元格的值 因此据我了解 我必须将条件格式规则单独放置在每个单元格上 以确保每个单元格中的
  • 如何使用符号来标识 ruby​​ 方法中的参数

    我正在学习 Rails 并回到 ruby 来了解 Rails 中的方法 以及 ruby 的实际工作原理 当我看到如下方法调用时 validates first name presence gt true 我有点迷惑不解了 如何在 ruby
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我

随机推荐