Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对可执行文件';s库加载_C++_Linker_Elf - Fatal编程技术网

C++ 对可执行文件';s库加载

C++ 对可执行文件';s库加载,c++,linker,elf,C++,Linker,Elf,比方说,我有一个可执行文件a.out。它拥有共享库libcrypto.so,libmylib.so。我想在每次LIB加载时都采取一些措施。是否有一些我可以添加代码的函数?因此,我将在可执行文件中定义一些函数,在本例中,它将被调用两次 我知道\uuuuuuu属性((构造函数)),但是应该为每个库专门定义它,这是不可能的 谢谢 我想在每次LIB加载时都采取一些措施。是否有一些我可以添加代码的函数 您的代码,没有。但是您可以LD\u预加载adlopeninterposer 例如: // foo.c #

比方说,我有一个可执行文件
a.out
。它拥有共享库
libcrypto.so
libmylib.so
。我想在每次LIB加载时都采取一些措施。是否有一些我可以添加代码的函数?因此,我将在可执行文件中定义一些函数,在本例中,它将被调用两次

我知道
\uuuuuuu属性((构造函数))
,但是应该为每个库专门定义它,这是不可能的

谢谢

我想在每次LIB加载时都采取一些措施。是否有一些我可以添加代码的函数

您的代码,没有。但是您可以
LD\u预加载
a
dlopen
interposer

例如:

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

__attribute__((constructor))
void ctor()
{
  printf("In %s:%d\n", __FILE__, __LINE__);
}
gcc-shared-o dlopen_preload.so dlopen_preload.c
LD_PRELOAD=./dlopen_PRELOAD.so./a.out
>>>主要
在foo.c:6中
我的dlopen(./foo.so,0x1)->0x565039670690
在foo.c:6中
我的dlopen(./bar.so,0x1)->0x565039670c90

你的意思是像钩住
dlopen
?@PeterT,是的。有没有更符合要求的方法?
// 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_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