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

时间:2017-06-06 18:51:30

标签: c++ linux gcc strip

在Linux Mint上使用gcc 4.9.2为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,这应该会给我一个干净的发布版本。

这令我感到困惑。

1 个答案:

答案 0 :(得分:3)

您的源代码几乎肯定会调用__FILE__宏 诊断/调试目的。这些调用扩展为源文件路径 无法剥离,因为它们是静态程序数据。

您说您正在制作发布版本。你应该可以 为您的发布版本定义预处理器宏,以消除所有 从编译中调试代码。要么你没有这样做,要么 源代码中的条件编译指令有问题而且无法执行 即使在发布版本中也消除了__FILE__的一些调用。

最有可能的情况是您调用了assert()宏 在您的源代码中,在您的发布版本中未被取消 因为您无法定义预处理器宏NDEBUG。 除非assert()无效,否则会调用__FILE__ - 和assert() 如果您未定义NDEBUG,则不会取消。

如果您的发布可执行文件中确实存在所有不可剥离的路径 由于非无效assert() s,你可以摆脱它们 将-DNDEBUG添加到发布版本的预处理程序标志中。