Articles of 共享库

如何从Ocaml使用自己的共享库.so调用C ++代码?

我需要build立一个调用共享对象(Linux下的.so)的Ocaml / C ++模块, 只要编译一个简单的Ocaml / C ++存根就是一个问题,我pipe理这个东西,但是当我需要将.so和ocamlmklib或者ocamlopt连接起来的时候,它会失败 我在gcc 4.5下工作(c ++ 0x) 共享对象的文件: hello.hpp #include <iostream> #include <string> using namespace std; class HelloApplication { public : HelloApplication(); ~HelloApplication(); void say(string s); }; typedef HelloApplication *(*create_hello)(); hello.cpp: #include "hello.hpp" HelloApplication::HelloApplication(){} HelloApplication::~HelloApplication(){} void HelloApplication::say(string s) { cout << "Hello : " << s << endl; } extern […]

C程序使用glibc编译而不是默认库:执行权限被拒绝

这是我在stackoverflow的第一个问题,所以我会尽力做好。 语境: 我想提供一个可以在每个Linux发行版上运行的程序(例如,将使用C ++ 11的程序,在没有C ++ 11程序库的系统上运行)。 为此,我想复制我的程序使用的所有库,并将它们放在一个带有可执行文件的文件夹中,以便它可以使用这些库而不是系统的库。 我有两个环境来testing: – Opensuse,(GNU libc)2.19 – Ubuntu,(Ubuntu EGLIBC 2.17-Oubuntu5.1)2.17 我在Opensuse下编译我的程序,并在Ubuntu下运行它。 该程序使用默认库时效果很好。 项目: 这里是main.c : int main(int ac, char **av) { printf("Hello World !\n"); } 这里是Opensuse下的文件夹树(在没有main.c和exec.sh的Ubuntu下也一样): + project | +— main.c +— a.out +— exec.sh +—+ lib | +— libc.so.6 +— ld-linux-x86-64.so.2 最后,当我用一个简单的编译启动程序时,这里是ldd和readelf: > gcc main.c -o a.out > […]

-finstrument-functions不适用于dynamic加载的g ++共享对象(.so)

我正在用Ubuntu上的g ++共享对象(.so)文件testing-finstrument函数。 我发现了一个奇怪的行为,即只有库是静态链接的,函数似乎才起作用。 如果我用dlopen / dlsym等链接到库,代码的function仍然有效,但它不会调用__cyg_profile *函数。 这里有一些代码来快速重现问题: MyLib.h #ifndef __MYLIB_H__ #define __MYLIB_H__ class MyLib { public: void sayHello(); }; #endif MyLib.cpp #include "MyLib.h" #include <iostream> using namespace std; void MyLib::sayHello() { cout<<"Hello"<<endl; } MyLibStub.cpp(到.so的C接口) #include "MyLib.h" extern "C" void LoadMyLib () { MyLib().sayHello(); } Trace.cpp #include <stdio.h> #ifdef __cplusplus extern "C" { void __cyg_profile_func_enter(void […]

在Linux上,为什么析构函数在C ++的全局variables的共享实例上运行两次?

在Linux上,我从一个定义了全局variables的静态库中生成了一些C ++代码。 这个全局variables的一个实例在引用它的符号的两个共享库之间共享。 当进程closures并且运行静态终止阶段时,我看到这个共享实例上的析构函数运行了两次! 据推测,每个图书馆每个卸载。 这个问题与我最近在这里看到的另一个问题密切相关: 相关的问题 。 这听起来像是一样的行为,但没有讨论为什么会发生。 有人知道背后的理论解释吗?

在共享库的构build选项中添加“-rpath,/ usr / lib”会导致段错误

我有一个你好世界计划。 #include <stdio.h> #include <stdlib.h> int main() { printf("hello world! \n"); return 0; } 我在链接阶段的程序-lmicroxml中添加-lmicroxml以链接到库libmicroxml.so 当我启动我的程序时,我得到了一个分段错误。 分段故障与libmicroxml.so的加载有关。 在我的helleo世界计划执行的strace之后: strace ./test execve("./test", ["./test"], [/* 11 vars */]) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x777de000 stat("/etc/ld.so.cache", 0x7f944760) = -1 ENOENT (No such file or directory) open("/lib/libmicroxml.so.1", O_RDONLY) = -1 ENOENT (No such file or […]

在/ usr / local / lib中找不到gcc:链接库,但是/etc/ld/so.conf.d/libc.conf列出了它?

