Как удалить символы из файла Android NDK .so? - PullRequest
0 голосов
/ 01 июня 2018

Как вы удаляете символы из библиотеки нативного кода Android .so?

У меня есть встроенный .so, в котором тысячи символов четко видны в шестнадцатеричном редакторе.IDA Pro автоматически разбирает правильные символы на основе символов в исполняемом файле.

Однако, если я попрошу nm сбросить таблицу символов, он скажет, что их нет.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

Имена были изменены, чтобы защитить виновных.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Поскольку .so является общей библиотекой, которая будет загружаться динамически, ей необходимо иметь некоторое количество символов, доступных извне.Для просмотра используйте nm -D libMeow.so.Strip не удалит их, или это сделает библиотеку непригодной для использования.

Поскольку некоторые функции необходимо загружать извне, вы не можете просто удалить все динамические символы, потому что тогда никто не сможет взаимодействовать с.so.Если ваша .so является библиотекой JNI, вам нужно, чтобы функции точки входа JNI были видны извне, в то время как если это общая библиотека, с которой связывается другая .so, вам необходимо иметь по крайней мере открытый интерфейс вашей библиотеки..

Чтобы скрыть внутренние символы, вы можете прочитать https://gcc.gnu.org/wiki/Visibility для полной истории.Грубо говоря, у вас есть следующие варианты:

  • Используйте __attribute__ ((visibility ("hidden"))) на каждом символе, который вы не хотите видеть за пределами библиотеки.(Это, вероятно, довольно много, и много работы нужно отследить каждый из них.)
  • Сборка с -fvisibility=hidden, которая неявно устанавливает это на каждом внешнем символе, и добавляет __attribute__ ((visibility ("default"))) нате, которые вам действительно нужно экспортировать (вероятно, гораздо меньше)
  • Используйте «скрипт версии», чтобы ограничить, какие функции экспортировать в список выбора.При связывании передайте -Wl,-version-script -Wl,mylib.ver.

В случае сценария версии mylib.ver должно выглядеть следующим образом:

{ global:
PublicFunction1;
PublicFunction2;
local: *; };
0 голосов
/ 01 июня 2018

Возможно, у вас есть BSD nm, а не GNU.Попробуйте objdump -TC ......

...