如何从 Android NDK .so 文件中去除符号?
How to strip symbols from Android NDK .so file?
如何从 Android .so
本机代码库中删除符号?
我构建了一个 .so
,在十六进制编辑器中可以清楚地看到数千个符号。 IDA Pro 会根据 executable.
中的符号自动反汇编正确的符号
但是,如果我要求nm
转储符号table,它说有none。 strip
和 objcopy
也没有效果。
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strings.exe libMeow.so | findstr _ZN11SecretClass14SecretFunctionERKS_
_ZN11SecretClass14SecretFunctionERKS_
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-nm.exe libMeow.so
arm-linux-androideabi-nm.exe: libMeow.so: no symbols
C:\AndroidProject.apk\lib\armeabi-v7a>copy /y libMeow.so libMeow-test.so
1 file(s) copied.
C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strip.exe libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strip.exe -g libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so
姓名已更改以保护罪犯。
您可能使用的是 BSD nm 而不是 GNU。尝试 objdump -TC ......
由于.so
是一个动态加载的共享库,它需要有一定数量的外部可用符号。要查看这些,请使用 nm -D libMeow.so
。 Strip 不会删除这些,否则会使库无法使用。
由于有些函数需要从外部加载,不能把所有的动态符号都去掉,那样就没有人可以和.so
交互了。如果您的 .so
是一个 JNI 库,您需要让 JNI 入口点函数在外部可见,而如果它是另一个 .so
链接的共享库,您至少需要 public 图书馆的界面可见。
要隐藏内部符号,您可以阅读https://gcc.gnu.org/wiki/Visibility了解全文。粗略地说,您的选择是:
- 对您不希望在库外显示的每个符号使用
__attribute__ ((visibility ("hidden")))
。 (这可能是相当多的,要找到每一个都需要大量工作。)
- 使用
-fvisibility=hidden
构建,它在每个外部符号上隐式设置它,并在您实际需要导出的符号上添加 __attribute__ ((visibility ("default")))
(可能少得多)
- 使用 "version script" 限制导出到 select 列表的函数。链接时,传
-Wl,-version-script -Wl,mylib.ver
.
对于版本脚本的情况,mylib.ver
应该是这样的:
{ global:
PublicFunction1;
PublicFunction2;
local: *; };
如何从 Android .so
本机代码库中删除符号?
我构建了一个 .so
,在十六进制编辑器中可以清楚地看到数千个符号。 IDA Pro 会根据 executable.
但是,如果我要求nm
转储符号table,它说有none。 strip
和 objcopy
也没有效果。
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strings.exe libMeow.so | findstr _ZN11SecretClass14SecretFunctionERKS_
_ZN11SecretClass14SecretFunctionERKS_
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-nm.exe libMeow.so
arm-linux-androideabi-nm.exe: libMeow.so: no symbols
C:\AndroidProject.apk\lib\armeabi-v7a>copy /y libMeow.so libMeow-test.so
1 file(s) copied.
C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strip.exe libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>arm-linux-androideabi-strip.exe -g libMeow-test.so
C:\AndroidProject.apk\lib\armeabi-v7a>sha1sum libMeow.so libMeow-test.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow.so
0a36701ba44b4cfb31e6f6506349493d5466cd70 *libMeow-test.so
姓名已更改以保护罪犯。
您可能使用的是 BSD nm 而不是 GNU。尝试 objdump -TC ......
由于.so
是一个动态加载的共享库,它需要有一定数量的外部可用符号。要查看这些,请使用 nm -D libMeow.so
。 Strip 不会删除这些,否则会使库无法使用。
由于有些函数需要从外部加载,不能把所有的动态符号都去掉,那样就没有人可以和.so
交互了。如果您的 .so
是一个 JNI 库,您需要让 JNI 入口点函数在外部可见,而如果它是另一个 .so
链接的共享库,您至少需要 public 图书馆的界面可见。
要隐藏内部符号,您可以阅读https://gcc.gnu.org/wiki/Visibility了解全文。粗略地说,您的选择是:
- 对您不希望在库外显示的每个符号使用
__attribute__ ((visibility ("hidden")))
。 (这可能是相当多的,要找到每一个都需要大量工作。) - 使用
-fvisibility=hidden
构建,它在每个外部符号上隐式设置它,并在您实际需要导出的符号上添加__attribute__ ((visibility ("default")))
(可能少得多) - 使用 "version script" 限制导出到 select 列表的函数。链接时,传
-Wl,-version-script -Wl,mylib.ver
.
对于版本脚本的情况,mylib.ver
应该是这样的:
{ global:
PublicFunction1;
PublicFunction2;
local: *; };