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

Unable to remove symbolic names from executable created with Cmake

本文关键字:可执行文件 删除 符号 创建 Cmake      更新时间:2023-10-16

>我有以下文件

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,但根据本文,您可以使用-s编译器选项实现相同的效果。您可以尝试将-s添加到CMAKE_CXX_FLAGS_RELEASE。不过,它们似乎并不完全等同。