Articles of 共享库

Bash脚本创build符号链接到共享库

我认为这个问题对于你的shell脚本怪物是相当容易的。 我正在寻找最优雅和最简单的方式来创build符号链接到Unix的共享库通过bash shell脚本。 我需要的是从“libmythings.so.1.1,libotherthings.so.5.11”等共享库文件列表开始,获取创build的符号链接,例如: libmythings.so -> libmythings.so.1 -> libmythings.so.1.1 libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11 库文件位于包含其他文件(如其他shell脚本)的目录中。 编辑 :好,“ldconfig -nN”。 可以正常工作,但是我还需要链接,没有在“.so”之后附加的库的主要编号,至less有一个库,因为一个或多个库是来自Java的JNI调用的入口点,所以当一个库通过System.loadlibrary(“libraryname”)的方式实例化,它期望一个名为“libraryname.so”的库,而不是“libraryname.so.X”。 只有ldconfig -nN的解决scheme可以工作,如果有Java部分的解决方法。

在头文件中声明'extern“C”到C ++共享库的效果是什么?

基于这个问题,我理解了链接C库和C ++代码的构造的目的。 现在假设如下: 我有一个用C ++编译器编译的'.so'共享库。 头文件有一个“typedef stuct”和一些函数声明。 如果标题包含extern“C”声明… #ifdef __cplusplus extern "C" { #endif // typedef struct …; // function decls #ifdef __cplusplus } #endif …有什么效果? 具体来说,我想知道是否有任何有害的副作用,因为共享库被编译为C ++,而不是C. 在这种情况下是否有任何理由有外部“C”声明?

加载一个DLL不止一次?

我正在使用LoadLibrary函数在Windows中加载DLL。 我的问题是这样的:如果我为同一个DLL不止一次地调用这个方法,我得到了不同的DLL实例的句柄,还是都会引用同一个实例? 另外,这种行为与Linux SO文件是如何相关的,是相同的还是完全不同的,在这方面我能做些什么假设? 谢谢。

如何使用waf来构build共享库?

我想用waf来构build一个共享库,因为它看起来比GNU自动工具更容易,更简单。 到目前为止,我还有几个与我开始写的wscript有关的问题: VERSION='0.0.1' APPNAME='libmylib' srcdir = '.' blddir = 'build' def set_options(opt): opt.tool_options('compiler_cc') pass def configure(conf): conf.check_tool('compiler_cc') conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb') def build(bld): bld.new_task_gen( features = 'cc cshlib', source = '*.c', target='libmylib') 包含source = '*.c'的行不起作用。 我必须指定每个.c文件而不是使用通配符吗? 例如,我怎样才能启用一个debugging版本(目前wscript正在使用debugging版本的CFLAGS,但我想使最终用户可选)。 计划将图书馆的资源放在一个子目录中,并且在自己的子目录中使用这些图书馆的程序。

dlopen – 未定义的符号错误

我正在使用dlopen在运行时加载共享库 dlopen("SharedLibarary1.so", RTLD_NOW | RTLD_GLOBAL); 在该共享对象中,我指的是在另一个共享库“SharedLibarary2.so”中定义的const char *。 可执行文件和两个库都是使用-rdynamic构build的。 但是,当使用dlopen时,我仍然遇到运行时错误:“/usr/lib/SharedLibarary1.so:undefined symbol”,并指向mangled的const char *有未定义的符号。 whith GDB的“信息共享”我可以看到,第二个库没有加载的错误点。 如果我在第一个图书馆做第二个图书馆之前做了一个dlopen,那么这个问题怎么会消失呢? 有没有更好的方法来强制加载器加载第二个库的未解决符号?

如何通过系统库强制使用本地共享库?

我怎样才能强制使用本地库在Linux系统库? 我明确地将我的可执行文件链接到我的项目/ lib目录中的一些.so文件,例如(../lib/libluajit.so)。 在gdb下运行我的可执行文件或使用ldd显示它仍然使用系统libluajit-5.1.so.2 然后我将LD_LIBRARY_PATH设置到我的项目/ lib目录并导出它,然后运行我的可执行文件。 不知何故,它仍然拿起系统库(由gdb和ldd确认) 我想知道这怎么可能,以及我能做些什么来强制它在我的project / lib目录中使用本地的libluajit.so。

