Как удалить символы из.so файла во время сборки

Я использую VS-Android Framework для компиляции общего объекта Android непосредственно из Microsoft Visual Studio 2012 + Android NDK. Я разобрал свой собственный файл.so с помощью IDA и с ужасом увидел, что весь мой код полностью виден (имена функций, имена буферов данных, имена классов и т. Д.).

Я хочу удалить все эти отладочные и ненужные символы, чтобы было сложно понять мой код, разобрав его.

Процесс компиляции выглядит следующим образом:

  1. У меня есть 10 файлов C++. Каждый компилируется в файл.o
  2. Затем main_service.c компилируется в main.o и связывается со всеми остальными файлами *.o, чтобы получить библиотеку main_service.so.

Я пробовал следующие решения, и они не работали:

  1. Предоставление аргумента -strip-all компилятору и компоновщику. Это не похоже на работу.
  2. После связывания, вызовите objcopy.exe с ключом -strip-all на main_service.o. Это немного уменьшает размер main_serivce.so, но символы остаются
  3. В моем коде C++ я никогда не использую "attribute ((visibility ()))", поэтому, возможно, проблема в том, что компоновщик не может удалить символы, потому что он не знает, что является частным и может быть скрыто, а что - открытым. Я попытался добавить "attribute ((visibility (" default ")))" к функциям в main_service.c, которые я хочу использовать в JNI, и добавил -fvisibility=hidden flags для компилятора и компоновщика. Но я получил предупреждение: атрибут видимости игнорируется [-Wattributes], и символы не удаляются

Что мне здесь не хватает?

Ps - я совершенно новичок в "зачистке символов", так что извините, если мой вопрос немного глуп.

-

1 ответ

Решение

Я нашел способ сделать это.

  1. Я скомпилировал и связал код с g++. Exe (например,arm-linux-androideabi-g++.exe).
  2. Для каждого скомпилированного файла я дал следующие 2 ключа -fvisibility=hidden -s и компилятору и компоновщику. Вам нужны оба переключателя.
  3. Не нужно использовать __attribute visibility совсем.
Другие вопросы по тегам