Back to Top

GCC隐藏ELF符号

GCC 默认是将所有符号导出的,如果想隐藏符号,通常有两种做法:

使用version-script

export_symbols 内容

{
    global:
        SceneModule*;
        CreatePhysWorld;
    local: *;
};

Cmake增加

set (CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} "-Wl,--version-script=" ${CMAKE_SOURCE_DIR} "/export_symbols")

存在问题

符号的全名中存在路径信息, 如果需要覆盖进程空间的符号时, 可能会覆盖失败.

使用-fvisibility=hidden

使用编译选项-fvisibility=hidden, 在函数前增加前缀__attribute__ ((visibility ("default")))

不过如果so中有链接静态库, 静态库的仍会导出符号, 可使用以下方式:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -fvisibility=hidden -Wl,--exclude-libs=ALL -ffunction-sections")

本文链接, 未经许可,禁止转载