【发布时间】:2017-11-10 07:37:22
【问题描述】:
我有一组仅以二进制形式分发的共享库 (Intel MKL)。一个顶级“运行时”库libmkl_rt.so,链接到我的可执行文件,并通过ldd 可见:
...
libmkl_rt.so => /var/task/lib/libmkl_rt.so (0x00007f8049a1f000)
...
但是,其他的,比如libmkl_avx.so,我假设是用dlopen()动态加载的,因为可执行文件会抛出一个错误,说如果找不到库就丢失了,但是用ldd看不到。
这些库很大(> 100MB),这是我的容器中唯一使用它们的可执行文件。我假设可执行文件没有调用这些库中的每个函数,所以我想精简它们,首先确定正在调用哪些函数,然后只保留这些函数。
我该怎么做:
- 确定实际使用了动态加载的共享库中的哪些符号?
- 仅将这些符号提取到库的“精简”副本中?
有什么工具可以解决这个问题吗?
【问题讨论】:
标签: reverse-engineering dlopen objdump objcopy sprof