dlopen

    0热度

    2回答

    我有一个遗留的C++代码,我正在尝试重新设计它。 我想将部分代码作为“.so”共享库从项目中取出,并通过“dlopen”动态加载它们。 我写了一个动态加载机制,可以在运行时动态加载新模块。 现在我想解耦来自主项目的现有模块。 例如,我从主项目中提取了模块“X”,并创建了可以稍后加载的共享库,但是主项目的某些部分直接使用了模块X的类,并且我无法更改它们。 我可以使用模块X的头文件编译项目,但链接器抛

    2热度

    1回答

    现在我在linux下编写一个可加载的.so模块,我想在主程序中使用dlopen,并在可加载的.so模块中使用_init()。我的计划是这样的: 主程序: ... dlopen(lib, flags); ... 加载模块: #define MODULE_EXPORT(name, minit, mexit) \ int __##name##_init(void) __attribut

    0热度

    2回答

    有没有办法在运行时确定哪些共享库已加载到当前进程的全局符号名称空间中?我主要对任何因使用RTLD_GLOBAL标志的dlopen()调用而加载的任何内容感兴趣。 我想对审计的目的做到这一点 - 它是我对动态加载的共享库工作的重要应用程序加载与的RTLD_LOCALdlopen尽可能以不与第三方的代码相冲突;任何加载到全局符号名称空间的内容都需要严格控制。 我已经看过dl_iterate_phdr(

    1热度

    1回答

    我想使用一个古老的软件(从1999年开始的虚幻竞技场“经典”,也被称为UT99)。隐式加载动态库libtxc_dxtn.so,探测可选的S3纹理压缩(S3TC)支持。不幸的是,在加载库时,主应用程序崩溃并出现分段错误(崩溃还描述了here)。解决方法似乎是通过删除或移动libtxc_dxtn.so来移除Mesa的纹理压缩库。应用程序运行得非常好,没有纹理压缩,但当然其他需要纹理压缩支持的应用程序现

    1热度

    1回答

    据其man page,dlopen()不会加载同一库两次: 如果相同的共享对象被使用dlopen再次加载(),则返回相同 对象的句柄。动态链接器维护对象句柄的引用计数 ,因此动态加载的共享对象是 不会被释放,直到在其上调用dlclose()的次数为 (因为dlopen()已成功执行)。任何初始化返回(请参阅下面的 )都只调用一次。但是,随后的调用 的dlopen()加载与RTLD_NOW相同的共享

    1热度

    1回答

    我试图检查一个程序的行为,该程序调用dlopen和dlsym:最终目标是设置一个微调函数,用于记录调用通过dlsym获得的函数。 通常情况下,要与DYLD_INSERT_LIBRARIES包装一些功能foo,你写的东西是这样的: void (*real_foo)(void); void init() __attribute__((constructor)) { real_foo =

    -1热度

    1回答

    由于特殊原因,我的共享库(.so文件)必须压缩到用于C使用的.zip文件中。 是否可以在不更改动态链接器的情况下为C代码动态加载(dlopen或调用)共享库(.so)文件形式的.zip文件?

    1热度

    1回答

    已经解决!See the result here。 不知道我是否在正确的地方问,但有没有人知道基于.h文件生成dlopen和dlsym命令的正确方法? 我想动态加载SDL2 - 这是一个用C编写的库 - 但所有提取函数列表和他们的参数与ctags的方法似乎没有结果(必须手动更正240个函数的参数列表3500是不好玩)。 ctags -R -x --sort=yes --c++-kinds=+p -

    0热度

    1回答

    我假设我在使用dlopen时不必链接到共享库。然而,在cmake的target_link_libraries(main_dlopen dl)导致链接错误 main_dlopen.cpp.o: In function `main': main_dlopen.cpp:25: undefined reference to `ntclass::init(char const*)' etc... 如

    0热度

    1回答

    我有一个使用单身的程序。该程序在运行时加载共享对象库。这个库也使用同一个单例。 问题是,当从库中访问单例时,将创建单例的新实例。 程序与-rdynamic联系,我用-fPIC两个和装载情况是这样的: std::shared_ptr<Module> createModuleObject(const std::string& filename) { if (!fs::exists(file