对可执行文件库加载的操作

比方说,我有一个可执行文件a.out。它具有共享库libcrypto.solibmylib.so。我想对所有这些库负载进行一些操作。有可以添加代码的功能吗?因此,我将在可执行文件中定义一些函数,在本示例中它将被调用两次。

我知道__attribute__ ((constructor)),但是应该为每个库都专门定义它,这是不可能的。

谢谢。

a5550846 回答:对可执行文件库加载的操作

  

我想对所有这些库负载进行一些操作。有可以添加代码的功能吗?

您的代码,不。但是您可以LD_PRELOADdlopen插入器。

示例:

// foo.c
#include <stdio.h>

__attribute__((constructor))
void ctor()
{
  printf("In %s:%d\n",__FILE__,__LINE__);
}
// main.c
#include <dlfcn.h>
#include <stdio.h>

int main()
{
  printf(">>> main\n");
  dlopen("./foo.so",RTLD_LAZY);
  dlopen("./bar.so",RTLD_LAZY);
  printf("<<< main\n");

  return 0;
}
gcc -shared -fPIC -o foo.so foo.c
gcc -shared -fPIC -o bar.so foo.c
gcc main.c -ldl
./a.out
>>> main
In foo.c:6
In foo.c:6
<<< main

现在,我们添加一个dlopen插入器:

// dlopen_preload.c
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>

typedef void* (*FN)(const char *,int);

void *dlopen(const char *fname,int flags)
{
  FN real_dlopen = (FN)dlsym(RTLD_NEXT,"dlopen");
  void *ret = real_dlopen(fname,flags);

  printf("my dlopen(%s,0x%x) -> %p\n",fname,flags,ret);

  return ret;
}
gcc -shared -o dlopen_preload.so dlopen_preload.c
LD_PRELOAD=./dlopen_preload.so ./a.out
>>> main
In foo.c:6
my dlopen(./foo.so,0x1) -> 0x565039670690
In foo.c:6
my dlopen(./bar.so,0x1) -> 0x565039670c90
<<< main

Voilà。

本文链接:https://www.f2er.com/3137596.html

大家都在问