一尘不染

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

linux

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

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

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


阅读 304

收藏
2020-06-07

共1个答案

一尘不染

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

  • 期望它崩溃并燃烧

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

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

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

2020-06-07