【问题标题】:How to load all symbols from shared library on start up?如何在启动时从共享库中加载所有符号?
【发布时间】:2023-03-19 08:32:02
【问题描述】:

美好的一天! 我有一个 fork-on-connect 守护进程。在使用 perf 工具对其进行分析后,我发现函数“do_lookup_x”消耗了大量的 CPU 时间。共享库函数的所有函数调用都在 fork 之后。

有什么方法可以在 fork 之前查找所有符号?

【问题讨论】:

标签: c linux optimization shared-libraries glibc


【解决方案1】:

设置环境变量LD_BIND_NOW 应该有助于实现这一点。

设置为

export LD_BIND_NOW=1

然后执行你的程序。

摘录:

ELF 平台(Linux、Solaris、FreeBSD、HP-UX、IRIX 等)支持 过程地址的惰性绑定,这是一种优化 总体上产生更好的性能,但对于 启动后需要统一性能的应用程序(例如:交易 系统。)当 ELF 应用程序启动时,加载程序(默认情况下) 用一堆修复初始化过程链接表(PLT) 将在每个函数的第一次调用时运行的代码。在 修复调用,函数在虚拟地址空间中的位置 被查找并放入 PLT 中,以便将来调用 函数不需要再次查找。

可能的解决方案:

如果您关心启动后的延迟,可以采取一些措施 做:

Have a "warmup phase" of your application that does a dlsym() lookup on every function;
Use static libraries instead of shared libraries;
Set LD_BIND_NOW=1 and force the loader to do the PLT fixups at startup;
Use the "-z now" option on your linker (if you have it available).

请参阅here 了解全文,here 了解更多信息。

【讨论】:

  • 非常感谢您提供这些信息!我会试试看。不管怎样,读起来很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多