使用DevEco Studio编译出的so文件如何隐藏符号以及如何启用堆栈保护

使用DevEco Studio编译出的so文件如何隐藏符号以及如何启用堆栈保护

请问编译so时如何隐藏符号,在AndroidStudio中是通过-fvisibility=hidden选项隐藏符号的 另外对应的 这几个选项要如何设置,有人知道吗?

-fvisibility=hidden -O3 -fstack-protector-all

cmake如下:

cmake_minimum_required(VERSION 3.4.1)
project(HarmonyNativeUtil)

set(CMAKE_BUILD_TYPE "Release")

# -fvisibility=hidden:
该选项告诉编译器隐藏所有符号,除非它们被显式导出。

# 提高安全性:隐藏符号可以使攻击者更难以找到和利用代码中的漏洞;减少代码大小:隐藏符号可以减少代码大小,因为编译器不需要为未使用的符号生成代码。

# -O3:
该选项启用最高级别的优化,这些优化可以提高代码性能,但可能会导致代码大小增加。

# -fstack-protector-all:
启用堆栈保护,它是GCC和Clang编译器的一个选项,它可以帮助防止堆栈溢出攻击。它通过在堆栈中插入一些额外的信息来实现,这些信息可以用来检测和阻止攻击。

# -fstack-protector-all可能会导致编译错误或警告。如果您遇到这些问题,请尝试将-fstack-protector-all选项设置为-fstack-protector。

-fstack-protector-all可能会降低性能。

set(CommonFlags "-fvisibility=hidden -O3 -fstack-protector-all")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CommonFlags}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CommonFlags}")

message("构建类型:${CMAKE_BUILD_TYPE}")
message("CMAKE_C_FLAGS参数:${CMAKE_C_FLAGS}")
message("CMAKE_CXX_FLAGS参数:${CMAKE_CXX_FLAGS}")

message("工程源目录:${PROJECT_SOURCE_DIR}")
message("当前CMake路径:${CMAKE_SOURCE_DIR}")

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include)

4 回复

so文件隐藏符号操作如下:

set(CMAKE_CXX_VISIBILITY_PRESET hidden)

set(CMAKE_C_VISIBILITY_PRESET hidden)

set(CMAKE_SHARED_LIBRARY_VISIBILITY_PRESET hidden)

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")

在build-profile.json5文件 arguments 项中添加如下参数。

{
  "buildOption": {
    "externalNativeOptions": {
      "arguments": "-DCMAKE_BUILD_TYPE=Release"
    }
  }
}

试试


这个应该只是CMake的配置问题,回答隐藏符号问题:

CMake配置

# 隐藏c++导出符号,如果是c函数换成CMAKE_C_VISIBILITY_PRESET
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)

其他配置可以查下CMake的配置文档

在DevEco Studio中编译出的so文件隐藏符号可以通过修改编译选项实现。在build.gradle文件中,添加-fvisibility=hiddencppFlags中,示例如下:

externalNativeBuild {
    cmake {
        cppFlags "-fvisibility=hidden"
    }
}

启用堆栈保护可以通过在CMakeLists.txt中添加-fstack-protector-strong编译选项实现,示例如下:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong")

这些操作会在编译过程中隐藏符号并启用堆栈保护。

在DevEco Studio中隐藏.so文件的符号,可以在build.gradle中配置CMake,添加-fvisibility=hidden编译选项,隐藏不必要的符号。启用堆栈保护,可以在CMakeLists.txt中添加-fstack-protector-strong编译选项,增强堆栈保护。具体配置如下:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fstack-protector-strong")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fstack-protector-strong")

这样可以有效隐藏符号并启用堆栈保护。

回到顶部