【问题标题】:How to replace the usage of LD_PRELOAD with dlopen()?如何用 dlopen() 替换 LD_PRELOAD 的用法?
【发布时间】:2013-02-20 12:33:26
【问题描述】:

我正在使用共享库使用 c++。

目前我正在使用“LD_PRELOAD”并使用 setenv() 设置此环境变量 打电话。
但我想使用 dlopen() API 来加载共享库。这应该与使用 setenv() 设置环境变量(即 LD_PRELOAD)相同。

我可以使用 dlopen() 来达到上述要求吗?还是使用 LD_PRELOAD 和 dlopen() 加载库有区别?

【问题讨论】:

  • 我对此不是 100% 确定,但也许 dlopen() 的 RTLD_GLOBAL 标志会满足您的需求?

标签: c++ linux shared-libraries


【解决方案1】:

我对此不是 100% 确定,但据我了解,使用 LD_PRELOAD 会使程序加载器首先加载所有库,然后是 LD_PRELOAD 指定的库,最后是您的应用程序。这样就可以用您自己的系统库覆盖系统库。

使用dlopen在你的程序加载后加载共享对象,所以不能用来覆盖系统对象。

如果必须设置环境变量以使程序正常工作,则必须在加载程序之前设置它,无论是在 shell 中还是通过您的 LD_PRELOAD 文件。如果程序不需要立即使用环境变量,那么您可以在程序中设置它,也可以在dlopen 加载的共享对象的“on-load”函数中设置它。

【讨论】:

  • 据我了解这是正确的,所以如果有人有不同的看法,我会很感兴趣。
猜你喜欢
  • 2016-10-14
  • 2015-04-25
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2011-06-09
  • 1970-01-01
相关资源
最近更新 更多