问题标签 [sprof]

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.

0 投票
1 回答
74 浏览

reverse-engineering - 从 dlopen()'ed .so 中丢弃未使用的符号

我有一组仅以二进制形式分发的共享库(英特尔 MKL)。一个顶级“运行时”库libmkl_rt.so,链接到我的可执行文件,并且通过以下方式可见ldd

但是,其他的,例如libmkl_avx.so,我假设是用 动态加载的dlopen(),因为可执行文件会抛出一个错误,指出如果找不到库就丢失了,但是用ldd.

这些库很大(> 100MB),这是我的容器中唯一使用它们的可执行文件。我假设可执行文件没有调用这些库中的每个函数,所以我想精简它们,首先确定正在调用哪些函数,然后只保留这些函数。

我怎样才能:

  1. 确定动态加载的共享库中实际使用了哪些符号?
  2. 仅将这些符号提取到库的“超薄”副本中?

有什么工具可以做到这一点吗?