Как удалить символы из.so файла во время сборки
Я использую VS-Android Framework для компиляции общего объекта Android непосредственно из Microsoft Visual Studio 2012 + Android NDK. Я разобрал свой собственный файл.so с помощью IDA и с ужасом увидел, что весь мой код полностью виден (имена функций, имена буферов данных, имена классов и т. Д.).
Я хочу удалить все эти отладочные и ненужные символы, чтобы было сложно понять мой код, разобрав его.
Процесс компиляции выглядит следующим образом:
- У меня есть 10 файлов C++. Каждый компилируется в файл.o
- Затем main_service.c компилируется в main.o и связывается со всеми остальными файлами *.o, чтобы получить библиотеку main_service.so.
Я пробовал следующие решения, и они не работали:
- Предоставление аргумента -strip-all компилятору и компоновщику. Это не похоже на работу.
- После связывания, вызовите objcopy.exe с ключом -strip-all на main_service.o. Это немного уменьшает размер main_serivce.so, но символы остаются
- В моем коде C++ я никогда не использую "attribute ((visibility ()))", поэтому, возможно, проблема в том, что компоновщик не может удалить символы, потому что он не знает, что является частным и может быть скрыто, а что - открытым. Я попытался добавить "attribute ((visibility (" default ")))" к функциям в main_service.c, которые я хочу использовать в JNI, и добавил -fvisibility=hidden flags для компилятора и компоновщика. Но я получил предупреждение: атрибут видимости игнорируется [-Wattributes], и символы не удаляются
Что мне здесь не хватает?
Ps - я совершенно новичок в "зачистке символов", так что извините, если мой вопрос немного глуп.
-
1 ответ
Решение
Я нашел способ сделать это.
- Я скомпилировал и связал код с g++. Exe (например,
arm-linux-androideabi-g++.exe
). - Для каждого скомпилированного файла я дал следующие 2 ключа
-fvisibility=hidden -s
и компилятору и компоновщику. Вам нужны оба переключателя. - Не нужно использовать
__attribute visibility
совсем.