Linux 可执行文件中列出的源文件
Source files listed in Linux executable
在 Linux Mint 上使用 gcc 4.9.2 for GNU/Linux 2.6.32 构建的 ELF 64 位 LSB 可执行文件上运行strings
,我看到了
some/path/sourcefile1.cpp
some/path/sourcefile2.cpp
- 等
我不希望生成的可执行文件中的源路径和文件名。我尝试使用strip --strip-all binaryName
删除它们,但路径和文件名仍然存在。
这是用CMake构建的。我给了 CMake 一个-s
标志来传递给编译器,但它似乎对结果没有影响。我不相信二进制文件是用调试符号构建的。我告诉CMake制作一个发布版本。
无论它是如何构建的,我都希望strip
应该能够删除源代码的路径和文件名。
如何从生成的二进制文件中删除此信息?我不在乎可执行文件的大小。
更新:
这是我仍然看到的strings
:
/home/kmort/longPathHere/filename1.cpp -auxbase-strip CMakeFiles/filename2.dir/__/__/__/__/__/longPathHere/filename1.cpp.o
/home/kmort/longPathHere/filename2.cpp -auxbase-strip CMakeFiles/filename2.dir/__/__/__/__/__/longPathHere/filename2.cpp.o
etc
- 有
__FILE__
参考文献。我已经删除了这些。 - 剥离二进制文件后,
objdump --syms
结果为"无符号"。 - 我正在使用
-DNDEBUG
.所有-g
条目都已删除,因此我不进行编译以进行调试。 readelf
只显示我不想在那里的一件事,那就是Library rpath
,我认为我可以消除任何问题。- 虽然我看到了源文件的路径和文件名,但末尾有一个
.o
,这让我认为它来自链接器。 -auxbase-strip
让我认为-fno-compare-debug
应该有所帮助,但事实并非如此。- 在构建之前,我删除了构建文件夹并运行
cmake .. --DCMAKE_BUILD_TYPE=Release
,这应该给我一个干净的发布版本。
这让我感到莫名其妙。
您的源代码几乎肯定会调用 的__FILE__
宏 诊断/调试目的。这些调用扩展到源文件路径 不能剥离,因为它们是静态程序数据。
您说您正在制作发布版本。你应该能够 为发布版本定义预处理器宏,以消除所有 调试编译中的代码。要么你没有这样做,要么 源代码中的条件编译指令有错误,无法 即使在发布版本中,也消除了对__FILE__
的一些调用。
最可能的情况是,您调用了assert()
宏 在发布版本中未作废的源代码中 因为您未能定义预处理器宏NDEBUG
。 除非assert()
无效,否则它会调用__FILE__
- 并assert()
如果不定义NDEBUG
,则不会作废。
如果确实存在发布可执行文件中的所有不可剥离路径 是由于未作废assert()
s,那么您可以摆脱它们 通过将-DNDEBUG
添加到发布版本的预处理器标志。
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何在可执行文件中存储常量数组?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- Linux 可执行文件中列出的源文件
- cmake:如何迭代目录中的所有源文件并将每个文件构建到可执行文件中
- 对于相同的C 源文件,其GCC可执行文件在Windows中比Linux大的655倍.为什么这么大的差异