Reverse engineering 从dlopen()和#x27中丢弃未使用的符号;艾德,那么

Reverse engineering 从dlopen()和#x27中丢弃未使用的符号;艾德,那么,reverse-engineering,dlopen,objdump,objcopy,sprof,Reverse Engineering,Dlopen,Objdump,Objcopy,Sprof,我有一组共享库(英特尔MKL),它们仅以二进制形式分发。顶级“运行时”库,libmkl\u rt.so,链接到我的可执行文件,可以通过ldd看到: ... libmkl_rt.so => /var/task/lib/libmkl_rt.so (0x00007f8049a1f000) ... 但是,其他的库,比如libmkl\u avx.so,我假设是使用dlopen()动态加载的,因为可执行文件抛出一个错误,说如果找不到库,库就会丢失,但使用ldd则不可见 这些库很大(>100MB),这

我有一组共享库(英特尔MKL),它们仅以二进制形式分发。顶级“运行时”库,
libmkl\u rt.so
,链接到我的可执行文件,可以通过
ldd
看到:

...
libmkl_rt.so => /var/task/lib/libmkl_rt.so (0x00007f8049a1f000)
...
但是,其他的库,比如
libmkl\u avx.so
,我假设是使用
dlopen()
动态加载的,因为可执行文件抛出一个错误,说如果找不到库,库就会丢失,但使用
ldd
则不可见

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

我怎样才能:

  • 确定动态加载的共享库中实际使用了哪些符号
  • 仅将这些符号提取到库的“精简”副本中
  • 这有什么工具吗

    确定动态加载的共享库中实际使用了哪些符号

    您可以在
    LD\u DEBUG=bindings LD\u BIND\u NOW=1
    下运行程序,并查看
    libmkl\u avx.so
    中的哪些符号已绑定

    仅将这些符号提取到库的“精简”副本中

    不幸的是,由于无法在可执行文件中重新排列函数的原因,这是不可能的。代码链接后,所有内部GOTO和全局变量位置都是固定的,不能更改。即使正确地分解链接代码(以确定函数边界和调用图)也是一个无法解决的问题(像IDA这样的工具使用启发式方法来缓解它,但问题仍然存在)

    这不应该是一个大问题,因为操作系统将只加载应用程序实际使用的代码页

    确定动态加载的共享库中实际使用了哪些符号

    您可以在
    LD\u DEBUG=bindings LD\u BIND\u NOW=1
    下运行程序,并查看
    libmkl\u avx.so
    中的哪些符号已绑定

    仅将这些符号提取到库的“精简”副本中

    不幸的是,由于无法在可执行文件中重新排列函数的原因,这是不可能的。代码链接后,所有内部GOTO和全局变量位置都是固定的,不能更改。即使正确地分解链接代码(以确定函数边界和调用图)也是一个无法解决的问题(像IDA这样的工具使用启发式方法来缓解它,但问题仍然存在)

    这不应该是一个大问题,因为操作系统将只加载应用程序实际使用的代码页