c - 在 OSX 上干预,我的函数没有被调用

标签 c macos interposing

所以,我在 OSX(gcc 4.2.1)上搞乱了一些插入代码,并且我试图让以下内容正常工作:

当我使用 DYLD_INSERT_LIBRARIES=my.dylib 调用 ./login 时,它应该覆盖默认登录实现并使用我的自定义实现。当然,这是一个人为的例子,但这只是为了帮助我理解这一点。

我的来源:

cat libinterposers.c

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include "login.h"

typedef struct interpose_s
{
  void *new_func;
  void *orig_func;
} interpose_t;

int my_open(const char *, int, mode_t);
int my_close(int);
int my_login();


static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose"))) = 
{
     { (void *)my_open,  (void *)open  },
     { (void *)my_close, (void *)close },
     { (void *)my_login, (void *)login },
};

int my_login()
{
  printf("--> my_login()\n");
  return 1;
}

int my_open(const char *path, int flags, mode_t mode)
{
  int ret = open(path, flags, mode);
  printf("--> %d = open(%s, %x, %x)\n", ret, path, flags, mode);
  return ret;
}

int my_close(int d)
{
  int ret = close(d);
  printf("--> %d = close(%d)\n", ret, d);
  return ret;
}

cat login.c

#include <stdio.h>
#include "login.h"

int login()
{
  return -1;
}

int main()
{
  if (login() == 1)
  {
    printf("login successful\n");
  }
  else
  {
    printf("login failed\n");
  }
}

最后是login.h

int login();

现在,当我使用“cat/dev/null”之类的东西执行时,它工作正常......

DYLD_INSERT_LIBRARIES=/tmp/libinterposers.dylib cat /dev/null
--> 3 = open(/dev/null, 0, 0)
--> 0 = close(3

但是,当我运行 ./login 示例时

DYLD_INSERT_LIBRARIES=/tmp/libinterposers.dylib ./login
login failed

如您所见,它只是打印登录失败,我的自定义“my_login”函数从未运行......有什么想法吗?提前致谢!

最佳答案

您的login函数是静态链接的,而不是动态链接的,因此无需插入任何内容。您不能插入静态链接函数。如果您希望此功能正常工作,则需要将login移至其自己的动态库。

关于c - 在 OSX 上干预,我的函数没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4550988/

相关文章:

swift - 如果队列不为空,则跳过新任务。 swift

macos - Dart 编辑器和 SDK(解压下载后)通常安装/移动到的文件夹是什么?

python - 为什么 LD_PRELOAD 不能与 Python 一起使用?

c - 是否可以覆盖目标模块(gcc、ld、x86、objcopy)中的静态函数?

c - 如何同时接受字符串输入?

c - 如何在 gdb 中的 fork() 之后调试子进程?

c - C中无法释放内存

c - 将有状态 C 计算与 Modelica 集成

macos - ld 链接器错误 - 体系结构 x86_64 的 undefined symbol