Tag: 共享库

什么时候gcc __attribute __((构造函数))运行?

假设我有一个带有GCC构造函数的libA.so。 我的程序“程序”依赖于libA.so,所以当我运行它时,libA.so被打开并且它的构造函数被执行。 现在,我还有一个模块libC.so,它也依赖于libA。 我运行dlopen(“libC.so”) , 加载libC,并根据我的实验,也执行libA的构造函数 。 依赖关系看起来像这样: libA有构造函数 libB也有一个构造函数 libC依赖于libA和libB 程序取决于libA 程序通过dlopen()链接libC 现在,当我运行程序时: libA的构造函数在main()启动之前运行 libB的构造函数由dlopen()运行 显然,当它们被加载到内存中时,dlopen会执行库的构造函数。 这是在某处指定的,链接器如何检查哪些库已经加载? (为什么我要问:在一个场合,我有一个构造函数在一些不完全理解的情况下被执行了两次。我是否正确地假设这完全被打破并且在正常情况下不应该发生?)

如何编写C .so库来替换现有的C ++ .so库?

让我解释一下这个场景。 我们有一个遗留的C ++编译的.so库。 此库中的函数使用extern “c” {} ,因此C和C ++程序都可以使用该库,并且由于某种原因,它是使用–static-libgcc选项创建的。 这个旧图书馆很旧,很难维护。 现在我们已经设法编写了它的替代,但是用C语言编写。 假设旧库名为libfoo.so(旧),新库名为libfoo.so(新)。 对于给定的bar.o,它可以与旧的或新的libfoo.so链接以创建可执行文件,例如bar.exe。 但是bar.exe只能在它之前链接的同一个.so库中运行,换句话说,这两个库是不可互换的。 编辑#1 :我创建了一个名为libfoo.so的符号链接,指向libfoo.so(旧)或libfoo.so(新)。 此符号链接libfoo.so在运行时位于LD_LIBRARY_PATH中。 编辑#2 :当我将bar.o与旧的libfoo.so链接并生成bar.exe时,如果我使用新的libfoo.so运行此bar.exe,则会报告undefined symbols错误。 通过nm这两个libfoo.so,我可以在旧的符号中找到这些符号,但不能在新的符号中找到。 这些符号类似于_ZSt4cerr ,它是一个C ++ lib损坏的名称(我虽然它是由–static-libgcc引入的),当然新的libfoo.so不包含那些符号。 编辑#3 :如果我只是使用g ++而不是gcc编译和链接C代码,它是否有意义? 我该如何实现呢? 编辑#4 :今天我设法使用g ++(使用静态libgcc,静态libstdc ++)编译/链接新的C编程libfoo,这可能导致所有c ++符号都包含在libfoo.so中。 这可以使一切运行顺利,但不是我真正想要的。

如何从GNU / Linux中的可执行文件导出特定符号

在通过::dlopen()加载动态库时,可以通过-rdynamic选项从可执行文件导出符号,但它会导出可执行文件的所有符号,从而导致更大的二进制文件大小。 有没有办法只导出特定的function? 例如,我有testlib.cpp和main.cpp如下: testlib.cpp extern void func_export(int i); extern “C” void func_test(void) { func_export(4); } main.cpp中 #include #include void func_export(int i) { ::fprintf(stderr, “%s: %d\n”, __func__, i); } void func_not_export(int i) { ::fprintf(stderr, “%s: %d\n”, __func__, i); } typedef void (*void_func)(void); int main(void) { void* handle = NULL; void_func func = NULL; handle = ::dlopen(“./libtestlib.so”, […]

如何编译Linux C程序在另一台Linux机器上运行?

我使用VPS来托管我的网站,但是没有安装gcc软件包。 libc.so.6映射到libc-2.12.so,这是我的问题,因为在我的家用计算机上,库被映射到libc-2.15.so 有时,我需要在VPS上运行一些程序,所以当我编译C源时,我使用-static选项包含在可执行文件中,一切都是需要的。 该程序工作正常,但令我困扰的是,可执行文件大约800 Kb。 如果我在不使用-static选项的情况下进行编译,则可执行文件大约为80 Kb,但它在VOS上不起作用。 有没有人知道任何其他解决方案,而不使用-static选项,以便可执行文件更小? 非常感谢你。

在C中创建有效的共享库

