Вставка на OSX, моя функция не вызывается
Итак, я возился с некоторым вставным кодом в OSX (gcc 4.2.1) и пытаюсь заставить работать следующее:
Когда я вызываю./login, используя DYLD_INSERT_LIBRARIES=my.dylib, он должен переопределить реализацию входа в систему по умолчанию и использовать мою собственную реализацию. Конечно, это надуманный пример, но он просто помогает мне понять суть.
Мой источник:
кот 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;
}
кошка 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 ответ
Ваш login
Функция связана статически, а не динамически, поэтому вставлять нечего. Вы не можете вставлять статически связанные функции. Если вы хотите, чтобы это работало, вам нужно двигаться login
в свою собственную динамическую библиотеку.