草庐IT

c - 仅在满足依赖关系时才加载共享库

我有一个链接到两个共享库的可执行文件,每个共享库都依赖于系统共享库。(在这种情况下,这些是OpenCL和CUDA运行时库,但这不会影响问题)+-->libA.so--->libOpenCL.so(onsystem)Exe-|+-->libB.so--->libcudart.so(onsystem)Exe,以及libA.so和libB.so分发给用户。用户可能没有libOpenCL.so和/或libcudart.so安装在他们的系统上。目标是Exe无论如何都应该能够启动,并在运行时检测到,例如libA.so无法加载,因为不满足其依赖项。一种可能性是使libA.so使用dlopen()在运

linux - execve如何调用动态链接器/加载器(ld-linux.so.2)

我用gcc编译链接了最基本的C程序,test.c:intmain(){}正如预期的那样,输出是一个动态链接的可执行文件:$filetesttest:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.26,BuildID[sha1]=0x0f806c099f74132a158d98aebde4639ae0998971,notstripped运行strace给出以下输出:$strace-f./testexecve("./test",["./test"]

linux - execve如何调用动态链接器/加载器(ld-linux.so.2)

我用gcc编译链接了最基本的C程序,test.c:intmain(){}正如预期的那样,输出是一个动态链接的可执行文件:$filetesttest:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.26,BuildID[sha1]=0x0f806c099f74132a158d98aebde4639ae0998971,notstripped运行strace给出以下输出:$strace-f./testexecve("./test",["./test"]

windows - 是否可以替换 OS 的 Loader?有什么办法可以控制Loader?

我只是想知道是否可以替换操作系统(Windows是我的选择)的加载器(可执行程序加载器而不是引导加载器)。是否有任何第三方加载器可以修补默认加载器。有什么方法可以获得对OSLoader的控制权?我的意思是,我希望它正在做的事情对我来说是可见的(每一步)。如果你问我为什么要这样做,出于学习目的。 最佳答案 不可以,ntdll中的进程创建和用户态加载器是捆绑在一起的(PsCreateProcess会直接映射到ntdll中并跳转到它来完成解析模块和设置进程),你不能替换它。 关于windows

windows - 是否可以替换 OS 的 Loader?有什么办法可以控制Loader?

我只是想知道是否可以替换操作系统(Windows是我的选择)的加载器(可执行程序加载器而不是引导加载器)。是否有任何第三方加载器可以修补默认加载器。有什么方法可以获得对OSLoader的控制权?我的意思是,我希望它正在做的事情对我来说是可见的(每一步)。如果你问我为什么要这样做,出于学习目的。 最佳答案 不可以,ntdll中的进程创建和用户态加载器是捆绑在一起的(PsCreateProcess会直接映射到ntdll中并跳转到它来完成解析模块和设置进程),你不能替换它。 关于windows

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 - 如何限制对共享对象中符号的访问?

我有一个共享库(bar.so)形式的插件,它链接到一个更大的程序(foo)。foo和bar.so都依赖于同一个第三方库(baz),但它们需要将baz的实现完全分开。因此,当我链接foo(使用提供的目标文件和存档)时,我需要它忽略bar.so中对baz的任何使用,反之亦然。现在,如果我将foo与--trace-symbol=baz_fun链接,其中baz_fun是有问题的符号之一,我将得到以下输出:bar.so:definitionofbaz_funfoo/src.a(baz.o):referencetobaz_fun我相信这告诉我foo正在从bar.so引用baz_fun(并且foo的

linux - 如何限制对共享对象中符号的访问?

我有一个共享库(bar.so)形式的插件,它链接到一个更大的程序(foo)。foo和bar.so都依赖于同一个第三方库(baz),但它们需要将baz的实现完全分开。因此,当我链接foo(使用提供的目标文件和存档)时,我需要它忽略bar.so中对baz的任何使用,反之亦然。现在,如果我将foo与--trace-symbol=baz_fun链接,其中baz_fun是有问题的符号之一,我将得到以下输出:bar.so:definitionofbaz_funfoo/src.a(baz.o):referencetobaz_fun我相信这告诉我foo正在从bar.so引用baz_fun(并且foo的

c - 链接到多个共享库,这些共享库都链接到一个公共(public)静态库

假设您有2个共享库,lib1.so和lib2.so,它们都静态链接了libcommon.a。如果您要动态链接lib1.so和lib2.so,编译器会提示符号引用不明确吗?或者编译器是否足够聪明,知道libcommon符号在lib1和lib2之间共享,并允许您针对两者动态链接? 最佳答案 不会有冲突,因为当您链接到共享库时,链接器将使用第一个提供符号的共享库的定义,而不会进一步查看其他共享库。.a中包含的符号将导出到两个共享库中,但不会发生冲突。 关于c-链接到多个共享库,这些共享库都链接