使用动态链接器包装 glibc 函数

2024-05-04

我正在尝试包装 GLIBCfstat通过将我的库注入可执行文件来实现函数(可以是任何其他:这只是概念证明)。我通过将我的库放置在可执行文件的位置来做到这一点RPATH用名字指着libc.so.6.

我的库的源代码如下:

#define _GNU_SOURCE

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>



int fstat(int fd, struct stat *buf){

        typeof(fstat) *old_fstat;

        // Try with a printf...

        printf("HOOT! fstat wrapped!");

        old_fstat = dlsym(RTLD_NEXT, "fstat");
        return (*old_fstat)(fd, buf);
}

我用它编译--version-script(添加符号版本控制)并将其静态链接到 libgcc。

gcc -Wall -fPIC -c -o wrapperlib.o wrapperlib.c 
gcc -shared -static-libgcc -fPIC -Wl,-soname -Wl,libc.so.6 -Wl,--version-script=wrapperlib.map,-Bstatic -o libc.so.6 wrapperlib.o

With wrapperlib.map包含:

GLIBC_2.0 {
};

当我执行目标程序时,我的库被加载,但出现以下错误:

./target: relocation error: ./target: symbol __libc_start_main, version GLIBC_2.0 not defined in file libc.so.6 with link time reference

如果我提供我自己的实现__libc_start_main我没有收到此错误(当然,它会崩溃)。

int __libc_start_main(int (*main) (int, char **, char **), int argc, char *argv, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void *stack_end) {
        system("echo I am in __libc_start_main");
        printf("printf: I am in __libc_start_main");
        fflush(stdin);
    return 0;
}

为什么会出现重定位错误__libc_start_main并且不在system?

(顺便说一下,调用system确实有效,但致电printf不产生输出。我在这里遗漏了一些明显的东西吗?)

谢谢

编辑: 跑步目标与LD_DEBUG=all输出这个:http://pastebin.com/iVVbwf6n http://pastebin.com/iVVbwf6n


我将我的库放在可执行文件的位置RPATH用名字指着libc.so.6.

And therefore the process loads your library instead of GLIBC's libc.so.6. That is surely not what you want unless you're providing an independent implementation of at least the entire C standard library. That requires your library to provide an independent implementation of everything in libc.so.6, or else to dynamically load the real libc. I see that you attempt to attain completeness by statically linking libgcc (I guess you mean using -lstatic-libgcc), but

  1. 那是错误的图书馆。它提供支持 GCC 编译的二进制文件的函数,其中可能包括某些 C 库函数的包装器或替代品,但它不提供 C 库本身。

  2. 即使您静态链接 C 库(例如-lc_nonshared),您以这种方式获得的库将不包含可动态加载的符号,您可以通过该符号访问包装的函数。这是静态链接的直接结果。

  3. 你的库无论如何都不是独立的,因为它试图包装 GLIBC 的实现fstat(),这是它不可用的。

为什么会出现重定位错误__libc_start_main并且不在system?

出现重定位错误__libc_start_main因为该函数是由 glibc 的 libc.so.6 提供的,而不是由您的、您的二进制文件本身或动态链接到您的二进制文件的任何其他库提供的。(参见上文(1))

