2017-07-29 49 views
2

根据文档,dlopendlsym一起使用来加载库,并获取指向符号的指针。dlopen vs标准动态链接的用例是什么?

但是,这已经是动态加载器/链接器所做的。此外,这两种方法都基于ld.so

有实际上似乎使用dlopen时是两个区别:

  1. 库可以有条件地加载。
  2. 编译器不知道我们正在使用的符号(类型,原型...),因此不检查潜在的错误。顺便说一句,这是实现自省的一种方式。

但是,这似乎并没有激发了标准装载使用dlopen,除了边缘的例子:

  1. 有条件的装载是不是真的很有趣,在内存占用优化方面当共享库已被其他程序使用:加载已使用的库不会增加内存占用量。
  2. 避免编译器监督是不安全的,也是编写错误的好方法......我们也忽略了潜在的编译器优化。

那么,有没有其他的用途,其中dlopen是首选的标准动态链接/加载?

+4

认为插件和类似的东西。 – Mat

+2

模块化和插件?作为使用新功能动态扩展程序的一种方式。或者作为在运行时检测某些功能的方法,然后加载正确的库来处理(游戏或3D引擎的典型用例)。 –

+0

@Someprogrammerdude这应该是答案。 – yugr

回答

1

那么,有没有其他的用途,其中dlopen优先于标准的动态链接/加载?

典型的用例使用dlopen

  • 插件
  • 选择最佳执行当前CPU(英特尔数学库这样做)
  • 选择实现不同厂商的API(GLEW和其他的OpenGL包装会这样做)
  • 延迟加载共享库,如果它不太可能被使用(这会加速启动,因为库构造函数不会运行+运行时链接呃将有略少的工作要做)

避免编译监管是不安全的,写错误的好办法... 我们还缺少潜在的编译器优化。

确实如此,但您可以通过在延迟加载的共享库周围提供一个小型包装库来获得两全其美的效果。在Windows上,这是通过标准工具完成的(谷歌的“DLL导入库”),在Linux上你可以手工完成或使用Implib.so

1

我在Windows环境中创建了语言切换功能。当我的应用程序启动时,它会检查配置设置应该使用哪个language.dll。从现在起,所有文本都从动态加载的库中加载,甚至可以在运行时更换。我还包括格式化序号(第1,第2,第3),这是语言特定的功能。我的母语的语言资源包含在可执行文件中,所以我不能最终没有任何文本。

关键是可执行文件可以在运行时决定应该加载哪个库。在我的情况下,它是一种语言切换,或者正如评论员所说的那样,像插件目录扫描。

缺乏对呼叫签名的监控显然是一个缺点。如果你真的想做一些邪恶的事情,比如覆盖原型类型定义,你可以用标准C类型转换来实现。

相关问题