我遇到了共享库和gcc的问题。 起初我无法运行我编译的程序,因为我得到以下错误:加载共享库时的gcc错误。 我做了一些search,发现这是因为无法find共享库。 不过,我已经确定共享库位于/ usr / local / lib,其中AFAICT是共享库的一个常用目录,应该从头开始。 我读过,你可以设置LD_LIBRARY_PATH,这对我工作。 但是,我不希望每次我想运行我的程序设置。 进一步searchbuild议编辑ld.so.conf。 当我看到它时,有以下几点: include /etc/ld.so.conf.d/*.conf 查看ld.so.conf.d目录显示了一系列文件,包括libc.conf。 在这个文件里面是: /usr/local/lib 所以我的问题是,为什么我需要手动设置LD_LIBRARY_PATH当ld.so.conf似乎使用包含/ usr / local / lib的libc.conf? 有什么我在这里丢失,必须先configuration? 编译时有没有选项,我错过了? 我应该注意到,为了编译,我必须指定图书馆的path,我不知道这是否是我的问题或正常行为的症状。 我还应该注意到,当我在其他系统上部署我的软件时,这是我所关心的问题。 我会认为我应该能够把.so放在合适的地方,并且不用搞乱ld.so.conf就可以安装我的程序。 我希望这是这个问题的适当的论坛,我阅读了常见问题,我认为没关系。 干杯。

如何从使用:: dlopen打开的库中获取dynamic加载库的名称?

在Windows中可以使用GetModuleFileName。 那么Linux呢?

抑制共享库的编译时链接

我正在整合一个DRM库,因为安全原因,这个DRM库不能在代码库中保留。 DRM库在运行时只会在安全目标设备上处于清除状态,因此只能在运行时进行链接。 这给编译时链接带来了一个问题。 例如,如果我正在创build依赖DRM库libDrm.so的my_library.so,那么如果我简单地从构build中删除libDrm.so,则“ld:can not find -lDrm”gcc -fPIC -shared -o my_library.so my_library.c -L。 -lDrm 我知道dynamic加载libDrm.so的符号是一个解决scheme,但我不想编写代码在开发的这个阶段做dynamic加载。 我正在寻找快速和肮脏的东西。 我基本上想告诉LD忽略在编译时libDrm.so不能被find的事实,因为LD在运行时能够find它。 我怎样才能做到这一点? 我没有看到LD在编译时需要libDrm.so的原因,如果它在运行时可用,所以我希望LD足够灵活以允许这样做。 我目前正在考虑链接从stubs编译的libDrm.so版本,以使构build成功完成。 在运行时,从真正的实现中创build的libDrm.so版本将被链接到。 任何人都知道一个深奥的链接器选项,我可以使用LD来告诉LD延迟所有有关libDrm.so的链接操作,直到运行时?

在Linux中共享可执行的内存页面?

为了保存空间,是否可以在Linux上共享可执行页面? 我知道有共享的内存API可以用来在不同的进程之间共享内存,但我不认为这是用来做这件事的。 基本上,我想有一个共享内存区域,可以加载一些常用的共享库。 我想让dynamic连接器链接到预加载的(只读)图像,而不是必须将所有的共享库图像加载到每一个进程(这看起来像是浪费)。 这是可能的Linux内核? Darwin内核使用Mach VM的特性(称为commpages) (dyld共享高速caching存储在那里)来实现这一function。 交易是可以访问和分享每个进程之间的。 为了澄清,我知道共享对象(库)是什么。 目前,dynamic连接器在Linux上的作用是将所有必需的库加载到程序的地址空间中,这意味着每个与libc链接的应用程序在其地址空间中都会有一个libc映像。 在Darwin上,可以通过在一组共享内存页面上具有 libc的可执行文件(和其他只读文件)来消除这个问题。 共享图像的可写部分仍然是分开的。 编辑:我知道ELF格式不支持分离共享库的数据和文本段。 我没有使用ELF, 我使用了不同的二进制格式(使用我自己的binfmt内核模块和我自己的dynamic链接器) 。 如果Linux内核支持类似commpage的function,我很感兴趣。 编辑2:我能想到这样做的唯一方法是在内核中分配一大块内存,并将其映射到每个执行的二进制文件中。 第一次执行任何二进制文件时,dynamic连接器可以解除保护,填充所需的数据并保护它。 然后不知何故,内核将不得不确保内存段没有被其他任何东西修改,因为它会打开一个巨大的安全漏洞。 另一个

Linux,单声道,共享库和未解决的符号

我有一个调用另一个共享库(libexif)中的函数的Shim库(共享,C ++),并提供了一个简单的接口,以C#平台调用调用。 (也就是说,C#程序使用PInvoke来调用我的自定义共享库,然后调用另一个共享库。) 在Windows中,当自定义库链接并执行C#应用程序时,我的自定义共享库链接到共享库,所有符号都已parsing。 在Linux上,链接我的共享库不会链接其他共享库。 使用C ++驱动程序时,我指定应用程序链接时的其他库,并在那个时候解决所有符号。 但是,当我尝试从另一个共享库中的C#程序(使用单声道编译)符号调用我的共享库时,则无法parsing。 我试过使用MONO_PATHvariables来指定其他库,但它似乎没有区别。 我也尝试在DLLimport语句中指定未parsing的函数,但似乎没有帮助。 如何指定一个不直接由C#代码调用的共享库,以便mono / cli在运行时find它? 我使用以下命令来构build共享库: g++ -fPIC -g -c -Wall libexif-wrapper.cpp g++ -shared -Wl,-soname,libexif-wrapper.so.1 -o libexif-wrapper.so.1.0.1 libexif-wrapper.o -lc ar rcs libexif-wrapper.a libexif-wrapper.so.1 和下面的命令行来编译我的C#驱动程序: mcs -unsafe -define:LINUX Test-libexif-wrapper.cs 在执行时,我得到一个错误,我的共享库使用的符号没有find: /usr/bin/cli: symbol lookup error: ../../../C/libexif-wrapper/libexif-wrapper/libexif-wrapper.so.1: undefined symbol: exif_data_new_from_file (libexif-wrapper是我的共享库,它用作C#应用程序和libexif之间的一个垫片。) 我一直无法弄清楚如何解决这个问题。 任何build议,将不胜感激。 编辑:要回答这个问题: 你确定可以在LD_LIBRARY_PATH环境variables中find非托pipe的libexif-wrapper吗? 事实上并非如此。 我已经制作了DLLImport中的path,直接指向它。 运行时find它,因为它在上面的错误消息中报告它的path。 此外,缺less的符号不是由C#程序调用的,而是我的共享库中的一个函数调用的函数,然后找不到。 (谢谢 […]