这个问题在这里已经有了答案:buildinga.sothatisalsoanexecutable(3个答案)关闭7年前。这是理论问题。我知道也许最佳实践是使用共享库。但我遇到了这个问题,似乎无法在任何地方找到答案。如何构造代码并编译成ELF格式的C/C++程序,以便用dlopen()加载?例如,如果一个可执行文件包含某个函数inttest()的实现,我想从我的程序中调用这个函数(最好是获取函数的结果),如果可能的话,我该怎么做呢?在伪代码中我可以这样描述它:ELF可执行源:voidmain(){inti=test();printf("Returned:%d",i);//Prints"R
我正在使用arm-linux-gnueabi-g++版本4.7.3进行编译。我在以下位置安装了arm-linux-gnueabi库:/usr/arm-linux-gnueabi/lib,itcontainslibdl.a,libdl.so,libdl.so.2,andlibdl-2.19.so.libdl.so链接到libdl.so.2,后者链接到libdl-2.19.so。我正在尝试链接到dl库(请参阅下面的命令字符串),但我总是遇到undefinedreference错误。arm-linux-gnueabi-g++-I.-I../-I../Comms/Linux-Wall-DLIN
我正在使用arm-linux-gnueabi-g++版本4.7.3进行编译。我在以下位置安装了arm-linux-gnueabi库:/usr/arm-linux-gnueabi/lib,itcontainslibdl.a,libdl.so,libdl.so.2,andlibdl-2.19.so.libdl.so链接到libdl.so.2,后者链接到libdl-2.19.so。我正在尝试链接到dl库(请参阅下面的命令字符串),但我总是遇到undefinedreference错误。arm-linux-gnueabi-g++-I.-I../-I../Comms/Linux-Wall-DLIN
大多数在Linux上使用OpenGL的应用程序(和库)在运行时使用dlopenAPI加载libGL.so,而不是动态链接它。他们为什么要这样做?我能想到的唯一原因是因为任何图形驱动程序供应商都提供不同的libGL,而两个不同的libGL可能是ABI不兼容的。(好吧,嗯,为什么它们应该是ABI不兼容的?即使它们是,为什么通过dlopen加载它们会解决这个问题?)无论如何,如果有充分的理由这样做,我也愿意这样做。有没有人有通过dlopen加载所有OpenGL函数的开源C/C++代码的链接,我可以将其包含到我的项目中而无需太多调整? 最佳答案
大多数在Linux上使用OpenGL的应用程序(和库)在运行时使用dlopenAPI加载libGL.so,而不是动态链接它。他们为什么要这样做?我能想到的唯一原因是因为任何图形驱动程序供应商都提供不同的libGL,而两个不同的libGL可能是ABI不兼容的。(好吧,嗯,为什么它们应该是ABI不兼容的?即使它们是,为什么通过dlopen加载它们会解决这个问题?)无论如何,如果有充分的理由这样做,我也愿意这样做。有没有人有通过dlopen加载所有OpenGL函数的开源C/C++代码的链接,我可以将其包含到我的项目中而无需太多调整? 最佳答案
我想使用GDB调试在Linux2.6上运行的进程。attachPID(其中PID是进程ID)、printmain、printsin、printgzopen和printdlopen工作(即他们找到各自的符号)。但是printmyfoo不起作用,其中myfoo是进程使用dlopen.so文件加载的函数。这是我得到的:(gdb)printmain$3={int(int,char**)}0x805ba90(gdb)printsin$4={}0xb7701230(gdb)printgzopen$5={}0xb720df50(gdb)printdlopen$6={}0xb77248e0(gdb)p
我想使用GDB调试在Linux2.6上运行的进程。attachPID(其中PID是进程ID)、printmain、printsin、printgzopen和printdlopen工作(即他们找到各自的符号)。但是printmyfoo不起作用,其中myfoo是进程使用dlopen.so文件加载的函数。这是我得到的:(gdb)printmain$3={int(int,char**)}0x805ba90(gdb)printsin$4={}0xb7701230(gdb)printgzopen$5={}0xb720df50(gdb)printdlopen$6={}0xb77248e0(gdb)p
当我使用dl_open()时,我能否以编程方式从共享库(仅限Linux)中获取所有函数名称的列表?我想要这样的东西:std::vectorlist_all_functions(void*dl){//...whatcanIdohere?}intmain(){void*dl=dl_open("./mylib.so",RTLD_NOW);autofunctions=list_all_functions(dl);//...dl_close(dl);return0;}示例库(mylib.so)标题(.h):extern"C"{intsum(inta,intb);}来源(.c):intsum(in
当我使用dl_open()时,我能否以编程方式从共享库(仅限Linux)中获取所有函数名称的列表?我想要这样的东西:std::vectorlist_all_functions(void*dl){//...whatcanIdohere?}intmain(){void*dl=dl_open("./mylib.so",RTLD_NOW);autofunctions=list_all_functions(dl);//...dl_close(dl);return0;}示例库(mylib.so)标题(.h):extern"C"{intsum(inta,intb);}来源(.c):intsum(in
我的程序使用dlopen加载共享对象,然后使用dlclose卸载它。有时会再次加载此共享对象。我注意到静态变量没有重新初始化(这对我的程序很重要)所以我在dlclose之后添加了一个测试(dlopen和RTLD_NOLOAD)>看看库是否真的被卸载了。果然还在内存中。然后我尝试反复调用dlclose直到库真正卸载,但我得到的是一个无限循环。这是我用来检查库是否已卸载的代码:dlclose(handles[name]);do{void*handle=dlopen(filenames[name],RTLD_NOW|RTLD_NOLOAD);if(!handle)break;dlclose(