Linux 可执行文件中列出的源文件

Source files listed in Linux executable

本文关键字:源文件 可执行文件 Linux      更新时间:2023-10-16

在 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/filenam‌​e1.cpp.o 
/home/kmort/longPathHere/filename2.cpp -auxbase-strip CMakeFiles/filename2.dir/__/__/__/__/__/longPathHere/filenam‌​e2.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添加到发布版本的预处理器标志。

相关文章: