如何更改预建共享库的名称,以便可执行文件可以与新名称链接?

问题描述 投票:0回答:1

我已经预先构建了共享库(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]
android linux linker shared-libraries dynamic-linking
1个回答
0
投票

首先您需要了解

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

应该做你想做的事。

© www.soinside.com 2019 - 2024. All rights reserved.