标签: dynamic-linking

了解动态链接在UNIX上的工作原理

考虑我们有以下情况:

  • 一个名为program动态依赖的程序libfoo.so
  • libfoo.so这取决于什么(好吧,这取决于libstdc++和东西,但我想我们可以省略)

program 运行得很好.

突然,libfoo代码发生了变化,一些函数现在在内部使用func_bar()了另一个库提供的函数libbar.so.

libfoo.so重新编译,现在取决于libbar.so.program保持不变,仍然只取决于libfoo.so.

现在当我执行program它时抱怨他找不到func_bar().

这是我的问题:

  • libfoo.so接口没有改变,只有它的实现.为什么program必须明确地链接libbar.so
  • 依赖树是递归的吗?我会认为,因为libfoo.so依赖libbar.so,libbar.so将自动添加到依赖列表中program,而无需重新编译.但是,ldd program表明情况并非如此.

每当库的依赖性发生变化时,必须重新编译(重新链接)依赖于某个库的每个二进制文件,这似乎很奇怪.我有什么解决方案可以防止这种情况发生?

c++ linux g++ shared-libraries dynamic-linking

25
推荐指数
2
解决办法
5165
查看次数

为什么在64位而非32位平台上绝对需要fPIC?

我最近收到了:

...在创建共享对象时,不能使用"对本地符号"重定位R_X86_64_32; 用-fPIC重新编译

尝试将程序编译为共享库时出错.

现在解决这个问题并不太困难(使用-fPIC重新编译所有依赖项),但经过一些研究后发现这个问题只出现在x86-64平台上.在32位上,任何依赖于位置的代码仍可由动态加载程序重新定位.

我能找到的最佳答案是:

x86支持.text重定位(当你有位置依赖代码时会发生这种情况).这种支持是有代价的,即包含这种重定位的每个页面基本上都不共享,即使它位于共享库中,从而破坏了共享库的概念.因此我们决定在amd64上禁止这个(如果值需要超过32位,它会产生问题,因为所有.text relocs只有'word32'大小)

但我觉得这还不够.如果重定位破坏了共享库的概念,为什么可以在32位平台上完成?此外,如果需要对ELF格式进行更改以支持64位,那么为什么并非所有字段的大小都增加以容纳?

这可能是一个小问题,但它的动机是这样一个事实:a)所讨论的代码是一个科学的代码,如果不必受到性能影响就很好b)这个信息很难在第一名!

[编辑:'答案'

@awoodlands的回答可能是最好的'字面答案',@ iservn 补充了一些很好的信息.

在搜索中找到有关不同类型重定位的更多信息时,我发现了这个并最终发现了x86_64 ABI参考(参见第68页)]

gcc shared-libraries dynamic-linking fpic 32bit-64bit

25
推荐指数
2
解决办法
5799
查看次数

C/C++动态链接如何在不同的平台上运行?

动态链接如何工作?

在Windows(LoadLibrary)上,您需要在运行时调用.dll,但在链接时,您需要提供相应的.lib文件,否则程序将无法链接... .lib文件包含什么?.dll方法的描述?这不是标题包含的内容吗?

相关地,在*nix上,您不需要lib文件...编译器如何知道标头中描述的方法在运行时可用?

作为一个新手,当你想到两个方案中的任何一个,然后另一个,它们都没有意义......

c c++ compilation loadlibrary dynamic-linking

25
推荐指数
3
解决办法
6844
查看次数

g ++:静态和动态库应该以什么顺序链接?

假设我们有一个名为"my_app"的主要可执行文件,它使用了其他几个库:3个库是静态链接的,其他3个是动态链接的.它们应该以哪种顺序与"my_app"相关联?

但这些顺序应该以哪种顺序联系起来?

假设我们得到了依赖于libSB的libSA(如在静态A中),以及依赖于libSB的libSC:

libSA -> libSB -> libSC
Run Code Online (Sandbox Code Playgroud)

和三个动态链接库:libDA -> libDB -> libDC(libDA是基本的,libDC是最高的)

这些顺序应该链接在哪?第一个还是最后一个?

g++ ... -g libSA libSB libSC -lDA -lDB -lDC -o my_app
Run Code Online (Sandbox Code Playgroud)

看起来像现在的顺序,但是这样吗?如果任何动态库与静态库或其他方式之间存在依赖关系,该怎么办?

c++ linker shared-libraries dynamic-linking static-libraries

24
推荐指数
3
解决办法
2万
查看次数

静态链接的可执行文件是否比动态链接的可执行文件更快?

由于动态链接库必须在运行时解析,静态链接的可执行文件是否比动态链接的可执行文件更快?

dll performance linker dynamic-linking static-linking

24
推荐指数
2
解决办法
1万
查看次数

在Java中模拟静态方法调用的静态抽象和动态链接

介绍

