c++ - 无法从使用 Cmake 创建的可执行文件中删除符号名称

标签 c++ unix cmake obfuscation

我有以下文件

main.cpp:
#include "f.h"

int main(){
    f();
}

f.h:
int f();

f.cpp:
int f(){
    int x=1;
}

首先,我将 f.cpp 编译成目标文件:gcc -c f.cpp -O0 并使用此目标文件编译 main.cpp gcc f.o main.cpp

执行 gdb a.outinfo functions 显示 f()。执行 strip a.out 将其删除。

我想用 Cmake 做同样的事情。我用主目录 fmain 创建了以下目录结构:

f
    build
    src
        f.h
        f.c
        CMakeLists.txt

CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.8)
project(f)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O0")
add_library(f OBJECT
    f.cpp
)

main
    build
    src
        main.cpp
        CMakeLists.txt

CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.8)
project(main)
set(CMAKE_BUILD_TYPE Release)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../f/src
         ${CMAKE_CURRENT_SOURCE_DIR}/../../f/build)
add_executable(main
    main.cpp
    $<TARGET_OBJECTS:f>
)

我先在 f 中运行 cmakemake,然后在 main 中运行。我得到了带有 f()main 可执行文件。但是发出 strip main,甚至 strip -s main 都不会删除符号名称 f()

  1. 如果我使用 Cmake,为什么不删除 strip 符号名称?
  2. 有没有办法使用 Cmake 以相同的方式编译我的文件(来自 f.cpp 的目标文件和主可执行文件之后),并从可执行文件中删除符号名称?

最佳答案

我从未使用过 strip,但根据 this article您可以使用 -s 编译器选项实现相同的效果。您可以尝试将 -s 添加到 CMAKE_CXX_FLAGS_RELEASE。看起来它们可能不是 entirely equivalent虽然。

关于c++ - 无法从使用 Cmake 创建的可执行文件中删除符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430326/

相关文章:

c++ - 更新 CMake(似乎)破坏了我的程序

c++ - 如何使用 typedef 函数指针注册回调

c++ - 错误: “expression must have class type” & “left of must have class/struct/union”

unix - php -v 和 phpinfo() 之间的不同结果

bash - 如何删除unix中特定多个字段中的括号

c++ - 如何让cmake在msys2下使用gnu工具栈(mingw)

c++ - 无法在 C++ 中初始化静态 vector

c++ - 为一个简单的项目返回错误的值

java - 期待冒险

c++ - cmake 与 cl : invalid numeric argument '/Wno-uninitialized'