c - 是否可以 LD_PRELOAD 具有不同参数的函数?

标签 c linux gcc

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

例如,如果我替换了 pthread_mutex_lock,那么它使用 pthread_my_mutex_t 而不是参数 pthread_mutex_t。可能吗?

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

最佳答案

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

  • 预计它会崩溃并燃烧

任何预加载的函数都必须实现相同的接口(interface)——相同的名称、相同的输入参数、相同的输出值——作为它替换的函数。可以根据需要以不同方式实现内部结构,但接口(interface)必须相同。

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

恕我直言,LD_PRELOAD 机制用于紧急情况(并且是针对给定问题的临时创可贴)。这不是一种您应该计划在类似常规基础上远程使用的机制。

关于c - 是否可以 LD_PRELOAD 具有不同参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871938/

相关文章:

c - C 中的指针,了解差异

linux - 将 AWK 变量值传递给嵌套的 AWK

java 轻量级调试器

java - 通过 Linux 终端运行 Java GUI 应用程序

c - 如何坚持 C 编译器将局部变量放在堆栈上,而不是寄存器中

c++ - 操作和无锁数据结构的重新排序

C++ fwrite() 写的比预期的多

c - 如何for循环迭代两个变量?

c - 给 char 指针赋值

optimization - 是否有任何理由不进行优化进行编译?