如果没有重定位错误system or printf函数,那么它们要么不是二进制文件中的外部动态符号,要么由动态链接到您的二进制文件的其他一些库来满足。 (Update:链接器调试信息显示前者是这种情况:这些不是外部符号,我指的是未提供定义的符号;它们由您的库提供,大概是 libgcc 中链接的结果。

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

使用动态链接器包装 glibc 函数 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的

随机推荐

  • 允许 JavaScript 请求 PHP 文件,但不能直接从浏览器请求

    我正在使用 jquery 脚本 通过 ajax 和 PHP 上传文件 它向 upload a file php 发送请求 然后上传文件 有没有办法确保 upload a file php 不会直接加载到浏览器中 我尝试将 upload a
  • Cloudfront CORS 阻止字体

    除了字体之外的所有资源都加载得很好 每当我访问我的网站时 我都会收到这样的消息 访问字体 https xxxxxxxxxx cloudfront net assets fontawesome webfont woff2 https xxxx
  • Python多重处理使用队列写入同一文件

    我知道 Stack Exchange 上有很多与将多处理结果写入单个文件相关的帖子 并且我在阅读了这些帖子后就开发了我的代码 我想要实现的是并行运行 RevMapCoord 函数并使用 multiprocess queue 将其结果写入一个
  • 无法加载资源,因为应用程序传输安全策略要求使用安全连接

    当我将 Xcode 更新到 7 0 或 iOS 9 0 时 我遇到了这个问题 不知怎的 它开始给我标题错误 无法加载资源 因为应用程序传输安全性 策略要求使用安全连接 网络服务方法 void ServiceCall NSString Ser
  • 如何使用 SQLalchemy 连接三个表并将所有列保留在其中一个表中?

    所以 我有三张表 类定义 engine create engine sqlite test db echo False SQLSession sessionmaker bind engine Base declarative base cl
  • 使用 JavaScript 实现图像缩小功能

    我正在开发一个项目 其中有一个图像 当用户单击图像时 图像放大 再次单击时图像缩小 如何在我的代码中添加缩小功能here http jsfiddle net doforumda 95wqh 9 function resizeImg img
  • Python“with”不删除对象

    尝试正确删除 Python 对象 我正在创建一个对象 然后使用 with 语句删除它 但是当我在 with 语句关闭后进行打印时 该对象仍然存在 class Things object def init self clothes food
  • AS3 是否可以复制 Shape 对象?

    我正在尝试制作一个可用于复制的形状 这是我所做的 我正在尝试做的以及我陷入困境的解释 在 Flash IDE 画笔 中手动绘制形状 创建了一个包含形状的新影片剪辑 作为一个类导出 实例化该类 var mc MovieClip new sha
  • 以编程方式或使用清单 (MinGW) 将“覆盖高 DPI 缩放”设置为“系统(增强)”

    我尝试了所有可能的组合gdiScaling and dpiAware 仍然没有运气 如果我手动右键单击 app exe 并将 覆盖高 DPI 缩放 设置为 系统 增强 效果很好
  • Jasmine.js 测试 - 监视 window.navigator.userAgent

    我需要找到改变的方法userAgent价值 我尝试过了spyOn the window navigator userAgent 但这没有帮助 JS Injectable export class DetectBrowserService b
  • 使用PHP获取http url参数而不自动解码

    我有一个像这样的网址 test php x hello world y 00h 00e 00l 00l 00o 当我将它写入文件时 file put contents x txt GET x gt hello world file put
  • 为什么我要使用服务器端 JavaScript?

    我很困惑 我经常阅读有关服务器端 JS 的讨论 为什么我要使用它 看起来它的执行速度比几乎任何其他语言都要慢 而且它还缺乏更复杂的语言所具有的许多约定 是否可以将整个对象从客户端传递到服务器 操作它们并将它们返回 只是努力理解它的概念 是的
  • 将 Highcharts 导出为 PDF(使用 javascript 和本地服务器 - 无互联网连接)

    我在我的应用程序中使用 Highcharts 没有任何互联网连接 我的 html 页面上有多个图表 我想生成一个包含该页面中所有图表的 PDF 报告 我怎样才能做到这一点而不将数据发送到互联网上的任何服务器 我将感谢您提供的任何帮助或任何示
  • 无法安装 pygame [重复]

    这个问题在这里已经有答案了 所以我对 python 和 或 pip 有一些问题 Python 当要求在 CMD 中下载 pygame 时py m pip install U pygame user 给我这个错误 WARNING No Set
  • Webhook 不执行订阅验证

    我们正在使用 Microsoft Graph 创建 Webhook 订阅 但是 返回以下 JSON 我们可以看到没有相应的 HTTP 请求发送到我们的验证公共 Web 服务器 error code InvalidRequest messag
  • TextView、iOS 和 OSX 中的彩虹文本

    我正在尝试向我的应用程序添加一些不同的文本颜色以融合到图像中 我收到了很多用户想要彩虹文本颜色并重复的输入 例如这个词 stackoverflow看起来像这样 s red t orange a yellow c green k blue o
  • 如何使用j2me(midp2.0)从收件箱读取短信?

    我想从 j2me 应用程序访问收件箱消息文本 我不知道如何访问收件箱 使用 j2me 无法实现这一点 我已经在诺基亚论坛讨论过 看
  • 双边移动平均线?

    如何获得两侧的 移动平均值 该函数对向量右侧和左侧的 n 个数字进行平均 并根据它们与中心值的距离赋予它们权重 我尝试使用 TTR 但它的移动平均线仅从左到右工作 并将最左边的值设置为 NA 所以我不能使用该平滑向量作为 smooth sp
  • authenticationEntryPoint 不适用于提交凭据的 Permit() http 方法

    Override protected void configure HttpSecurity httpSecurity throws Exception formatter off httpSecurity csrf disable aut
  • 使用动态链接器包装 glibc 函数

    我正在尝试包装 GLIBCfstat通过将我的库注入可执行文件来实现函数 可以是任何其他 这只是概念证明 我通过将我的库放置在可执行文件的位置来做到这一点RPATH用名字指着libc so 6 我的库的源代码如下 define GNU SO