我正在做一些测试来学习如何创建共享库。 Code :: Blocks中共享库的模板就是这个 LIBRARY.C // The functions contained in this file are pretty dummy // and are included only as a placeholder. Nevertheless, // they *will* get included in the shared library if you // don’t remove them 🙂 // // Obviously, you ‘ll have to write yourself the super-duper // functions to include […]

如何将本机库加载到本机android代码? (AndroidStudio)

我在文件夹jniLibs / your_architecture / mylib.so中有一个名为mylib的库 在Java中,要加载库,您只需在源代码中键入该代码: static { System.loadLibrary(“mylib”); } 但是如何在本机C代码中加载库(在Android Studio中)? 我补充说库不使用JNI约定,它是一个普通的共享库。

当main.c不使用pthreads时,为什么必须在main.c编译中显式链接到pthreads?

在Linux中,我有一个使用pthreads的共享库和没有的。 libpthread.so显示在我的共享库的ldd中,这是正确的。 $ ldd libmapreduce.so.1.0 linux-gate.so.1 => (0x0067d000) libpthread.so.0 => /lib/libpthread.so.0 (0x0058c000) […] 但是当我编译并链接不使用pthreads的main.c到我的共享库时,我看到: $ icc -Wall -o main main.c -lmapreduce /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork’ 将-lpthread添加到我的编译命令,即 $ icc -Wall -o main main.c -lmapreduce -lpthread 解析未定义的引用。 当我的main.c不使用它并且我的共享库已经链接了libpthread时,为什么我需要显式链接到libpthread?

库在os x上编译libuv?

我正在尝试学习一些libuv,似乎有一本很棒的书可以通过它。 但是,这本书没有解释如何实际编译它。 我在github上提取的代码上运行make,并使用github( https://github.com/joyent/libuv )中描述的GYP编译。 但是我不确定我需要包含哪些库才能获得编译代码。 我试着编译这段代码: /* first.c */ #include #include int main() { uv_loop_t *loop = uv_loop_new(); printf(“Now quitting.\n”); uv_run(loop, UV_RUN_DEFAULT); return 0; } 我使用libuv文件夹中的以下命令编译它: gcc -o first first.c build/Release/libuv.a 我得到了以下缺少的符号: Undefined symbols for architecture x86_64: “_CFArrayCreate”, referenced from: _uv__fsevents_init in libuv.a(fsevents.o) “_CFRunLoopAddSource”, referenced from: _uv__cf_loop_runner in libuv.a(darwin.o) “_CFRunLoopGetCurrent”, referenced from: _uv__cf_loop_runner in […]

符号版本和dlsym

我使用dlopen在我的程序中加载pthread库,并使用dlsym处理程序提取到pthread_create和pthread_join 。 如何确保两个处理程序都是兼容版本? 我不在乎这些符号是新版本还是旧版本。 我只是希望无论使用什么pthread_create我都能使用pthread_join 。 我知道有一个dlvsym ,我可以传递显式版本号,但我不关心确切的版本号,因为我希望我的代码独立于库版本。

制作一个64位共享库,动态链接到Mac OS X Snow Leopard上的32位库

更新:经过一些阅读后,我发现这个问题非常普遍,你不能在同一个过程中混合架构,所以64位Java不能dlopen()像FMOD这样的32位库。 有没有可能的解决方法,请记住我正在编写自己的COD接口到FMOD库? 我需要在Max OS X上创建64位dylib,因为Java Native Access只喜欢64位计算机上的64位库。 问题是,我的C源代码动态地包含FMOD,在Mac上只提供32位dylib。 当我尝试编译时没有-m32选项(因为我必须输出64位dylib)我得到以下错误: gcc -dynamiclib -std=c99 -pedantic -Wall -O3 -fPIC -pthread -o ../bin/libpenntotalrecall_fmod.dylib ../../src/libpenntotalrecall_fmod.c -lfmodex -L../../lib/osx/ ld: warning: in /usr/lib/libfmodex.dylib, missing required architecture x86_64 in file Undefined symbols: “_FMOD_System_CreateSound”, referenced from: _startPlayback in ccJnlwrd.o “_FMOD_Channel_GetPosition”, referenced from: _streamPosition in ccJnlwrd.o “_FMOD_System_Create”, referenced from: _startPlayback in ccJnlwrd.o “_FMOD_System_PlaySound”, referenced from: […]