我已经预先构建了共享库(libssl.so),在链接到我的可执行文件之前我需要重命名为不同的名称(
wpa_supplicant
)。
原因:我不希望其他可执行文件加载此库(因为它有一些自定义代码)
我无法修改 Android.mk 中 libssl.so 的构建规则,因为我既不拥有该代码,也无法构建它。
我尝试编写一个 Android.bp 文件来包含这个具有不同名称(mylibssl.so)的预构建库,并使用这个新名称作为我的可执行文件(wpa_supplicant)的 LOCAL_SHARED_LIBRARIES
但是当我检查可执行文件的依赖项时(使用
readelf -d wpa_supplicant
),它仍然指向 libssl.so
0x0000000000000001 (NEEDED) Shared library: [libssl.so]
当我们从共享库的构建中间体中打开相应的so.toc文件时,我们看到SONAME仍然是原始共享库的名称,而不是重命名的共享库文件名。
0x000000000000000e (SONAME) Library soname: [libssl.so]
首先您需要了解
SONAME
如何传播。
共享库可以有一个
SONAME
(在链接共享库本身时由链接器烘焙到其中),它可能与共享库本身的名称不同。
当可执行文件链接到例如
libfoo.so
具有 SONAME
libbar.so
,链接器会添加一个值为 NEEDED
的 libbar.so
条目(无论库本身的名称是什么)。
由于您无法重建
libssl.so
来更新其SONAME
,因此您必须通过其他方法更改
SONAME
。
幸运的是,有一个工具可以使这变得微不足道:
mv libssl.so mylibssl.so
patchelf --set-soname mylibssl.so mylibssl.so
应该做你想做的事。