Tag: 共享库

如何将函数地址映射到* .so文件中

backtrace函数给出一组回溯如何用函数名/文件名/行号映射它? for ex:- backtrace() returned 8 addresses ./libtst.so(myfunc5+0x2b) [0xb7767767] ./libtst.so(fun4+0x4a) [0xb7767831] ./libtst.so(fun3+0x48) [0xb776787f] ./libtst.so(fun2+0x35) [0xb77678ba] ./libtst.so(fun1+0x35) [0xb77678f5] ./a.out() [0x80485b9] /lib/libc.so.6(__libc_start_main+0xe5) [0xb75e9be5] ./a.out() [0x80484f1] 从上面的堆栈我怎样才能获得文件名和行号? 我做了以下事情,但没有运气。 如果我错了,请纠正我:) for ex:- ./libtst.so(fun2+0x35) [0xb77dc887] 0xb77dc887(fun2 addr+offset)-0xb77b6000 (lib starting addr) = 0x26887 (result) result is no way related to function in nm output. I used addr2line command:- addr2line -f -e […]

如何在共享库中隐藏导出的符号名称

对于VC,我可以编写一个DEF文件并使用’NONAME’指令在dll的导出表中只保留序号。 我怎么能用gcc和ELF格式共享库做同样的事情? 或者,在ELF共享库中是否存在类似PE格式DLL中的序号的东西? 如果没有,我如何在共享库中隐藏导出的符号名称? ====================================== 更新:一些额外的描述: 在Windows中,您可以通过仅放置具有空名称的整数ID(序号)来导出函数。 为了显示它,dll导出表的正常布局如下所示: http : //home.hiwaay.net/~georgech/WhitePapers/Exporting/HowTo22.gif 。 “NONAME”看起来像这样: http ://home.hiwaay.net/~georgech/WhitePapers/Exporting/HowTo23.gif。 请注意,第二张图片中的函数名称为“N / A”。 以下是对它的完整解释:hxxp://home.hiwaay.net/~georgech/WhitePapers/Exporting/Exp.htm。 ====================================== 更新:非常感谢所有给我建议的人。 最后,我决定在linux / posix平台上使用静态库。 但是将小的“特殊部分”(使用一些不适合静态库的特性,例如:TLS Slot等)提取到普通的共享库中 。 因为小型普通共享库只做很少的事情,而且这些工作完全不敏感,所以不需要隐藏/隐藏它的API。 我认为这是解决我问题的最简单方法:-D

是否有类似PHP的Python的ctype? 访问库而无需编写扩展名?

Python有ctypes来访问库。 在PHP中,您为所有内容编写扩展。 像libgd这样的流行扩展几乎可以在任何地方使用。 有没有像Python的ctypes一样工作的扩展,让你可以访问库而无需编写PHP扩展?

如何在不使用LD_LIBRARY_PATH的情况下在makefile中链接特定版本的共享库?

我知道LD_LIBRARY_PATH是邪恶的,避免使用它是一个好习惯。 我在远程Solaris 9服务器上有一个名为server.c的程序,它包含两个版本的openssl库(0.9.8和1.0.0),我使用的是gcc 3.4.6。 我的程序需要链接到1.0.0a版本。 因为它是工作环境,所以我无权修改openssl库目录中的任何内容。 我想在不设置LD_LIBRARY_PATH情况下用-L和-R选项编译我的程序,它运行正常。 (我注意到没有设置-R选项它将无法工作)但编译后的程序保持链接到/usr/local/ssl/lib/libssl.so.0.9.8而不是/…/libssl.so.1.0.0 。 有解决办法吗? 顺便说一句,如果我错了,请纠正我:是-R选项在运行时实际“链接”共享库而-L选项只在编译时“加载”共享库吗? 任何帮助都感激不尽! Z.Zen ////////////////////////////////////////////// 这是我的Makefile : CC = gcc OPENSSLDIR = /usr/local/ssl CFLAGS = -g -Wall -W -I${OPENSSLDIR}/include -O2 -D_REENTRANT -D__EXTENSIONS__ RPATH = -R${OPENSSLDIR}/lib LD = ${RPATH} -L${OPENSSLDIR}/lib -lssl -lcrypto -lsocket -lnsl -lpthread OBJS = common.o PROGS = server all: ${PROGS} server: server.o ${OBJS} ${CC} […]

