当我尝试运行我只有执行权限的脚本时出现以下错误:uname:符号查找错误:/home/dumindara/random/sotest/a.out:undefinedsymbol:dlsym这是在我将LD_PRELOAD环境变量设置为/home/dumindara/random/sotest/a.out之后。a.out有一个测试malloc函数,内部调用dlsym。我在运行ls时没有遇到这个问题。大多数进程确实给出了这个错误。为什么会发生这种情况,我该怎么做才能让它发挥作用? 最佳答案 我无法对已接受的答案发表评论,但值得一提的是,当
我正在尝试使用clang-tidy来执行C++核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决:dlsym返回一个void*,我需要以某种方式将其转换为适当的函数指针。为此,我使用了reinterpret_cast。由于准则禁止这样做,因此我对此提出了警告。当然,我可以在任何地方放置//NOLINT注释,但我正在寻找一种不使用reinterpret_cast的解决方案,这样警告就会消失。这个问题有什么解决方法吗? 最佳答案 除了reinterpret_cast之外,该语言没有其他方法可以将函数指针类型转换为对象指针类型。这
我有两个相同行为的实现,我认为它们应该产生相同的结果,但却产生了不同的结果。当使用cgo在Go中编译时,我得到的符号地址解析与在C中编译时不同。我想了解原因。我将问题简化为几个小例子,一个用C语言,一个用Go语言。我在我的Mac笔记本电脑上运行的Ubuntu18Docker容器中测试了这些。测试.c://gcctest.c-D_GNU_SOURCE-ldl//Output:Real:0x7fd05559d7d0Current:0x7fd05559d7d0#include#includeintmain(){void*fd=dlopen("libc.so.6",RTLD_LAZY);voi
我正在尝试使用Qt5.3.0在LinuxMint17中编译C++程序。我已将以下行添加到.pro文件中:QMAKE_LFLAGS+=-ldl-fPIC我的程序使用了dlsym,但链接器找不到它。这是错误消息:undefinedreferencetosymbol'dlsym@@GLIBC_2.2.5'//lib/x86_64-linux-gnu/libdl.so.2:erroraddingsymbols:DSOmissingfromcommandline如何链接我的程序? 最佳答案 我建议为此使用LIBS变量而不是QMAKE_LFLA
我的标题可能不太清楚,所以请允许我解释一下。我有一段代码是这样的:void*pluginFile=dlopen(fileName,RTLD_LAZY);autofunction=dlsym(pluginFile,"ExpectedFunction");如果dlopen返回正确的文件,这会正常工作。我的问题是dlopen找不到文件并返回NULL。当前发生的是进行此调用:dlsym(0x0,"ExpectedFunction");问题是这会在我的项目中返回一个名为ExpectedFunction的随机函数。我认为dlsym会返回NULL,因为传递的句柄是NULL。我无法在线找到此类用例的预
我对错误的符号解析有疑问。我的主程序使用dlopen加载一个共享库,并使用dlsym从中加载一个符号。程序和库都是用C语言编写的。库代码inta(intb){returnb+1;}intc(intd){returna(d)+1;}为了让它在64位机器上工作,在编译时将-fPIC传递给gcc。程序是:#include#includeint(*a)(intb);int(*c)(intd);intmain(){void*lib=dlopen("./libtest.so",RTLD_LAZY);a=dlsym(lib,"a");c=dlsym(lib,"c");intd=c(6);intb=a
我需要为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()函数的地址?谢谢。
我想制作一个能够dlopen()一系列库(由我自己编写)并运行存储在名为test_suite的全局变量中的所有函数的程序>在那个.so文件中,这是一个以NULL结尾的函数指针数组(函数的签名是我自己预定义的,不用担心)。问题是g++破坏了那个变量。该库编译为:g++-Wall-shared-rdynamic-fPICfoo.cpp-ofoo.so“函数索引”声明并静态分配为:consttestunit_testcasetest_suite={...}还objdump-tfoo.so|greptest_suite显示:0000000000200940lO.data.rel.ro00000
来自Windows我习惯于在获得指向符号的指针后关闭DLL的句柄。使用dl函数时是否相同?在下面的示例中,在调用dlclose之后我是否仍然可以使用myFunction?如果不是,调用dlclose是否重要?void*handle=dlopen("someLibrary",0);if(handle){myFunction=dlsym(handle,"MyFunction");dlclose(handle);} 最佳答案 dlclose关闭共享库(假设它是对它的唯一引用),这意味着操作系统将取消映射共享库,而MyFunction很可能
简介让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。设置我定义了两个接口(interface),A和B:classA//Aninterface{public:virtual~A(){}virtualvoidwhatever_A()=0;};classB//Anotherinterface{public:virtual~B(){}virtualvoidwhatever_B()=0;};然后,我有一个共享库“testc”,它构造C类的对象,实现A和B,然后传递指向它们的A接口(interface)的指针:classC:publicA,publicB{public:C();~