作为一个免责声明,我读过为什么静态方法不能在Java中抽象化,即使我恭敬地不同意关于"逻辑矛盾"的公认答案,我也不希望任何答案static abstract只是答案的用处我的问题;)

我有一个类层次结构,表示数据库中的一些表.每个类都继承了一个类,Entity该类包含许多用于访问数据库,创建查询,转义字符等的实用方法.

类的每个实例都是数据库中的一行.

问题

现在,为了尽可能多地分解代码,我想添加有关每个类的相关列和表名的信息.这些信息必须在没有类实例的情况下可访问,并将用于Entity构建查询等.

存储这些数据的显而易见的方法是每个类中的静态方法返回的静态字段.问题是你不能强制类实现这些静态方法,你不能在Java中调用静态方法调用动态链接.

我的解决方案

  1. 使用HashMap或任何类似的数据结构来保存信息.问题:如果缺少信息,则错误将在运行时而不是编译时.
  2. 对实用程序函数使用并行类层次结构,其中可以实例化每个对应的类并使用动态链接.问题:如果该类不存在,代码繁重,运行时错误

这个问题

你将如何应对abstract static抽象方法的缺失和动态链接?

在完美的世界中,如果缺少类的信息并且可以通过使用Entity类轻松访问数据,则给定的解决方案应该生成编译错误.

答案不需要在Java中,C#也可以,如果没有任何语言的特定代码,如何做到这一点的任何见解将受到欢迎.

需要明确的是,除了简单之外,我没有任何要求.没有什么必须是静态的.我只想从中检索表和列名Entity来构建查询.

一些代码

class Entity {
    public static function afunction(Class clazz) { // this parameter is an option
        // here I need to have access to table name of any children of Entity
    }
}

class A extends Entity {
    static String table = "a";
}

class B extends Entity { …
Run Code Online (Sandbox Code Playgroud)

java oop static design-patterns dynamic-linking

23
推荐指数
1
解决办法
1520
查看次数

如何在CMake中更改LD_LIBRARY_PATH?

我有一个本地共享库,它不在$ LD_LIBRARY_PATH中.我想运行我的可执行文件,但由于它无法在系统文件夹中找到共享库,因此在加载共享库时输出"错误".

可能的解决方法是导出包含本地库文件夹的新LD_LIBRARY_PATH.

如何在CMake中自动导出此环境变量?

cmake shared-libraries dynamic-linking

22
推荐指数
2
解决办法
2万
查看次数

函数'dlopen()'是私有API吗?

我想使用函数'dlopen()'在iOS平台上调用动态库,是函数'dlopen()'私有API?

dynamic-linking dlopen dynamic-library ios

21
推荐指数
1
解决办法
1万
查看次数

从Java调用Haskell,动态链接错误重定位

我在编译一个供Java使用的独立库时遇到了麻烦(C++ inbetween).Haskell中有一个程序导出一个处理某些文本并返回它的函数.Haskell中的程序需要一些外部数据(二进制文件).我正在'借助file-embed包编译它' .当我开始编译时:

$ ghc -fPIC -dynamic -c -O --make MyModule.hs
Run Code Online (Sandbox Code Playgroud)

它抛出错误:

MyModule.hs:239:15:
Dynamic linking required, but this is a non-standard build (eg. prof).
You need to build the program twice: once the normal way, and then
in the desired way using -osuf to set the object file suffix.
Run Code Online (Sandbox Code Playgroud)

这是我使用file-embed的地方.

所以我尝试了所提出的方法(编译两次,更改后缀):

$ ghc -fPIC  -c -O --make MyModule.hs
$ ghc -osuf d.o -fPIC -dynamic -c -O --make MyModule.hs
$ javac -cp javacpp.jar MyModule.java
$java -jar javacpp.jar -Dcompiler.path=ghc -Dcompiler.output.prefix="-optc-O3 …
Run Code Online (Sandbox Code Playgroud)

java haskell dynamic dynamic-linking

21
推荐指数
1
解决办法
281
查看次数

是否可以选择GNU ld完全省略-dynamic-linker(PT_INTERP)?

我正在试验Linux上纯静态链接的PIE可执行文件的概念,但是遇到了GNU binutils链接器在使用时坚持在输出二进制文件中添加PT_INTERP头的问题-pie,即使在给出时也是如此-static.有没有办法抑制这种行为?也就是说,有没有办法告诉GNU ld具体不要将某些标题写入输出文件?也许使用链接器脚本?

(请不要回答声称它不起作用;我很清楚该程序仍然需要重定位处理 - 仅由于我的使用而导致的加载地址相对重定位-Bsymbolic- 并且我有特殊的启动代码代替Scrt1.o处理这个问题的标准.但是,如果没有动态链接器已经开始并且正在进行工作,除非PT_INTERP将二进制文件中的标题变为十六进制,否则我无法调用它.)

c dynamic-linking binutils static-linking pie-chart

20
推荐指数
2
解决办法
3779
查看次数