Вставка на OSX, моя функция не вызывается - PullRequest
2 голосов
/ 29 декабря 2010

Итак, я возился с некоторым вставным кодом в OSX (gcc 4.2.1) и пытаюсь заставить работать следующее:

Когда я вызываю ./login, используя DYLD_INSERT_LIBRARIES = my.dylib, он должен переопределить реализацию входа в систему по умолчанию и использовать мою собственную реализацию. Конечно, это надуманный пример, но он просто помогает мне понять суть.

Мой источник:

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" никогда не запускается ... есть идеи? Заранее спасибо!

1 Ответ

5 голосов
/ 29 декабря 2010

Ваша login функция связана статически, а не динамически, поэтому вставлять нечего.Вы не можете вставлять статически связанные функции.Если вы хотите, чтобы это работало, вам нужно переместить login в его собственную динамическую библиотеку.

...