无法从使用 Cmake 创建的可执行文件中删除符号名称
Unable to remove symbolic names from executable created with Cmake
>我有以下文件
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.out
,info functions
显示f()
。执行strip a.out
会将其删除。
我想用Cmake做同样的事情。我创建了以下目录结构,主目录f
和main
:
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
年跑了cmake
,make
第一,之后在main
年。我得到了带有f()
的main
可执行文件。但是,发布strip main
,甚至strip -s main
并不能删除符号名称f()
。
- 如果我使用 Cmake,为什么不删除
strip
符号名称? - 有没有办法使用 Cmake 以相同的方式编译我的文件(来自 f.cpp 的目标文件以及该主可执行文件之后(,并从可执行文件中删除符号名称?
我从未使用过strip,但根据本文,您可以使用-s
编译器选项实现相同的效果。您可以尝试将-s
添加到CMAKE_CXX_FLAGS_RELEASE
。不过,它们似乎并不完全等同。
相关文章:
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 如何在 VSCODE 中构建、运行和删除可执行文件和虚拟文件
- 隐藏或删除不需要的字符串从 Windows 可执行文件版本中
- 从 GCC 可执行文件中删除符号和 RTTI 文本
- 无法从使用 Cmake 创建的可执行文件中删除符号名称
- 为什么可执行文件这么大?(为什么没有删除死代码?
- 从Makefile中的c可执行文件中删除硬编码的路径
- 是否有可能调试最初由可执行文件生成的已删除符号的核心文件?
- 是否有理由不从可执行文件中删除符号?