当前位置: 首页 > 面试题库 >

LD_PRELOAD是否可以使用具有不同参数的函数?

羊舌成周
2023-03-14
问题内容

假设我通过创建共享对象并使用LD_PRELOAD首先加载它来替换函数。是否有可能使该功能的参数不同于原始库中的参数?

例如,如果我替换 pthread_mutex_lock ,这样它将代替参数 pthread_mutex_t 而是使用
pthread_my_mutex_t 。可能吗?

其次,除了函数之外,是否可以使用LD_PRELOAD更改结构声明?例如,可以向结构中增加一个字段。


问题答案:

尽管可以安排提供修改后的pthread_mutex_lock()功能,但是代码将被编译为调用标准功能。当使用传递到标准函数的参数调用替换时,将导致问题。这是一种礼貌的说法:

  • 期望它崩溃并燃烧

任何预加载的函数都必须实现与其替换的函数相同的接口,即相同的名称,相同的参数,相同的值。可以根据需要以不同的方式实现内部实现,但是接口必须相同。

与结构类似。现有代码经过编译,期望结构具有一种尺寸,并具有一种特定的布局。您可能不希望在最后添加一个额外的字段,但是未替换的代码可能无法正常工作。它将为结构的原始大小而不是增强结构等分配空间。它将永远不会访问额外的元素本身。可能不是很不可能,但是您必须设计该程序来处理动态变化的结构大小,这对何时可以执行设置了足够严格的限制,答案“不可能”可能是适当的(而且肯定很多)更简单)。

IMNSHO,LD_PRELOAD机制用于紧急情况(是给定问题的临时创可贴)。这不是您应该计划在定期类似于远程的任何事物上使用的机制。



 类似资料:
  • 问题内容: 我想使用Streams.intRange(int start,int end,int step)实现反向排序的流。但是,似乎java.util.Streams类不再可用(但是它仍在标准库的rt.jar中)。此方法是在其他类中还是被其他方法替代? 问题答案: 实际上,JDK中再也没有这种方法了。您能获得的下一个最接近的位置是,但是只会一步一步走。 一种解决方案是实施您自己的解决方案。例如

  • 我是Docker的新手,我想知道是否可以使用不同的参数多次运行一个应用程序。 我使用.NET开发了我的应用程序,到目前为止,我已经使用Ubuntu服务执行了所有实例,比如: 其中是启动服务时传递的参数,如:

  • 问题内容: 我在Google上搜索并不断提出“不,这是不可能的”,但是这些帖子的发布日期为2005-2007,所以我想知道是否已更改。一个代码示例: 解决方案之一是传递null,然后检查null并设置变量。我不想这样做,也不必这样做。如果这是真的,那么MySql开发人员需要唤醒,因为我可以用MSSQL做更多的事情。 问题答案: 仍然不可能。

  • 问题内容: 是否可以从数组向JavaScript函数发送可变数量的参数? 我最近写了很多Python,能够接受并发送varargs是一个很棒的模式。例如 是否有可能在JavaScript发送待处理数组 作为 参数数组? 问题答案: 更新 :从ES6开始,您可以在调用函数时简单地使用 传播语法 : 由于ES6还希望将参数视为数组,因此还可以在参数列表中使用传播语法,例如: 并且可以将其与常规参数结合

  • 我有一个函数,使用。我想给它加一个留档测试。但是,看起来get_type_hints无法解析doctest中定义的类型。 以下是一个简化的示例: 当运行它与它抛出。