草庐IT

shared-libraries

全部标签

c++ - 关于 Unix 上共享库的困境

如果我构建一个共享库(共享对象),我可以通过以下两种方式使用它:第一种方法是像使用静态库一样使用共享库。#include"myLib.h"//...//afterwardsIcanusefunctionsdefinedinmylib.hmyFunction();第二种使用共享库的方法是调用动态加载器API函数:dlfcn的dlopen、dlsym和dlclose.h。例如,当我想实现一个插件模式时,我会以这种方式使用共享库。列表看起来像这样:#includevoid*myLib;/*Handletosharedlibfile*/void(*myFunction)();/*Pointer

c++ - 为什么在运行时更改 LD_LIBRARY_PATH 不会在可执行文件加载后反射(reflect)在可执行文件上

我正在尝试从我的C++程序中更改LD_LIBRARY_PATH。我可以使用getenv("LD_LIBRARY_PATH")获取它的值并使用setenv()设置它的值(而且我知道这是可行的,因为当我再次调用getenv("LD_LIBRARY_PATH")时,我得到了更新后的值),但是从程序内部更改它的值对它:我仍然收到此错误消息:FailedtoLoadthesharedlibraryfile如果我在加载可执行文件或启动应用程序之前设置值,它可以正常工作。 最佳答案 不幸的是,在正在运行的程序中设置LD_LIBRARY_PATH不

c++ - 为什么在运行时更改 LD_LIBRARY_PATH 不会在可执行文件加载后反射(reflect)在可执行文件上

我正在尝试从我的C++程序中更改LD_LIBRARY_PATH。我可以使用getenv("LD_LIBRARY_PATH")获取它的值并使用setenv()设置它的值(而且我知道这是可行的,因为当我再次调用getenv("LD_LIBRARY_PATH")时,我得到了更新后的值),但是从程序内部更改它的值对它:我仍然收到此错误消息:FailedtoLoadthesharedlibraryfile如果我在加载可执行文件或启动应用程序之前设置值,它可以正常工作。 最佳答案 不幸的是,在正在运行的程序中设置LD_LIBRARY_PATH不

linux - 混合静态库和共享库

我有一个项目,其中有一个静态库libhelper.a和另一个与我的实际共享对象库libteSTLib.so的静态库。我的目标是将libhelper.a链接到libteSTLib.so。这在Linux/BSD上可行吗?当我尝试创建一个测试程序时,出现了以下错误:./prog1:/usr/local/lib/libtestlib.so.1.0:undefinedsymbol''我猜这是因为libhelper.a不是用-fPIC编译的,而libteSTLib.so是。构建使用同时依赖于静态库的共享库的程序的正确方法是什么?谢谢! 最佳答案

linux - 混合静态库和共享库

我有一个项目,其中有一个静态库libhelper.a和另一个与我的实际共享对象库libteSTLib.so的静态库。我的目标是将libhelper.a链接到libteSTLib.so。这在Linux/BSD上可行吗?当我尝试创建一个测试程序时,出现了以下错误:./prog1:/usr/local/lib/libtestlib.so.1.0:undefinedsymbol''我猜这是因为libhelper.a不是用-fPIC编译的,而libteSTLib.so是。构建使用同时依赖于静态库的共享库的程序的正确方法是什么?谢谢! 最佳答案

c++ - gdb 说 "cannot open shared object file"

我有一个二进制文件和一个共享库。共享库编译为:all:g++-g-shared-fpic$(SOURCES)-olibmisc.so二进制文件编译为:LIBS=-L../../misc/srcLDFLAGS=-lmiscall:g++-g-omainx$(INCLUDE)$(SOURCE)$(LIBS)$(LDFLAGS)我设置在~/.bashrcexportLD_LIBRARY_PATH=/mnt/sda5/Programming/misc/src/到libmisc.so输出路径。从控制台调试工作正常:gdbmainx但是在Emacs22中,启动gdb失败并显示以下消息:Starti

c++ - gdb 说 "cannot open shared object file"

我有一个二进制文件和一个共享库。共享库编译为:all:g++-g-shared-fpic$(SOURCES)-olibmisc.so二进制文件编译为:LIBS=-L../../misc/srcLDFLAGS=-lmiscall:g++-g-omainx$(INCLUDE)$(SOURCE)$(LIBS)$(LDFLAGS)我设置在~/.bashrcexportLD_LIBRARY_PATH=/mnt/sda5/Programming/misc/src/到libmisc.so输出路径。从控制台调试工作正常:gdbmainx但是在Emacs22中,启动gdb失败并显示以下消息:Starti

linux - 强制 GCC 静态链接,例如pthreads(而不是动态链接)

我的程序构建为一个加载器和许多模块,它们是共享库。现在,其中一个库使用pthreads,它似乎动态绑定(bind)到模块(在启动时加载)。现在,如果我可以强制将pthreads链接到模块文件中,那就更简单了。Linux上的GCC,我该怎么做?我想libpthread.a是必需的.... 最佳答案 虽然将libpthread.a链接到共享库在理论上是可行的,但这是一个非常糟糕的主意。原因是libpthread是glibc的一部分,所有glibc的部分必须完全匹配,否则您会看到奇怪且无法解释的崩溃。因此将libpthread.a链接到您

linux - 强制 GCC 静态链接,例如pthreads(而不是动态链接)

我的程序构建为一个加载器和许多模块,它们是共享库。现在,其中一个库使用pthreads,它似乎动态绑定(bind)到模块(在启动时加载)。现在,如果我可以强制将pthreads链接到模块文件中,那就更简单了。Linux上的GCC,我该怎么做?我想libpthread.a是必需的.... 最佳答案 虽然将libpthread.a链接到共享库在理论上是可行的,但这是一个非常糟糕的主意。原因是libpthread是glibc的一部分,所有glibc的部分必须完全匹配,否则您会看到奇怪且无法解释的崩溃。因此将libpthread.a链接到您

linux - 如何使用$ORIGIN 和suid 应用程序?

我正在使用启用了setcapCAP_NET_RAW的python。我的python脚本导入了一个共享库,它的RPATH中有$ORIGIN。由于我的python现在是一个suid应用程序,因此未评估$ORIGIN并且库未正确加载(这是由于securityleakfoundinglibc引起的)。有没有办法告诉链接器我的库路径是安全的并加载库?一些注意事项:我只在开发阶段需要这个功能。我不是在寻找生产解决方案。以root身份工作时,一切正常。我不想以root身份工作。谢谢,戴夫 最佳答案 您可以尝试其中之一。考虑一下是解决$ORIGIN