问题标签 [dynamic-linking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我们应该考虑使用静态链接和动态链接什么?
在选择静态和动态链接之前我们应该注意什么?
gcc - 为什么在 x86_64 上编译静态库时 gcc 不隐式提供 -fPIC 标志
我在编译与静态库静态链接的共享对象时遇到了很多问题。此问题仅出现在 x84_64 平台上。在 x86_32 上进行相同的编译工作时,我没有任何问题。
也许这是特定于操作系统的 GCC 配置,但我的研究表明 GCC 在 x86_64 平台上是如何工作的。无论如何,我在 Ubuntu 10.04 x86_64 上使用 gcc 4.4.3。
问题是如何解决的?...确保所有静态库依赖项都使用 -fPIC 编译。
问题 1: -fpic 和 -fPIC 有什么区别(显然 -fPIC 在 x86 上生成更多指令)?为什么后一种类型在 x86_64 上下文中更相关?
问题 2:我的假设是,当您链接静态代码时,您在链接时将函数硬连接到二进制文件中,为什么它需要“位置无关代码”机制提供的间接级别?
问题 3:现在如果 x86 不需要 -fpic / -fPIC 将共享对象链接到静态档案,为什么 x86_64 需要它?
问题 4:即使需要,为什么不隐式提供?我认为突破性的改变应该是一个很大的禁忌
.net - How should I load assemblies across the application domain boundary to load and unload modules?
I'm aware of the limitations of loading an assembly dynamically during run-time that prevents it from being unloaded. Instead it's been suggested that, if this is a requirement, that I should instead load modules in other application domains and then execute code across the domain boundries.
How can I ease this development process and work with this scenario? What tools or frameworks are available?
c - 将代码/符号修补到动态链接的 ELF 二进制文件中
假设我有一个动态链接的 ELF 二进制文件,并且我想覆盖/重定向某些库调用。LD_PRELOAD
我知道我可以用LD_PRELOAD
.
我想做的是从其他目标文件中添加代码(如果需要,可能在新的部分中)并将这些目标文件中的符号添加到二进制的符号表中,以便使用新添加的代码版本代替共享库代码。我相信这应该是可能的,而无需在现有代码中实际执行任何重定位;即使它们在同一个文件中,它们也应该能够在运行时以通常的 PLT 方式解决(值得我只关心函数,而不关心数据)。
请不要给我“你不想这样做!”这样的回答。或“那不是便携式的!” 我正在研究的是一种将二进制文件与稍微 ABI 不兼容的备用共享库实现连接的方法。如果重要的话,有问题的平台是 i386-linux(即 32 位)。除非我弄错了什么是可能的,否则我可以编写一些工具来解析 ELF 文件并执行我的 hack,但我怀疑有一种奇特的方法可以使用 GNU 链接器和其他工具来完成此任务而无需编写新代码。
.net - C++/CLI + 升压 + 单声道
一般:我有一个符合标准的 C++ API,它使用 Boost 库,我想支持它作为 Windows、OS X 和 Linux 上的本机、静态可链接库,并且我想在 Windows 和 Mono 上为 .NET 包装在 OS X 和 Linux 上。
细节:目前我已经为所有平台本地编译 - 这是使用标准 C++ 和 Boost 之后的。我还让它在 Windows 上为 C++/CLI 编译和运行,但我被迫使用 Boost .DLL。下一步我不确定从哪里开始,因为我从未尝试在 *nix 系统上使用共享库。我知道 Boost 在 Linux 上提供了共享库(我假设在 OS X 上也是如此),但是这些会自动与我的 Visual Studios 编译的 C++/CLI 可执行文件一起工作,还是我需要做一些工作?MonoDevelop 没有 C++/CLI 编译器,但据说 Visual Studios 编译的 CLI 可以正常工作……让我感到困惑的是动态链接库。
c++ - 了解动态链接在 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
事实证明并非如此。
每次库的依赖关系发生变化时,必须重新编译(重新链接)依赖于某个库的每个二进制文件,这似乎很奇怪。我有什么解决方案可以防止这种情况发生?
security - 动态链接不太安全?
我知道静态链接和动态链接之间的区别,这不是另一个要求区别的问题(我已经查看并阅读了它们)。我没有发现任何关于动态链接安全性的问题。
我一直在阅读《Expert C Programming》一书。它有一个很好的链接部分。如果我对它的理解是正确的,那么动态链接的缺点会不会降低安全性?如果程序依赖操作系统来提供稳定且适当的库,那么操作系统上的库就有可能被感染/恶意。没有多少程序可以防止受污染的库。
这是正确的吗?
c++ - 如何减少默认的 C++ 内存消耗?
我有一个用 C++ 编写的服务器应用程序。启动后,它在 x86 Linux(Ubuntu 8.04,GCC 4.2.4)上使用了大约 480 KB 的内存。我认为 480 KB 是过多的内存:服务器甚至还没有做任何事情,没有客户端连接到服务器。(另请参阅下面的评论,我在其中解释了为什么我认为 480 KB 是很多内存。)服务器在初始化期间所做的唯一事情是产生一两个线程,设置一些套接字以及其他简单的事情t 非常占用内存。
请注意,我说的是实际内存使用情况,而不是 VM 大小。我通过在一台闲置的笔记本电脑上启动 100 个服务器实例并在启动服务器实例之前和之后使用“空闲”测量系统内存使用情况来测量它。我已经考虑了文件系统缓存和类似的东西。
经过一些测试后,即使服务器本身没有做任何事情,C++ 运行时中的某些东西也会导致我的服务器使用这么多内存。例如,如果我插入
紧接着
那么每个实例的内存使用量仍然是 410 KB!
我的应用程序仅依赖于 Curl 和 Boost。我有相当多的 C 编程经验,而且我知道 C 库在我使用它们之前不会增加内存消耗。
我发现的其他内容:
- 一个简单的 hello world C 应用程序消耗大约 50 KB 的内存。
- 一个简单的 hello world C 应用程序链接到 Curl,但不使用 Curl,也消耗大约 50 KB 的内存。
- 一个简单的 hello world C++ 应用程序(没有 Boost)消耗大约 100 KB 的内存。
- 一个简单的 hello world C++ 应用程序包含一些 Boost 标头,但实际上并不使用 Boost,它会消耗大约 100 KB 的内存。使用“nm”检查可执行文件时没有 Boost 符号。
因此,我的结论如下:
- Gcc 会丢弃未使用的 Boost 符号。
- 如果我的应用程序使用 Boost,那么 C++ 运行时中的某些东西(可能是动态链接器)会导致它使用大量内存。但是什么?我如何找出这些东西是什么,我能做些什么呢?
我记得几年前关于 C++ 动态链接器问题的一些 KDE 讨论。当时的 Linux C++ 动态链接器导致 KDE C++ 应用程序的启动时间变慢和大量内存消耗。据我所知,这些问题已在 C++ 运行时中得到修复。但是类似的事情可能是我看到的过度内存消耗的原因吗?
非常感谢 gcc/动态链接专家的回答。
对于那些好奇的人,有问题的服务器是 Phusion Passenger 的日志代理:https ://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp
objective-c - 有没有办法按名称获取课程?
在Objective-C中,当您将类的名称作为字符串时,有没有办法获取一个类并向它发送消息?例如,是否有一个函数func
where func(@"NSString") == [NSString class]
?
我想知道这一点的原因是我正在为我正在研究的一种语言构建一个动态链接器库,并且我希望它具有与 Objective-C 库的接口。
c - Linux 上的 OpenGL:dlopen libGL.so
大多数在 Linux 上使用 OpenGL 的应用程序(和库)libGL.so
在运行时使用dlopen
API 加载,而不是动态链接它。
他们为什么这样做呢?
我能想象的唯一原因是,这是因为任何图形驱动程序供应商都提供了不同的libGL
,而两个不同的libGL
可能是 ABI 不兼容的。(嗯,嗯,为什么它们应该是 ABI 不兼容的?即使它们是,为什么通过加载它们dlopen
可以解决这个问题?)
无论如何,如果这样做有充分的理由,我也想这样做。有没有人有一个开源 C/C++ 代码的链接,该代码通过 加载所有 OpenGL 函数dlopen
,我可以将其包含到我的项目中而无需太多调整?