我需要为dlsym()和dlopen()系统调用实现Hook。为了从Hook中调用原始的dlsym(),我需要获取此系统调用的地址。我尝试在so-library-constructor-function中获取地址。但我只得到钩子(Hook)函数的地址。我尝试将处理程序指定为RTLD_DEFAULT和RTLD_NEXT。使用RTLD_DEFAULT时,我得到NULL。使用RTLD_NEXT时,我得到了Hook函数的地址。dlopen()出于同样的原因我不能使用,因为我在dlopen()上有钩子(Hook)。请告诉我,如何获取原始dlopen()和dlsym()函数的地址?谢谢。
假设我有一个库-foo.so。在构建我的二进制文件(需要这个库)时,我可以(1)链接foo.so,或者(2)在程序源代码中,dlopen这个库,然后调用这个库提供的函数当我从库中调用函数时,(1)和(2)之间是否存在任何性能差异?请注意,我知道会有不同的初始化特征(例如dlopen的成本、首次使用符号的开销等),但在稳定状态下,两种替代方案是同样快还是更快?谢谢。 最佳答案 如果库是使用gcc-Wall-fPIC-O2编译并使用gcc链接的共享对象(即一些lib*.so文件)-shared那么它是一个ELFPositionIndep
dlopen位于libdl.a但当我将我的应用程序链接到libdl.a时,gcc链接器抛出此错误:对在dlopen中调用的__dlopen的未知引用我应该导入另一个.a吗? 最佳答案 当我尝试静态编译dlopen模型程序时,gcc(Archlinux/gcc版本4.6.120110819(预发布))告诉我:$gcctest.c-ldl-static/tmp/ccsWe4RN.o:Infunction`main':test.c:(.text+0x13):warning:Using'dlopen'instaticallylinkedap
如果我在同一个应用程序运行中对同一个库/文件使用dlopen两次,它会在这两种情况下产生相同的句柄吗?这有什么保证吗(一个简短的实验表明它至少在我的盒子上是这样)?我目前正在玩一个小插件系统(出于好奇),如果对这种观察到的行为有某种保证,我可以使用这个地址作为插件的键来防止重复加载。 最佳答案 是的。dlopen(3)linux手册页说:Ifthesamelibraryisloadedagainwithdlopen(),thesamefilehandleisreturned.Thedllibrarymaintainsreferenc
我正在使用dlopen在运行时加载共享库dlopen("SharedLibarary1.so",RTLD_NOW|RTLD_GLOBAL);在该共享对象中,我引用了另一个共享库“SharedLibarary2.so”中定义的constchar*。可执行文件和两个库都是使用-rdynamic构建的。但我在使用dlopen时仍然遇到运行时错误:“/usr/lib/SharedLibarary1.so:undefinedsymbol”并指向损坏的constchar*具有undefinedsymbol。通过GDB“信息共享”,我可以看到第二个库未在错误点加载。如果我在第一个库上执行dlopen
我有一个linux共享库foo.so,它是使用dlopen("foo.so",RTLD_NOW|RTLD_LOCAL)从可执行文件加载的。从foo.so我想dlopen另一个库bar.so,它引用foo.so中定义的符号,但链接器找不到它们。我无法将RTLD_LOCAL更改为RTLD_GLOBAL,因为我没有执行加载的可执行文件的源代码。我认为-Wl,--export-dynamic在链接foo.so时可能会有所帮助,但它不会覆盖dlopen的本地标志。GCC的新属性可见性功能看起来也无法提供答案。有没有一种方法可以指示链接器将对bar.so中undefinedsymbol的引用解析为
我正在尝试获取ELF二进制文件的加载地址,butdlopendoesn't按预期工作:void*elf=(char*)dlopen(0,RTLD_NOW);printf("%p\n",elf);sleep(100);它打印0xb772d918,但是从/proc/1510/maps告诉我们,它没有指向dlfn的加载地址>二进制,但是ld-2.15.so,08048000-08049000r-xp00000000fc:001379/root/dlfn08049000-0804a000r--p00000000fc:001379/root/dlfn0804a000-0804b000rw-p00
在我的程序中有如下代码/*libnamemaybearelativepath*/voidloadLib(charconst*libname){void*handle=dlopen(libname);/*...*/dlclose(handle);}在/*..*/中,我需要读取内存映射文件/proc/self/maps,找到所在的虚拟内存地址>libname被映射到,我还需要打开库以找到其中的某些部分。为此,我需要dlopen通过在各个地方(例如,在ldconfig缓存文件中)搜索找到的绝对名称。我怎样才能收到该文件名?这就是我最终得到的结果(是的,这是C++代码,尽管如此,C标记对于这个
我正在尝试将相机库.so文件动态加载到Linux可执行文件中,以访问简单的相机功能。我试图通过以下方式做到这一点:if((newHandle=dlopen("./libCamera.so",RTLD_LAZY|RTLD_GLOBAL))==NULL){printf("Couldnotopenfile:%s\n",dlerror());return1;}但是这失败了,我收到以下输出:“无法打开文件:libCamera.so:undefinedsymbol:ZTVN10_cxxabiv117__class_type_infoE”我如何找出它所依赖的符号? 最佳答
有没有办法让共享库在加载时得到“通知”?换句话说,假设我在共享库上使用dlopen,是否有一个函数在共享库(例如main?)上自动调用(如果存在) 最佳答案 Librariesshouldexportinitializationandcleanuproutinesusingthegcc__attribute__((constructor))and__attribute__((destructor))functionattributes.Seethegccinfopagesforinformationonthese.Construct