如何组合共享库?

我有一些.so库,我想将它们合并到一个共享库中,这样它就不再依赖于原始的.so文件了。 .so文件彼此依赖。 我怎样才能做到这一点? 我可以这样做吗?

我可以通过链接静态库来构建共享库吗?

我有一堆静态库(* .a),我想构建一个共享库(* .so)来链接这些静态库(* .a)。 我怎么能用gcc / g ++这样做?

从OS X上的C中的dlopen()ed动态库访问主程序全局变量

我正在维护一个具有类似插件function的小应用程序 ,它通过运行时加载的动态模块实现。 具体来说,因为它是一个Gtk +应用程序,我正在使用gmodule,但问题也适用于基于dlfcn.h / dlopen()的动态库加载。 我的主程序有一个包含一些全局信息的全局结构变量。 我希望这些信息可用于动态加载的插件中定义的函数。 在Linux上,我可以直接引用这个全局变量 – 这很好用,我猜测gcc或链接器负责将全局变量从主程序导出到动态库。 问题是,这在Mac OS X上不起作用。有没有办法在OS X上执行此操作? 如果没有,是否有更多的“最佳实践”方法将全局信息公开给动态加载的库?

将共享库与静态库链接:静态库的编译方式必须与应用程序链接它的方式不同吗?

至少在Linux和Solaris上,静态库实际上只是一堆编译好的.o文件被扔进一个大文件中。 编译静态库时,通常会忽略-fpic标志,因此生成的代码与位置有关。 现在说我的静态库是B.我已经构建了它并且得到了.a文件,它实际上只是所有位置相关的.o文件的全局。 现在我有一个我想构建的共享库,A,我希望它静态链接B.当我构建A时,我自然会使用-fpic标志使生成的代码位置独立。 但是,如果我链接B,我不是混合位置依赖和位置独立的目标文件? 除非我还指定-mimpure-text,否则我会收到很多文本重定位错误,我认为这可能是原因。 看来,当我编译一个库时,我真的需要编译它3次,共享版本,静态版本和静态 – 可以使用的共享库版本。 我对吗? 我可以继续使用-mimpure-text但g ++手册页说如果你这样做,对象实际上并没有最终被共享(不清楚它是否全部未被共享,或者仅仅是静态链接的部分,有人知道吗?) 。

共享库和.h文件

我对程序如何使用共享库有一些疑问。 当我构建一个共享库(使用-shared -fPIC开关)时,我可以从外部程序中获取一些函数。 通常我会使用dlopen()来加载库,然后使用dlsym()将所述函数链接到某些函数指针。 此方法不涉及任何.h文件。 有没有办法避免做dlopen()和dlsym(),只包括共享库的.h? 我想这可能是c ++程序如何使用存储在系统共享库中的代码。 即仅包括stdlib.h等

`-rdynamic’究竟做了什么以及何时需要它?

-rdynamic (或–export-dynamic器级别的–export-dynamic )究竟做了什么以及它如何与-fvisibility* flags或visibility pragma s和__attribute__ s定义的符号可见性相关? 对于–export-dynamic , ld(1)提到: …如果使用“dlopen”加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项。 … 我不确定我完全明白这一点。 你能否提供一个例子,如果没有-rdynamic ,它会不起作用,但是呢? 编辑 :我实际上尝试编译了几个虚拟库(单个文件,多个文件,各种-O级别,一些函数间调用,一些隐藏符号,一些可见),有和没有-rdynamic ,到目前为止我已经得到字节相同的输出(当然保持所有其他标志不变),这是非常令人费解的。