C Linux:全局variables位于共享库中作为单例

如果库被多个进程使用,是否可以将位于共享库(.so)中的全局variables用作单例? 例如初始值为0,进程1递增var,然后proc2递增val并打印它。 到目前为止,我的实验表明,这两个进程保持variables的副本,如果第一次递增,第二次仍然会读取0.因此,行为不像Windows DLL … 我在这里读到一篇文章,如果全局variables不是静态的(在lib中),并且在头文件中声明为extern,那么var对于所有进程都是唯一的。 但到目前为止,我还没有能够做到这一点 – var仍然是每个进程的副本。 有人可以提供这个好的解释吗? 而如何做到这一点…

“警告:将共享库链接到静态库不是可移植的”是什么意思?

我正在使用libmxml.a函数库的一个dynamic库,但我得到这个警告: *Warning: Linking the shared library libgstmatroskademux.la against the _ *static library /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a _ is not portable! 我也得到这个警告: gcc: /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a: linker _ input file unused because linking not done 那么这个警告的意义是什么,我怎么解决呢? 编辑: 有一个已经自动生成的make文件来编译gstreamer插件。 现在,在该插件中使用libmxml.a的一些函数,我在make文件的GST_CFLAGSvariables中添加了$(PATH)/libmxml.a 。 现在,当我做了make install ,插件工作正常,但我仍然得到这个警告。

有人可以解释有关Linux库命名?

当我在Linux上创build一个库时,我使用这个方法: 构build:libhelloworld.so.1.0.0 链接:libhelloworld.so.1.0.0 libhelloworld.so 链接:libhelloworld.so.1.0.0 libhelloworld.so.1 版本控制是这样的,如果你改变了面向公众的方法,你可以build立libhelloworld.so.2.0.0例子(把1.0.0留在原来的地方),这样使用旧库的应用程序不会中断。 然而,命名1.0.0有什么意义 – 为什么不直接使用libhelloworld.so和libhelloworld.so.1呢? 另外 ,最好的做法是用1.0.0来命名你的库,或者仅仅是1? g++ … -Wl,-soname,libhelloworld.1 要么: g++ … -Wl,-soname,libhelloworld.1.0.0

.so在linux下注入:如何查找dlopen()的地址?

最近我对Linux感兴趣,正在尝试创build一个能够注入共享对象(即.so文件,“dynamic加载库”,Windows下的“DLL”)的程序。我知道这可以通过设置一个环境variables,但我想要在已经运行的进程上执行。 我已经知道如何在Windows下做到这一点。 有几种方法,但一般来说,您可以通过使用CreateRemoteThread()创build远程线程来调用LoadLibrary()。 当然你需要在远程进程中使用LoadLibrary的地址,但是(以我的经验),每个进程的偏移总是相同的。 我已经做了一些关于如何在Linux下完成的研究。 例如Phrack 59中一篇有趣的文章展示了如何做到这一点。 文章也有一个源代码附加,但由于一些假设是由目标进程,它是32位,我不能得到它的工作。 其他的东西,我碰到: 一个codeproject文章 ,但这只是解释如何从gdb内做到这一点。 (我会张贴更多的链接,但网站限制我2: – /。) 首先,我想获取远程进程中dlopen()函数的地址。 为此,我想通过获取stream程的ELF头,并遍历符号表。 其实,我设法做到这一点,通过: 1)获取ELF头(根据我的经验,存储在0x400000下的64位) 2)在标题为DYNAMIC的程序标题中find全局偏移量表。 3)通过访问全局偏移表中的第二个条目来获取第一个link_map。 4)迭代link_map链的dynamic部分,从而获得string表,符号表和散列表的地址(* Hash_Table + 0x4保存符号表中的条目数量。) 5)遍历符号表 从我的程序输出一些示例: ** looking at lib "" ** Trying to find symbol main in symbol table… numentries: 49 index 1 name: val: 0 … index 49 name: memcpy val: 0 symbol […]