草庐IT

shared-libraries

全部标签

c++ - 在 exec 和 shared libaray 中编译时,全局变量在 Windows 上有多个拷贝,在 Linux 上有一个拷贝

*问题已修改(见下文)*我有一个定义静态全局变量的cpp文件,例如staticFoobar;这个cpp文件被编译成一个可执行文件和一个共享库。可执行文件可以在运行时加载共享库。如果我在Linux上,这个变量似乎有两个拷贝。我假设一个来自可执行文件,一个来自共享库。其他平台(HP、Windows)好像只有一份。在Linux上是什么控制着这种行为,我可以改变它吗?例如,是否有编译器或链接器标志强制共享库中此变量的版本与可执行文件中的版本相同?*修改问题*感谢您到目前为止的回答。在重新检查问题时,它实际上不是上述问题。上面的静态全局变量在Windows上确实有多个拷贝,所以与我在Linux上

linux - dlopen 失败 : cannot open shared object file: No such file or directory

问题是我使用dlopen加载库(.so是我写的,不是系统库),但是我得到了标题中显示的错误。我已经包含了dlfcn.h在编译器中,我使用了-ldl命令我想加载的只是源代码文件夹,我尝试添加-L.,但没有成功。 最佳答案 找出代码哪里出错的最残酷和有效的方法是以下命令,它将激活共享库的Debug模式并记录在案here:exportLD_DEBUG=libs然后,您会惊讶地弹出这么多信息。别担心,这些信息会告诉您刚刚键入的命令需要哪些共享库,以及在哪里可以找到这些需要的库。例如,如果您键入reset,屏幕将被重置,然后有关共享库的信息r

linux - dlopen 失败 : cannot open shared object file: No such file or directory

问题是我使用dlopen加载库(.so是我写的,不是系统库),但是我得到了标题中显示的错误。我已经包含了dlfcn.h在编译器中,我使用了-ldl命令我想加载的只是源代码文件夹,我尝试添加-L.,但没有成功。 最佳答案 找出代码哪里出错的最残酷和有效的方法是以下命令,它将激活共享库的Debug模式并记录在案here:exportLD_DEBUG=libs然后,您会惊讶地弹出这么多信息。别担心,这些信息会告诉您刚刚键入的命令需要哪些共享库,以及在哪里可以找到这些需要的库。例如,如果您键入reset,屏幕将被重置,然后有关共享库的信息r

linux - 加载共享库 : libevent-1. 4.so.2 时出错:无法打开共享对象文件:

我正在为一个程序使用libevent,我在两台计算机A和B上编译我的程序,在A上执行成功,但在B上出现以下错误:errorwhileloadingsharedlibraries:libevent-1.4.so.2:cannotopensharedobjectfile:Nosuchfileordirectory仅供引用:A和B都是fedora系统,我在A和B上下载了libevent-1.4.14b-stable.tar.gz,通过configure/make/makeinstall安装。在A上[esolve@kittytemp]$uname-r3.6.10-2.fc16.x86_64[e

linux - 加载共享库 : libevent-1. 4.so.2 时出错:无法打开共享对象文件:

我正在为一个程序使用libevent,我在两台计算机A和B上编译我的程序,在A上执行成功,但在B上出现以下错误:errorwhileloadingsharedlibraries:libevent-1.4.so.2:cannotopensharedobjectfile:Nosuchfileordirectory仅供引用:A和B都是fedora系统,我在A和B上下载了libevent-1.4.14b-stable.tar.gz,通过configure/make/makeinstall安装。在A上[esolve@kittytemp]$uname-r3.6.10-2.fc16.x86_64[e

c - 使用 linux 功能是否禁用 LD_PRELOAD

在我的自定义环境中,预加载了一个拦截器库,它运行bind()、connect()等调用的特殊实现。我看到的问题是,每当应用程序使用命令setcap显式启用功能时,执行应用程序无法预加载拦截器库并调用默认libcconnect()。这是预期的行为吗?如果是,禁用LD_PRELOAD的原因可能是什么?是否有任何调整或方法可以用来成功预加载启用功能的库? 最佳答案 就像OliverMatthews回答的那样,出于安全原因,LD_PRELOAD对于setuid二进制文件和具有文件功能的二进制文件都被禁用。要在启用文件功能的同时预加载库,您有

c - 使用 linux 功能是否禁用 LD_PRELOAD

在我的自定义环境中,预加载了一个拦截器库,它运行bind()、connect()等调用的特殊实现。我看到的问题是,每当应用程序使用命令setcap显式启用功能时,执行应用程序无法预加载拦截器库并调用默认libcconnect()。这是预期的行为吗?如果是,禁用LD_PRELOAD的原因可能是什么?是否有任何调整或方法可以用来成功预加载启用功能的库? 最佳答案 就像OliverMatthews回答的那样,出于安全原因,LD_PRELOAD对于setuid二进制文件和具有文件功能的二进制文件都被禁用。要在启用文件功能的同时预加载库,您有

c - LD_PRELOAD 即使在 unsetenv ("LD_PRELOAD"之后也会影响新的 child )

我的代码如下:preload.c,内容如下:#include#includeint__attribute__((constructor))main_init(void){printf("UnsettingLD_PRELOAD:%x\n",unsetenv("LD_PRELOAD"));FILE*fp=popen("ls","r");pclose(fp);}然后在shell中(小心执行第二条命令!!):gccpreload.c-shared-Wl,-soname,mylib-omylib.so-fPICLD_PRELOAD=./mylib.sobash!!!小心最后一个命令,它会导致fo

c - LD_PRELOAD 即使在 unsetenv ("LD_PRELOAD"之后也会影响新的 child )

我的代码如下:preload.c,内容如下:#include#includeint__attribute__((constructor))main_init(void){printf("UnsettingLD_PRELOAD:%x\n",unsetenv("LD_PRELOAD"));FILE*fp=popen("ls","r");pclose(fp);}然后在shell中(小心执行第二条命令!!):gccpreload.c-shared-Wl,-soname,mylib-omylib.so-fPICLD_PRELOAD=./mylib.sobash!!!小心最后一个命令,它会导致fo

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

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